diff options
author | Eric Laurent <elaurent@google.com> | 2011-03-17 09:36:51 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2011-03-18 08:56:45 -0700 |
commit | 33797ea64d067dfeaacbfd7ebe7f3383b73961b5 (patch) | |
tree | 03aad0239e15dbb12e56c29f4d886e72e111ee2f /media/libmedia/AudioRecord.cpp | |
parent | 00d48b9495265457dfb265e766296212b5447b0e (diff) | |
download | frameworks_av-33797ea64d067dfeaacbfd7ebe7f3383b73961b5.zip frameworks_av-33797ea64d067dfeaacbfd7ebe7f3383b73961b5.tar.gz frameworks_av-33797ea64d067dfeaacbfd7ebe7f3383b73961b5.tar.bz2 |
Fix issue 4111672: AudioTrack control block flags
Make sure that all read/modify/write operations on the AudioTrack
and AudioRecord control block flags field are protected by the
control block's mutex.
Also fix potential infinite loop in AudioTrack::write() if the
written size is not a multiple of frame size.
Change-Id: Ib3d557eb45dcc3abeb32c9aa56058e2873afee27
Diffstat (limited to 'media/libmedia/AudioRecord.cpp')
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index a18bedb..cee1c75 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -722,9 +722,12 @@ bool AudioRecord::processAudioBuffer(const sp<ClientRecordThread>& thread) // Manage overrun callback if (mActive && (cblk->framesAvailable() == 0)) { LOGV("Overrun user: %x, server: %x, flags %04x", cblk->user, cblk->server, cblk->flags); + AutoMutex _l(cblk->lock); if ((cblk->flags & CBLK_UNDERRUN_MSK) == CBLK_UNDERRUN_OFF) { - mCbf(EVENT_OVERRUN, mUserData, 0); cblk->flags |= CBLK_UNDERRUN_ON; + cblk->lock.unlock(); + mCbf(EVENT_OVERRUN, mUserData, 0); + cblk->lock.lock(); } } |