diff options
author | Eric Laurent <elaurent@google.com> | 2010-11-18 08:40:16 -0800 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2010-11-19 15:49:42 -0800 |
commit | f5aafb209d01ba2ab6cb55d1a12cfc653e2b4be0 (patch) | |
tree | 75b6429a6bb8b78943b770cad6924a7aaa94dc32 /media/libmedia/AudioRecord.cpp | |
parent | b9ff444a7eaf7ffd43970c0477110c6808bd4a7c (diff) | |
download | frameworks_av-f5aafb209d01ba2ab6cb55d1a12cfc653e2b4be0.zip frameworks_av-f5aafb209d01ba2ab6cb55d1a12cfc653e2b4be0.tar.gz frameworks_av-f5aafb209d01ba2ab6cb55d1a12cfc653e2b4be0.tar.bz2 |
Fix issue 3157123.
Use a Mutex wherever atomic operations were used in AudioTrack,
AudioRecord, AudioFlinger and AudioEffect classes.
Change-Id: I6f55b2cabdcd93d64ef19446735b8f33720f8dbc
Diffstat (limited to 'media/libmedia/AudioRecord.cpp')
-rw-r--r-- | media/libmedia/AudioRecord.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index a6c515c..1d6ffa0 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -35,7 +35,6 @@ #include <binder/Parcel.h> #include <binder/IPCThreadState.h> #include <utils/Timers.h> -#include <cutils/atomic.h> #define LIKELY( exp ) (__builtin_expect( (exp) != 0, true )) #define UNLIKELY( exp ) (__builtin_expect( (exp) != 0, false )) @@ -282,7 +281,9 @@ status_t AudioRecord::start() t->mLock.lock(); } - if (android_atomic_or(1, &mActive) == 0) { + AutoMutex lock(mLock); + if (mActive == 0) { + mActive = 1; ret = mAudioRecord->start(); if (ret == DEAD_OBJECT) { LOGV("start() dead IAudioRecord: creating a new one"); @@ -302,8 +303,7 @@ status_t AudioRecord::start() setpriority(PRIO_PROCESS, 0, THREAD_PRIORITY_AUDIO_CLIENT); } } else { - LOGV("start() failed"); - android_atomic_and(~1, &mActive); + mActive = 0; } } @@ -322,9 +322,11 @@ status_t AudioRecord::stop() if (t != 0) { t->mLock.lock(); - } + } - if (android_atomic_and(~1, &mActive) == 1) { + AutoMutex lock(mLock); + if (mActive == 1) { + mActive = 0; mCblk->cv.signal(); mAudioRecord->stop(); // the record head position will reset to 0, so if a marker is set, we need |