summaryrefslogtreecommitdiffstats
path: root/media/libmedia/AudioRecord.cpp
diff options
context:
space:
mode:
authorEric Laurent <elaurent@google.com>2011-03-17 09:36:51 -0700
committerEric Laurent <elaurent@google.com>2011-03-18 08:56:45 -0700
commit33797ea64d067dfeaacbfd7ebe7f3383b73961b5 (patch)
tree03aad0239e15dbb12e56c29f4d886e72e111ee2f /media/libmedia/AudioRecord.cpp
parent00d48b9495265457dfb265e766296212b5447b0e (diff)
downloadframeworks_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.cpp5
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();
}
}