Loading libs/audioflinger/AudioDumpInterface.cpp +131 −89 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ namespace android { // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- AudioDumpInterface::AudioDumpInterface(AudioHardwareInterface* hw) AudioDumpInterface::AudioDumpInterface(AudioHardwareInterface* hw) : mFirstHwOutput(true), mPolicyCommands(String8("")), mFileName(String8("")) : mPolicyCommands(String8("")), mFileName(String8("")) { { if(hw == 0) { if(hw == 0) { LOGE("Dump construct hw = 0"); LOGE("Dump construct hw = 0"); Loading @@ -47,6 +47,11 @@ AudioDumpInterface::~AudioDumpInterface() for (size_t i = 0; i < mOutputs.size(); i++) { for (size_t i = 0; i < mOutputs.size(); i++) { closeOutputStream((AudioStreamOut *)mOutputs[i]); closeOutputStream((AudioStreamOut *)mOutputs[i]); } } for (size_t i = 0; i < mInputs.size(); i++) { closeInputStream((AudioStreamIn *)mInputs[i]); } if(mFinalInterface) delete mFinalInterface; if(mFinalInterface) delete mFinalInterface; } } Loading @@ -60,31 +65,32 @@ AudioStreamOut* AudioDumpInterface::openOutputStream( uint32_t lRate = 44100; uint32_t lRate = 44100; if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)devices) || mFirstHwOutput) { outFinal = mFinalInterface->openOutputStream(devices, format, channels, sampleRate, status); outFinal = mFinalInterface->openOutputStream(devices, format, channels, sampleRate, status); if (outFinal != 0) { if (outFinal != 0) { lFormat = outFinal->format(); lFormat = outFinal->format(); lChannels = outFinal->channels(); lChannels = outFinal->channels(); lRate = outFinal->sampleRate(); lRate = outFinal->sampleRate(); if (!AudioSystem::isA2dpDevice((AudioSystem::audio_devices)devices)) { mFirstHwOutput = false; } } } else { } else { if (format != 0 && *format != 0) { if (format != 0) { if (*format != 0) { lFormat = *format; lFormat = *format; } else { } else { lFormat = AudioSystem::PCM_16_BIT; *format = lFormat; } } } if (channels != 0 && *channels != 0) { if (channels != 0) { if (*channels != 0) { lChannels = *channels; lChannels = *channels; } else { } else { lChannels = AudioSystem::CHANNEL_OUT_STEREO; *channels = lChannels; } } if (sampleRate != 0 && *sampleRate != 0) { } if (sampleRate != 0) { if (*sampleRate != 0) { lRate = *sampleRate; lRate = *sampleRate; } else { } else { lRate = 44100; *sampleRate = lRate; } } } if (status) *status = NO_ERROR; if (status) *status = NO_ERROR; } } Loading @@ -111,7 +117,6 @@ void AudioDumpInterface::closeOutputStream(AudioStreamOut* out) dumpOut->standby(); dumpOut->standby(); if (dumpOut->finalStream() != NULL) { if (dumpOut->finalStream() != NULL) { mFinalInterface->closeOutputStream(dumpOut->finalStream()); mFinalInterface->closeOutputStream(dumpOut->finalStream()); mFirstHwOutput = true; } } mOutputs.remove(dumpOut); mOutputs.remove(dumpOut); Loading @@ -126,18 +131,33 @@ AudioStreamIn* AudioDumpInterface::openInputStream(uint32_t devices, int *format uint32_t lChannels = AudioSystem::CHANNEL_IN_MONO; uint32_t lChannels = AudioSystem::CHANNEL_IN_MONO; uint32_t lRate = 8000; uint32_t lRate = 8000; if (mInputs.size() == 0) { inFinal = mFinalInterface->openInputStream(devices, format, channels, sampleRate, status, acoustics); inFinal = mFinalInterface->openInputStream(devices, format, channels, sampleRate, status, acoustics); if (inFinal == 0) return 0; if (inFinal != 0) { lFormat = inFinal->format(); lFormat = inFinal->format(); lChannels = inFinal->channels(); lChannels = inFinal->channels(); lRate = inFinal->sampleRate(); lRate = inFinal->sampleRate(); } else { } else { if (format != 0 && *format != 0) lFormat = *format; if (format != 0) { if (channels != 0 && *channels != 0) lChannels = *channels; if (*format != 0) { if (sampleRate != 0 && *sampleRate != 0) lRate = *sampleRate; lFormat = *format; } else { *format = lFormat; } } if (channels != 0) { if (*channels != 0) { lChannels = *channels; } else { *channels = lChannels; } } if (sampleRate != 0) { if (*sampleRate != 0) { lRate = *sampleRate; } else { *sampleRate = lRate; } } if (status) *status = NO_ERROR; if (status) *status = NO_ERROR; } } LOGV("openInputStream(), inFinal %p", inFinal); LOGV("openInputStream(), inFinal %p", inFinal); Loading Loading @@ -223,6 +243,15 @@ String8 AudioDumpInterface::getParameters(const String8& keys) return keyValuePairs; return keyValuePairs; } } status_t AudioDumpInterface::setMode(int mode) { return mFinalInterface->setMode(mode); } size_t AudioDumpInterface::getInputBufferSize(uint32_t sampleRate, int format, int channelCount) { return mFinalInterface->getInputBufferSize(sampleRate, format, channelCount); } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- Loading @@ -235,7 +264,7 @@ AudioStreamOutDump::AudioStreamOutDump(AudioDumpInterface *interface, uint32_t sampleRate) uint32_t sampleRate) : mInterface(interface), mId(id), : mInterface(interface), mId(id), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mLatency(0), mDevice(devices), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mLatency(0), mDevice(devices), mBufferSize(1024), mFinalStream(finalStream), mOutFile(0), mFileCount(0) mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0) { { LOGV("AudioStreamOutDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); LOGV("AudioStreamOutDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); } } Loading @@ -254,26 +283,26 @@ ssize_t AudioStreamOutDump::write(const void* buffer, size_t bytes) if (mFinalStream) { if (mFinalStream) { ret = mFinalStream->write(buffer, bytes); ret = mFinalStream->write(buffer, bytes); } else { } else { usleep((bytes * 1000000) / frameSize() / sampleRate()); usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000); ret = bytes; ret = bytes; } } if(!mOutFile) { if(!mFile) { if (mInterface->fileName() != "") { if (mInterface->fileName() != "") { char name[255]; char name[255]; sprintf(name, "%s_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); sprintf(name, "%s_out_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); mOutFile = fopen(name, "wb"); mFile = fopen(name, "wb"); LOGV("Opening dump file %s, fh %p", name, mOutFile); LOGV("Opening dump file %s, fh %p", name, mFile); } } } } if (mOutFile) { if (mFile) { fwrite(buffer, bytes, 1, mOutFile); fwrite(buffer, bytes, 1, mFile); } } return ret; return ret; } } status_t AudioStreamOutDump::standby() status_t AudioStreamOutDump::standby() { { LOGV("AudioStreamOutDump standby(), mOutFile %p, mFinalStream %p", mOutFile, mFinalStream); LOGV("AudioStreamOutDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream); Close(); Close(); if (mFinalStream != 0 ) return mFinalStream->standby(); if (mFinalStream != 0 ) return mFinalStream->standby(); Loading Loading @@ -330,7 +359,7 @@ status_t AudioStreamOutDump::setParameters(const String8& keyValuePairs) } } if (param.getInt(String8("format"), valueInt) == NO_ERROR) { if (param.getInt(String8("format"), valueInt) == NO_ERROR) { if (mOutFile == 0) { if (mFile == 0) { mFormat = valueInt; mFormat = valueInt; } else { } else { status = INVALID_OPERATION; status = INVALID_OPERATION; Loading @@ -345,7 +374,7 @@ status_t AudioStreamOutDump::setParameters(const String8& keyValuePairs) } } if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) { if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) { if (valueInt > 0 && valueInt <= 48000) { if (valueInt > 0 && valueInt <= 48000) { if (mOutFile == 0) { if (mFile == 0) { mSampleRate = valueInt; mSampleRate = valueInt; } else { } else { status = INVALID_OPERATION; status = INVALID_OPERATION; Loading Loading @@ -373,9 +402,9 @@ status_t AudioStreamOutDump::dump(int fd, const Vector<String16>& args) void AudioStreamOutDump::Close() void AudioStreamOutDump::Close() { { if(mOutFile) { if(mFile) { fclose(mOutFile); fclose(mFile); mOutFile = 0; mFile = 0; } } } } Loading @@ -396,7 +425,7 @@ AudioStreamInDump::AudioStreamInDump(AudioDumpInterface *interface, uint32_t sampleRate) uint32_t sampleRate) : mInterface(interface), mId(id), : mInterface(interface), mId(id), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mDevice(devices), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mDevice(devices), mBufferSize(1024), mFinalStream(finalStream), mInFile(0) mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0) { { LOGV("AudioStreamInDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); LOGV("AudioStreamInDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); } } Loading @@ -409,13 +438,25 @@ AudioStreamInDump::~AudioStreamInDump() ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) { { ssize_t ret; if (mFinalStream) { if (mFinalStream) { return mFinalStream->read(buffer, bytes); ret = mFinalStream->read(buffer, bytes); if(!mFile) { if (mInterface->fileName() != "") { char name[255]; sprintf(name, "%s_in_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); mFile = fopen(name, "wb"); LOGV("Opening input dump file %s, fh %p", name, mFile); } } } usleep((bytes * 1000000) / frameSize() / sampleRate()); if (mFile) { fwrite(buffer, bytes, 1, mFile); if(!mInFile) { } } else { usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000); ret = bytes; if(!mFile) { char name[255]; char name[255]; strcpy(name, "/sdcard/music/sine440"); strcpy(name, "/sdcard/music/sine440"); if (channels() == AudioSystem::CHANNEL_IN_MONO) { if (channels() == AudioSystem::CHANNEL_IN_MONO) { Loading @@ -438,26 +479,27 @@ ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) strcat(name, "_48k"); strcat(name, "_48k"); } } strcat(name, ".wav"); strcat(name, ".wav"); mInFile = fopen(name, "rb"); mFile = fopen(name, "rb"); LOGV("Opening dump file %s, fh %p", name, mInFile); LOGV("Opening input read file %s, fh %p", name, mFile); if (mInFile) { if (mFile) { fseek(mInFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); } } } } if (mInFile) { if (mFile) { ssize_t bytesRead = fread(buffer, bytes, 1, mInFile); ssize_t bytesRead = fread(buffer, bytes, 1, mFile); if (bytesRead != bytes) { if (bytesRead >=0 && bytesRead < bytes) { fseek(mInFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fread((uint8_t *)buffer+bytesRead, bytes-bytesRead, 1, mInFile); fread((uint8_t *)buffer+bytesRead, bytes-bytesRead, 1, mFile); } } } } } return bytes; return ret; } } status_t AudioStreamInDump::standby() status_t AudioStreamInDump::standby() { { LOGV("AudioStreamInDump standby(), mInFile %p, mFinalStream %p", mInFile, mFinalStream); LOGV("AudioStreamInDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream); Close(); Close(); if (mFinalStream != 0 ) return mFinalStream->standby(); if (mFinalStream != 0 ) return mFinalStream->standby(); Loading Loading @@ -523,9 +565,9 @@ status_t AudioStreamInDump::dump(int fd, const Vector<String16>& args) void AudioStreamInDump::Close() void AudioStreamInDump::Close() { { if(mInFile) { if(mFile) { fclose(mInFile); fclose(mFile); mInFile = 0; mFile = 0; } } } } }; // namespace android }; // namespace android libs/audioflinger/AudioDumpInterface.h +8 −4 Original line number Original line Diff line number Diff line Loading @@ -69,7 +69,7 @@ private: uint32_t mDevice; // current device this output is routed to uint32_t mDevice; // current device this output is routed to size_t mBufferSize; size_t mBufferSize; AudioStreamOut *mFinalStream; AudioStreamOut *mFinalStream; FILE *mOutFile; // output file FILE *mFile; // output file int mFileCount; int mFileCount; }; }; Loading Loading @@ -109,7 +109,8 @@ private: uint32_t mDevice; // current device this output is routed to uint32_t mDevice; // current device this output is routed to size_t mBufferSize; size_t mBufferSize; AudioStreamIn *mFinalStream; AudioStreamIn *mFinalStream; FILE *mInFile; // output file FILE *mFile; // output file int mFileCount; }; }; class AudioDumpInterface : public AudioHardwareBase class AudioDumpInterface : public AudioHardwareBase Loading @@ -134,6 +135,8 @@ public: virtual status_t setMasterVolume(float volume) virtual status_t setMasterVolume(float volume) {return mFinalInterface->setMasterVolume(volume);} {return mFinalInterface->setMasterVolume(volume);} virtual status_t setMode(int mode); // mic mute // mic mute virtual status_t setMicMute(bool state) virtual status_t setMicMute(bool state) {return mFinalInterface->setMicMute(state);} {return mFinalInterface->setMicMute(state);} Loading @@ -143,6 +146,8 @@ public: virtual status_t setParameters(const String8& keyValuePairs); virtual status_t setParameters(const String8& keyValuePairs); virtual String8 getParameters(const String8& keys); virtual String8 getParameters(const String8& keys); virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); virtual AudioStreamIn* openInputStream(uint32_t devices, int *format, uint32_t *channels, virtual AudioStreamIn* openInputStream(uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics); uint32_t *sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics); virtual void closeInputStream(AudioStreamIn* in); virtual void closeInputStream(AudioStreamIn* in); Loading @@ -154,7 +159,6 @@ protected: AudioHardwareInterface *mFinalInterface; AudioHardwareInterface *mFinalInterface; SortedVector<AudioStreamOutDump *> mOutputs; SortedVector<AudioStreamOutDump *> mOutputs; bool mFirstHwOutput; SortedVector<AudioStreamInDump *> mInputs; SortedVector<AudioStreamInDump *> mInputs; Mutex mLock; Mutex mLock; String8 mPolicyCommands; String8 mPolicyCommands; Loading Loading
libs/audioflinger/AudioDumpInterface.cpp +131 −89 Original line number Original line Diff line number Diff line Loading @@ -32,7 +32,7 @@ namespace android { // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- AudioDumpInterface::AudioDumpInterface(AudioHardwareInterface* hw) AudioDumpInterface::AudioDumpInterface(AudioHardwareInterface* hw) : mFirstHwOutput(true), mPolicyCommands(String8("")), mFileName(String8("")) : mPolicyCommands(String8("")), mFileName(String8("")) { { if(hw == 0) { if(hw == 0) { LOGE("Dump construct hw = 0"); LOGE("Dump construct hw = 0"); Loading @@ -47,6 +47,11 @@ AudioDumpInterface::~AudioDumpInterface() for (size_t i = 0; i < mOutputs.size(); i++) { for (size_t i = 0; i < mOutputs.size(); i++) { closeOutputStream((AudioStreamOut *)mOutputs[i]); closeOutputStream((AudioStreamOut *)mOutputs[i]); } } for (size_t i = 0; i < mInputs.size(); i++) { closeInputStream((AudioStreamIn *)mInputs[i]); } if(mFinalInterface) delete mFinalInterface; if(mFinalInterface) delete mFinalInterface; } } Loading @@ -60,31 +65,32 @@ AudioStreamOut* AudioDumpInterface::openOutputStream( uint32_t lRate = 44100; uint32_t lRate = 44100; if (AudioSystem::isA2dpDevice((AudioSystem::audio_devices)devices) || mFirstHwOutput) { outFinal = mFinalInterface->openOutputStream(devices, format, channels, sampleRate, status); outFinal = mFinalInterface->openOutputStream(devices, format, channels, sampleRate, status); if (outFinal != 0) { if (outFinal != 0) { lFormat = outFinal->format(); lFormat = outFinal->format(); lChannels = outFinal->channels(); lChannels = outFinal->channels(); lRate = outFinal->sampleRate(); lRate = outFinal->sampleRate(); if (!AudioSystem::isA2dpDevice((AudioSystem::audio_devices)devices)) { mFirstHwOutput = false; } } } else { } else { if (format != 0 && *format != 0) { if (format != 0) { if (*format != 0) { lFormat = *format; lFormat = *format; } else { } else { lFormat = AudioSystem::PCM_16_BIT; *format = lFormat; } } } if (channels != 0 && *channels != 0) { if (channels != 0) { if (*channels != 0) { lChannels = *channels; lChannels = *channels; } else { } else { lChannels = AudioSystem::CHANNEL_OUT_STEREO; *channels = lChannels; } } if (sampleRate != 0 && *sampleRate != 0) { } if (sampleRate != 0) { if (*sampleRate != 0) { lRate = *sampleRate; lRate = *sampleRate; } else { } else { lRate = 44100; *sampleRate = lRate; } } } if (status) *status = NO_ERROR; if (status) *status = NO_ERROR; } } Loading @@ -111,7 +117,6 @@ void AudioDumpInterface::closeOutputStream(AudioStreamOut* out) dumpOut->standby(); dumpOut->standby(); if (dumpOut->finalStream() != NULL) { if (dumpOut->finalStream() != NULL) { mFinalInterface->closeOutputStream(dumpOut->finalStream()); mFinalInterface->closeOutputStream(dumpOut->finalStream()); mFirstHwOutput = true; } } mOutputs.remove(dumpOut); mOutputs.remove(dumpOut); Loading @@ -126,18 +131,33 @@ AudioStreamIn* AudioDumpInterface::openInputStream(uint32_t devices, int *format uint32_t lChannels = AudioSystem::CHANNEL_IN_MONO; uint32_t lChannels = AudioSystem::CHANNEL_IN_MONO; uint32_t lRate = 8000; uint32_t lRate = 8000; if (mInputs.size() == 0) { inFinal = mFinalInterface->openInputStream(devices, format, channels, sampleRate, status, acoustics); inFinal = mFinalInterface->openInputStream(devices, format, channels, sampleRate, status, acoustics); if (inFinal == 0) return 0; if (inFinal != 0) { lFormat = inFinal->format(); lFormat = inFinal->format(); lChannels = inFinal->channels(); lChannels = inFinal->channels(); lRate = inFinal->sampleRate(); lRate = inFinal->sampleRate(); } else { } else { if (format != 0 && *format != 0) lFormat = *format; if (format != 0) { if (channels != 0 && *channels != 0) lChannels = *channels; if (*format != 0) { if (sampleRate != 0 && *sampleRate != 0) lRate = *sampleRate; lFormat = *format; } else { *format = lFormat; } } if (channels != 0) { if (*channels != 0) { lChannels = *channels; } else { *channels = lChannels; } } if (sampleRate != 0) { if (*sampleRate != 0) { lRate = *sampleRate; } else { *sampleRate = lRate; } } if (status) *status = NO_ERROR; if (status) *status = NO_ERROR; } } LOGV("openInputStream(), inFinal %p", inFinal); LOGV("openInputStream(), inFinal %p", inFinal); Loading Loading @@ -223,6 +243,15 @@ String8 AudioDumpInterface::getParameters(const String8& keys) return keyValuePairs; return keyValuePairs; } } status_t AudioDumpInterface::setMode(int mode) { return mFinalInterface->setMode(mode); } size_t AudioDumpInterface::getInputBufferSize(uint32_t sampleRate, int format, int channelCount) { return mFinalInterface->getInputBufferSize(sampleRate, format, channelCount); } // ---------------------------------------------------------------------------- // ---------------------------------------------------------------------------- Loading @@ -235,7 +264,7 @@ AudioStreamOutDump::AudioStreamOutDump(AudioDumpInterface *interface, uint32_t sampleRate) uint32_t sampleRate) : mInterface(interface), mId(id), : mInterface(interface), mId(id), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mLatency(0), mDevice(devices), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mLatency(0), mDevice(devices), mBufferSize(1024), mFinalStream(finalStream), mOutFile(0), mFileCount(0) mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0) { { LOGV("AudioStreamOutDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); LOGV("AudioStreamOutDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); } } Loading @@ -254,26 +283,26 @@ ssize_t AudioStreamOutDump::write(const void* buffer, size_t bytes) if (mFinalStream) { if (mFinalStream) { ret = mFinalStream->write(buffer, bytes); ret = mFinalStream->write(buffer, bytes); } else { } else { usleep((bytes * 1000000) / frameSize() / sampleRate()); usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000); ret = bytes; ret = bytes; } } if(!mOutFile) { if(!mFile) { if (mInterface->fileName() != "") { if (mInterface->fileName() != "") { char name[255]; char name[255]; sprintf(name, "%s_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); sprintf(name, "%s_out_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); mOutFile = fopen(name, "wb"); mFile = fopen(name, "wb"); LOGV("Opening dump file %s, fh %p", name, mOutFile); LOGV("Opening dump file %s, fh %p", name, mFile); } } } } if (mOutFile) { if (mFile) { fwrite(buffer, bytes, 1, mOutFile); fwrite(buffer, bytes, 1, mFile); } } return ret; return ret; } } status_t AudioStreamOutDump::standby() status_t AudioStreamOutDump::standby() { { LOGV("AudioStreamOutDump standby(), mOutFile %p, mFinalStream %p", mOutFile, mFinalStream); LOGV("AudioStreamOutDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream); Close(); Close(); if (mFinalStream != 0 ) return mFinalStream->standby(); if (mFinalStream != 0 ) return mFinalStream->standby(); Loading Loading @@ -330,7 +359,7 @@ status_t AudioStreamOutDump::setParameters(const String8& keyValuePairs) } } if (param.getInt(String8("format"), valueInt) == NO_ERROR) { if (param.getInt(String8("format"), valueInt) == NO_ERROR) { if (mOutFile == 0) { if (mFile == 0) { mFormat = valueInt; mFormat = valueInt; } else { } else { status = INVALID_OPERATION; status = INVALID_OPERATION; Loading @@ -345,7 +374,7 @@ status_t AudioStreamOutDump::setParameters(const String8& keyValuePairs) } } if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) { if (param.getInt(String8("sampling_rate"), valueInt) == NO_ERROR) { if (valueInt > 0 && valueInt <= 48000) { if (valueInt > 0 && valueInt <= 48000) { if (mOutFile == 0) { if (mFile == 0) { mSampleRate = valueInt; mSampleRate = valueInt; } else { } else { status = INVALID_OPERATION; status = INVALID_OPERATION; Loading Loading @@ -373,9 +402,9 @@ status_t AudioStreamOutDump::dump(int fd, const Vector<String16>& args) void AudioStreamOutDump::Close() void AudioStreamOutDump::Close() { { if(mOutFile) { if(mFile) { fclose(mOutFile); fclose(mFile); mOutFile = 0; mFile = 0; } } } } Loading @@ -396,7 +425,7 @@ AudioStreamInDump::AudioStreamInDump(AudioDumpInterface *interface, uint32_t sampleRate) uint32_t sampleRate) : mInterface(interface), mId(id), : mInterface(interface), mId(id), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mDevice(devices), mSampleRate(sampleRate), mFormat(format), mChannels(channels), mDevice(devices), mBufferSize(1024), mFinalStream(finalStream), mInFile(0) mBufferSize(1024), mFinalStream(finalStream), mFile(0), mFileCount(0) { { LOGV("AudioStreamInDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); LOGV("AudioStreamInDump Constructor %p, mInterface %p, mFinalStream %p", this, mInterface, mFinalStream); } } Loading @@ -409,13 +438,25 @@ AudioStreamInDump::~AudioStreamInDump() ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) { { ssize_t ret; if (mFinalStream) { if (mFinalStream) { return mFinalStream->read(buffer, bytes); ret = mFinalStream->read(buffer, bytes); if(!mFile) { if (mInterface->fileName() != "") { char name[255]; sprintf(name, "%s_in_%d_%d.pcm", mInterface->fileName().string(), mId, ++mFileCount); mFile = fopen(name, "wb"); LOGV("Opening input dump file %s, fh %p", name, mFile); } } } usleep((bytes * 1000000) / frameSize() / sampleRate()); if (mFile) { fwrite(buffer, bytes, 1, mFile); if(!mInFile) { } } else { usleep((((bytes * 1000) / frameSize()) / sampleRate()) * 1000); ret = bytes; if(!mFile) { char name[255]; char name[255]; strcpy(name, "/sdcard/music/sine440"); strcpy(name, "/sdcard/music/sine440"); if (channels() == AudioSystem::CHANNEL_IN_MONO) { if (channels() == AudioSystem::CHANNEL_IN_MONO) { Loading @@ -438,26 +479,27 @@ ssize_t AudioStreamInDump::read(void* buffer, ssize_t bytes) strcat(name, "_48k"); strcat(name, "_48k"); } } strcat(name, ".wav"); strcat(name, ".wav"); mInFile = fopen(name, "rb"); mFile = fopen(name, "rb"); LOGV("Opening dump file %s, fh %p", name, mInFile); LOGV("Opening input read file %s, fh %p", name, mFile); if (mInFile) { if (mFile) { fseek(mInFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); } } } } if (mInFile) { if (mFile) { ssize_t bytesRead = fread(buffer, bytes, 1, mInFile); ssize_t bytesRead = fread(buffer, bytes, 1, mFile); if (bytesRead != bytes) { if (bytesRead >=0 && bytesRead < bytes) { fseek(mInFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fseek(mFile, AUDIO_DUMP_WAVE_HDR_SIZE, SEEK_SET); fread((uint8_t *)buffer+bytesRead, bytes-bytesRead, 1, mInFile); fread((uint8_t *)buffer+bytesRead, bytes-bytesRead, 1, mFile); } } } } } return bytes; return ret; } } status_t AudioStreamInDump::standby() status_t AudioStreamInDump::standby() { { LOGV("AudioStreamInDump standby(), mInFile %p, mFinalStream %p", mInFile, mFinalStream); LOGV("AudioStreamInDump standby(), mFile %p, mFinalStream %p", mFile, mFinalStream); Close(); Close(); if (mFinalStream != 0 ) return mFinalStream->standby(); if (mFinalStream != 0 ) return mFinalStream->standby(); Loading Loading @@ -523,9 +565,9 @@ status_t AudioStreamInDump::dump(int fd, const Vector<String16>& args) void AudioStreamInDump::Close() void AudioStreamInDump::Close() { { if(mInFile) { if(mFile) { fclose(mInFile); fclose(mFile); mInFile = 0; mFile = 0; } } } } }; // namespace android }; // namespace android
libs/audioflinger/AudioDumpInterface.h +8 −4 Original line number Original line Diff line number Diff line Loading @@ -69,7 +69,7 @@ private: uint32_t mDevice; // current device this output is routed to uint32_t mDevice; // current device this output is routed to size_t mBufferSize; size_t mBufferSize; AudioStreamOut *mFinalStream; AudioStreamOut *mFinalStream; FILE *mOutFile; // output file FILE *mFile; // output file int mFileCount; int mFileCount; }; }; Loading Loading @@ -109,7 +109,8 @@ private: uint32_t mDevice; // current device this output is routed to uint32_t mDevice; // current device this output is routed to size_t mBufferSize; size_t mBufferSize; AudioStreamIn *mFinalStream; AudioStreamIn *mFinalStream; FILE *mInFile; // output file FILE *mFile; // output file int mFileCount; }; }; class AudioDumpInterface : public AudioHardwareBase class AudioDumpInterface : public AudioHardwareBase Loading @@ -134,6 +135,8 @@ public: virtual status_t setMasterVolume(float volume) virtual status_t setMasterVolume(float volume) {return mFinalInterface->setMasterVolume(volume);} {return mFinalInterface->setMasterVolume(volume);} virtual status_t setMode(int mode); // mic mute // mic mute virtual status_t setMicMute(bool state) virtual status_t setMicMute(bool state) {return mFinalInterface->setMicMute(state);} {return mFinalInterface->setMicMute(state);} Loading @@ -143,6 +146,8 @@ public: virtual status_t setParameters(const String8& keyValuePairs); virtual status_t setParameters(const String8& keyValuePairs); virtual String8 getParameters(const String8& keys); virtual String8 getParameters(const String8& keys); virtual size_t getInputBufferSize(uint32_t sampleRate, int format, int channelCount); virtual AudioStreamIn* openInputStream(uint32_t devices, int *format, uint32_t *channels, virtual AudioStreamIn* openInputStream(uint32_t devices, int *format, uint32_t *channels, uint32_t *sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics); uint32_t *sampleRate, status_t *status, AudioSystem::audio_in_acoustics acoustics); virtual void closeInputStream(AudioStreamIn* in); virtual void closeInputStream(AudioStreamIn* in); Loading @@ -154,7 +159,6 @@ protected: AudioHardwareInterface *mFinalInterface; AudioHardwareInterface *mFinalInterface; SortedVector<AudioStreamOutDump *> mOutputs; SortedVector<AudioStreamOutDump *> mOutputs; bool mFirstHwOutput; SortedVector<AudioStreamInDump *> mInputs; SortedVector<AudioStreamInDump *> mInputs; Mutex mLock; Mutex mLock; String8 mPolicyCommands; String8 mPolicyCommands; Loading