AudioDumpInterface.cpp revision 64cca04dcbf4e21a51131224b9d0f0c596f876d4
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) { 38f01215993dda68b6b52111d754bd0c7c2d5bcfa3Dima Zavin LOGE("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