diff options
author | Glenn Kasten <gkasten@google.com> | 2012-01-11 11:40:27 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2012-01-11 11:40:27 -0800 |
commit | 3bba0e0a60b15895134bc2c731d21fd7ebd28784 (patch) | |
tree | d2a61bc06a6a7338fb5a08505a8865ea378c27e6 /media/libmedia/AudioSystem.cpp | |
parent | 544096247a907bc55688e5c03d5586ba5219d82a (diff) | |
parent | f8c1a6f7ef515810356816b50bfe18af95f3ec32 (diff) | |
download | frameworks_av-3bba0e0a60b15895134bc2c731d21fd7ebd28784.zip frameworks_av-3bba0e0a60b15895134bc2c731d21fd7ebd28784.tar.gz frameworks_av-3bba0e0a60b15895134bc2c731d21fd7ebd28784.tar.bz2 |
Merge "Fix race in AudioSystem::getInputBufferSize"
Diffstat (limited to 'media/libmedia/AudioSystem.cpp')
-rw-r--r-- | media/libmedia/AudioSystem.cpp | 23 |
1 files changed, 14 insertions, 9 deletions
diff --git a/media/libmedia/AudioSystem.cpp b/media/libmedia/AudioSystem.cpp index 84f6b7c..9d4137e 100644 --- a/media/libmedia/AudioSystem.cpp +++ b/media/libmedia/AudioSystem.cpp @@ -38,7 +38,7 @@ audio_error_callback AudioSystem::gAudioErrorCallback = NULL; DefaultKeyedVector<int, audio_io_handle_t> AudioSystem::gStreamOutputMap(0); DefaultKeyedVector<audio_io_handle_t, AudioSystem::OutputDescriptor *> AudioSystem::gOutputs(0); -// Cached values for recording queries +// Cached values for recording queries, all protected by gLock uint32_t AudioSystem::gPrevInSamplingRate = 16000; int AudioSystem::gPrevInFormat = AUDIO_FORMAT_PCM_16_BIT; int AudioSystem::gPrevInChannelCount = 1; @@ -301,22 +301,27 @@ status_t AudioSystem::getOutputLatency(uint32_t* latency, int streamType) status_t AudioSystem::getInputBufferSize(uint32_t sampleRate, int format, int channelCount, size_t* buffSize) { + gLock.lock(); // Do we have a stale gInBufferSize or are we requesting the input buffer size for new values - if ((gInBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) + size_t inBuffSize = gInBuffSize; + if ((inBuffSize == 0) || (sampleRate != gPrevInSamplingRate) || (format != gPrevInFormat) || (channelCount != gPrevInChannelCount)) { + gLock.unlock(); + const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); + if (af == 0) { + return PERMISSION_DENIED; + } + inBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); + gLock.lock(); // save the request params gPrevInSamplingRate = sampleRate; gPrevInFormat = format; gPrevInChannelCount = channelCount; - gInBuffSize = 0; - const sp<IAudioFlinger>& af = AudioSystem::get_audio_flinger(); - if (af == 0) { - return PERMISSION_DENIED; - } - gInBuffSize = af->getInputBufferSize(sampleRate, format, channelCount); + gInBuffSize = inBuffSize; } - *buffSize = gInBuffSize; + gLock.unlock(); + *buffSize = inBuffSize; return NO_ERROR; } |