1f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin/* //device/servers/AudioFlinger/AudioDumpInterface.cpp
2f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
3f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Copyright 2008, The Android Open Source Project
4f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
5f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Licensed under the Apache License, Version 2.0 (the "License");
6f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** you may not use this file except in compliance with the License.
7f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** You may obtain a copy of the License at
8f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
9f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**     http://www.apache.org/licenses/LICENSE-2.0
10f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin**
11f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** Unless required by applicable law or agreed to in writing, software
12f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** distributed under the License is distributed on an "AS IS" BASIS,
13f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** See the License for the specific language governing permissions and
15f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin** limitations under the License.
16f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin*/
17f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
18f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#define LOG_TAG "AudioFlingerDump"
19f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin//#define LOG_NDEBUG 0
20f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
21f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <stdint.h>
22f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <sys/types.h>
23f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <utils/Log.h>
24f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
25f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <stdlib.h>
26f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include <unistd.h>
27f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
28f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin#include "AudioDumpInterface.h"
29f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
30f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinnamespace android {
31f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
32f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
33f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
34f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioDumpInterface::AudioDumpInterface(AudioHardwareInterface* hw)
35f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    : mPolicyCommands(String8("")), mFileName(String8(""))
36f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
37f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if(hw == 0) {
385efbd421e0029d6fc44b1cc65c0e5e0d85e5161fSteve Block        ALOGE("Dump construct hw = 0");
39f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
40f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mFinalInterface = hw;
416a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("Constructor %p, mFinalInterface %p", this, mFinalInterface);
42f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
43f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
44f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
45f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioDumpInterface::~AudioDumpInterface()
46f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
47f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    for (size_t i = 0; i < mOutputs.size(); i++) {
48f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        closeOutputStream((AudioStreamOut *)mOutputs[i]);
49f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
50f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
51f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    for (size_t i = 0; i < mInputs.size(); i++) {
52f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        closeInputStream((AudioStreamIn *)mInputs[i]);
53f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
54f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
55f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if(mFinalInterface) delete mFinalInterface;
56f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
57f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
58f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
59f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamOut* AudioDumpInterface::openOutputStream(
60f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, status_t *status)
61f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
62f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamOut* outFinal = NULL;
63f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int lFormat = AudioSystem::PCM_16_BIT;
64f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t lChannels = AudioSystem::CHANNEL_OUT_STEREO;
65f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t lRate = 44100;
66f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
67f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
68f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    outFinal = mFinalInterface->openOutputStream(devices, format, channels, sampleRate, status);
69f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (outFinal != 0) {
70f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lFormat = outFinal->format();
71f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lChannels = outFinal->channels();
72f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lRate = outFinal->sampleRate();
73f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    } else {
74f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (format != 0) {
75f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*format != 0) {
76f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lFormat = *format;
77f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
78f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *format = lFormat;
79f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
80f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
81f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (channels != 0) {
82f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*channels != 0) {
83f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lChannels = *channels;
84f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
85f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *channels = lChannels;
86f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
87f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
88f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (sampleRate != 0) {
89f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*sampleRate != 0) {
90f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lRate = *sampleRate;
91f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
92f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *sampleRate = lRate;
93f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
94f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
95f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (status) *status = NO_ERROR;
96f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
976a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("openOutputStream(), outFinal %p", outFinal);
98f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
99f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamOutDump *dumOutput = new AudioStreamOutDump(this, mOutputs.size(), outFinal,
100f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            devices, lFormat, lChannels, lRate);
101f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mOutputs.add(dumOutput);
102f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
103f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return dumOutput;
104f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
105f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
106f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioDumpInterface::closeOutputStream(AudioStreamOut* out)
107f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
108f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamOutDump *dumpOut = (AudioStreamOutDump *)out;
109f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
110f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mOutputs.indexOf(dumpOut) < 0) {
11164cca04dcbf4e21a51131224b9d0f0c596f876d4Steve Block        ALOGW("Attempt to close invalid output stream");
112f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return;
113f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
114f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
1156a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("closeOutputStream() output %p", out);
116f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
117f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    dumpOut->standby();
118f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (dumpOut->finalStream() != NULL) {
119f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mFinalInterface->closeOutputStream(dumpOut->finalStream());
120f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
121f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
122f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mOutputs.remove(dumpOut);
123f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    delete dumpOut;
124f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
125f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
126f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamIn* AudioDumpInterface::openInputStream(uint32_t devices, int *format, uint32_t *channels,
127f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        uint32_t *sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics)
128f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
129f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamIn* inFinal = NULL;
130f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int lFormat = AudioSystem::PCM_16_BIT;
131f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t lChannels = AudioSystem::CHANNEL_IN_MONO;
132f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    uint32_t lRate = 8000;
133f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
134f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    inFinal = mFinalInterface->openInputStream(devices, format, channels, sampleRate, status, acoustics);
135f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (inFinal != 0) {
136f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lFormat = inFinal->format();
137f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lChannels = inFinal->channels();
138f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        lRate = inFinal->sampleRate();
139f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    } else {
140f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (format != 0) {
141f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*format != 0) {
142f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lFormat = *format;
143f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
144f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *format = lFormat;
145f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
146f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
147f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (channels != 0) {
148f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*channels != 0) {
149f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lChannels = *channels;
150f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
151f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *channels = lChannels;
152f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
153f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
154f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (sampleRate != 0) {
155f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (*sampleRate != 0) {
156f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                lRate = *sampleRate;
157f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
158f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                *sampleRate = lRate;
159f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
160f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
161f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (status) *status = NO_ERROR;
162f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
1636a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("openInputStream(), inFinal %p", inFinal);
164f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
165f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamInDump *dumInput = new AudioStreamInDump(this, mInputs.size(), inFinal,
166f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            devices, lFormat, lChannels, lRate);
167f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mInputs.add(dumInput);
168f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
169f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return dumInput;
170f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
171f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioDumpInterface::closeInputStream(AudioStreamIn* in)
172f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
173f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioStreamInDump *dumpIn = (AudioStreamInDump *)in;
174f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
175f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mInputs.indexOf(dumpIn) < 0) {
17664cca04dcbf4e21a51131224b9d0f0c596f876d4Steve Block        ALOGW("Attempt to close invalid input stream");
177f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return;
178f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
179f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    dumpIn->standby();
180f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (dumpIn->finalStream() != NULL) {
181f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mFinalInterface->closeInputStream(dumpIn->finalStream());
182f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
183f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
184f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    mInputs.remove(dumpIn);
185f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    delete dumpIn;
186f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
187f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
188f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
189f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioDumpInterface::setParameters(const String8& keyValuePairs)
190f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
191f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keyValuePairs);
192f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    String8 value;
193f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int valueInt;
1946a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("setParameters %s", keyValuePairs.string());
195f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
196f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.get(String8("test_cmd_file_name"), value) == NO_ERROR) {
197f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mFileName = value;
198f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        param.remove(String8("test_cmd_file_name"));
199f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
200f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.get(String8("test_cmd_policy"), value) == NO_ERROR) {
201f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        Mutex::Autolock _l(mLock);
202f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        param.remove(String8("test_cmd_policy"));
203f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mPolicyCommands = param.toString();
2046a70518b93928d1c91457ff805e375c82d76b0e5Steve Block        ALOGV("test_cmd_policy command %s written", mPolicyCommands.string());
205f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return NO_ERROR;
206f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
207f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
208f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalInterface != 0 ) return mFinalInterface->setParameters(keyValuePairs);
209f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
210f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
211f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
212f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioDumpInterface::getParameters(const String8& keys)
213f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
214f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keys);
215f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter response;
216f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    String8 value;
217f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
2186a70518b93928d1c91457ff805e375c82d76b0e5Steve Block//    ALOGV("getParameters %s", keys.string());
219f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.get(String8("test_cmd_policy"), value) == NO_ERROR) {
220f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        Mutex::Autolock _l(mLock);
221f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (mPolicyCommands.length() != 0) {
222f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            response = AudioParameter(mPolicyCommands);
223f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            response.addInt(String8("test_cmd_policy"), 1);
224f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        } else {
225f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            response.addInt(String8("test_cmd_policy"), 0);
226f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
227f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        param.remove(String8("test_cmd_policy"));
2286a70518b93928d1c91457ff805e375c82d76b0e5Steve Block//        ALOGV("test_cmd_policy command %s read", mPolicyCommands.string());
229f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
230f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
231f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.get(String8("test_cmd_file_name"), value) == NO_ERROR) {
232f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        response.add(String8("test_cmd_file_name"), mFileName);
233f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        param.remove(String8("test_cmd_file_name"));
234f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
235f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
236f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    String8 keyValuePairs = response.toString();
237f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
238f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.size() && mFinalInterface != 0 ) {
239f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        keyValuePairs += ";";
240f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        keyValuePairs += mFinalInterface->getParameters(param.toString());
241f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
242f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
243f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return keyValuePairs;
244f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
245f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
246f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioDumpInterface::setMode(int mode)
247f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
248f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mFinalInterface->setMode(mode);
249f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
250f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
251f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinsize_t AudioDumpInterface::getInputBufferSize(uint32_t sampleRate, int format, int channelCount)
252f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
253f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mFinalInterface->getInputBufferSize(sampleRate, format, channelCount);
254f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
255f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
256f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
257f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
258f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamOutDump::AudioStreamOutDump(AudioDumpInterface *interface,
259f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        int id,
260f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        AudioStreamOut* finalStream,
261f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t devices,
262f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        int format,
263f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t channels,
264f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t sampleRate)
265f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    : mInterface(interface), mId(id),
266f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin      mSampleRate(sampleRate), mFormat(format), mChannels(channels), mLatency(0), mDevice(devices),
267f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin      mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0)
268f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
2696a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamOutDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream);
270f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
271f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
272f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
273f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamOutDump::~AudioStreamOutDump()
274f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
2756a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamOutDump destructor");
276f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Close();
277f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
278f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
279f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinssize_t AudioStreamOutDump::write(const void* buffer, size_t bytes)
280f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
281f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    ssize_t ret;
282f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
283f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream) {
284f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        ret = mFinalStream->write(buffer, bytes);
285f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    } else {
286f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000);
287f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        ret = bytes;
288f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
289f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if(!mFile) {
290f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (mInterface->fileName() != "") {
291f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            char name[255];
292f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            sprintf(name, "%s_out_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount);
293f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            mFile = fopen(name, "wb");
2946a70518b93928d1c91457ff805e375c82d76b0e5Steve Block            ALOGV("Opening dump file %s, fh %p", name, mFile);
295f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
296f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
297f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFile) {
298f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        fwrite(buffer, bytes, 1, mFile);
299f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
300f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return ret;
301f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
302f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
303f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutDump::standby()
304f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
3056a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamOutDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream);
306f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
307f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Close();
308f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->standby();
309f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
310f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
311f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
312f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinuint32_t AudioStreamOutDump::sampleRate() const
313f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
314f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->sampleRate();
315f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mSampleRate;
316f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
317f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
318f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinsize_t AudioStreamOutDump::bufferSize() const
319f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
320f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->bufferSize();
321f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mBufferSize;
322f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
323f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
324f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinuint32_t AudioStreamOutDump::channels() const
325f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
326f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->channels();
327f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mChannels;
328f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
329f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinint AudioStreamOutDump::format() const
330f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
331f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->format();
332f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mFormat;
333f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
334f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinuint32_t AudioStreamOutDump::latency() const
335f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
336f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->latency();
337f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return 0;
338f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
339f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutDump::setVolume(float left, float right)
340f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
341f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->setVolume(left, right);
342f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
343f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
344f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutDump::setParameters(const String8& keyValuePairs)
345f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
3466a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamOutDump::setParameters %s", keyValuePairs.string());
347f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
348f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) {
349f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        return mFinalStream->setParameters(keyValuePairs);
350f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
351f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
352f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keyValuePairs);
353f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    String8 value;
354f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    int valueInt;
355f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    status_t status = NO_ERROR;
356f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
357f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.getInt(String8("set_id"), valueInt) == NO_ERROR) {
358f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mId = valueInt;
359f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
360f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
361f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.getInt(String8("format"), valueInt) == NO_ERROR) {
362f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (mFile == 0) {
363f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            mFormat = valueInt;
364f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        } else {
365f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            status = INVALID_OPERATION;
366f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
367f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
368f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.getInt(String8("channels"), valueInt) == NO_ERROR) {
369f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (valueInt == AudioSystem::CHANNEL_OUT_STEREO || valueInt == AudioSystem::CHANNEL_OUT_MONO) {
370f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            mChannels = valueInt;
371f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        } else {
372f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            status = BAD_VALUE;
373f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
374f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
375f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) {
376f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (valueInt > 0 && valueInt <= 48000) {
377f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (mFile == 0) {
378f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                mSampleRate = valueInt;
379f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
380f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                status = INVALID_OPERATION;
381f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
382f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        } else {
383f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            status = BAD_VALUE;
384f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
385f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
386f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return status;
387f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
388f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
389f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioStreamOutDump::getParameters(const String8& keys)
390f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
391f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->getParameters(keys);
392f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
393f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keys);
394f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return param.toString();
395f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
396f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
397f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutDump::dump(int fd, const Vector<String16>& args)
398f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
399f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->dump(fd, args);
400f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
401f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
402f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
403f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioStreamOutDump::Close()
404f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
405f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if(mFile) {
406f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        fclose(mFile);
407f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mFile = 0;
408f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
409f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
410f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
411f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamOutDump::getRenderPosition(uint32_t *dspFrames)
412f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
413f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->getRenderPosition(dspFrames);
414f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return INVALID_OPERATION;
415f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
416f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
417f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin// ----------------------------------------------------------------------------
418f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
419f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamInDump::AudioStreamInDump(AudioDumpInterface *interface,
420f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        int id,
421f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        AudioStreamIn* finalStream,
422f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t devices,
423f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        int format,
424f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t channels,
425f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                                        uint32_t sampleRate)
426f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    : mInterface(interface), mId(id),
427f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin      mSampleRate(sampleRate), mFormat(format), mChannels(channels), mDevice(devices),
428f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin      mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0)
429f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
4306a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamInDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream);
431f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
432f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
433f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
434f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinAudioStreamInDump::~AudioStreamInDump()
435f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
436f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Close();
437f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
438f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
439f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes)
440f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
441f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    ssize_t ret;
442f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
443f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream) {
444f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        ret = mFinalStream->read(buffer, bytes);
445f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if(!mFile) {
446f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (mInterface->fileName() != "") {
447f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                char name[255];
448f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                sprintf(name, "%s_in_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount);
449f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                mFile = fopen(name, "wb");
4506a70518b93928d1c91457ff805e375c82d76b0e5Steve Block                ALOGV("Opening input dump file %s, fh %p", name, mFile);
451f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
452f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
453f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (mFile) {
454f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            fwrite(buffer, bytes, 1, mFile);
455f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
456f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    } else {
457f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000);
458f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        ret = bytes;
459f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if(!mFile) {
460f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            char name[255];
461f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            strcpy(name, "/sdcard/music/sine440");
462f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (channels() == AudioSystem::CHANNEL_IN_MONO) {
463f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_mo");
464f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
465f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_st");
466f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
467f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (format() == AudioSystem::PCM_16_BIT) {
468f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_16b");
469f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
470f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_8b");
471f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
472f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (sampleRate() < 16000) {
473f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_8k");
474f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else if (sampleRate() < 32000) {
475f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_22k");
476f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else if (sampleRate() < 48000) {
477f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_44k");
478f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            } else {
479f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                strcat(name, "_48k");
480f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
481f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            strcat(name, ".wav");
482f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            mFile = fopen(name, "rb");
4836a70518b93928d1c91457ff805e375c82d76b0e5Steve Block            ALOGV("Opening input read file %s, fh %p", name, mFile);
484f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (mFile) {
485f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET);
486f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
487f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
488f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        if (mFile) {
489f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            ssize_t bytesRead = fread(buffer, bytes, 1, mFile);
490f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            if (bytesRead >=0 && bytesRead < bytes) {
491f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET);
492f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin                fread((uint8_t *)buffer+bytesRead, bytes-bytesRead, 1, mFile);
493f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin            }
494f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        }
495f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
496f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
497f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return ret;
498f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
499f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
500f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInDump::standby()
501f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
5026a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamInDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream);
503f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
504f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    Close();
505f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->standby();
506f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
507f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
508f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
509f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInDump::setGain(float gain)
510f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
511f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->setGain(gain);
512f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
513f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
514f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
515f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinuint32_t AudioStreamInDump::sampleRate() const
516f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
517f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->sampleRate();
518f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mSampleRate;
519f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
520f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
521f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinsize_t AudioStreamInDump::bufferSize() const
522f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
523f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->bufferSize();
524f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mBufferSize;
525f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
526f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
527f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinuint32_t AudioStreamInDump::channels() const
528f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
529f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->channels();
530f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mChannels;
531f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
532f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
533f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinint AudioStreamInDump::format() const
534f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
535f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->format();
536f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return mFormat;
537f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
538f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
539f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInDump::setParameters(const String8& keyValuePairs)
540f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
5416a70518b93928d1c91457ff805e375c82d76b0e5Steve Block    ALOGV("AudioStreamInDump::setParameters()");
542f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->setParameters(keyValuePairs);
543f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
544f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
545f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
546f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima ZavinString8 AudioStreamInDump::getParameters(const String8& keys)
547f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
548f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->getParameters(keys);
549f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
550f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    AudioParameter param = AudioParameter(keys);
551f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return param.toString();
552f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
553f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
554f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinunsigned int AudioStreamInDump::getInputFramesLost() const
555f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
556f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->getInputFramesLost();
557f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return 0;
558f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
559f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
560f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinstatus_t AudioStreamInDump::dump(int fd, const Vector<String16>& args)
561f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
562f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if (mFinalStream != 0 ) return mFinalStream->dump(fd, args);
563f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    return NO_ERROR;
564f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
565f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin
566f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavinvoid AudioStreamInDump::Close()
567f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin{
568f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    if(mFile) {
569f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        fclose(mFile);
570f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin        mFile = 0;
571f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin    }
572f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}
573f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin}; // namespace android
574