diff options
author | Glenn Kasten <gkasten@google.com> | 2014-04-24 09:29:05 -0700 |
---|---|---|
committer | Glenn Kasten <gkasten@google.com> | 2014-08-27 08:46:37 -0700 |
commit | 460bdad43aaec3c6ffe7f259719e00807742ad6d (patch) | |
tree | 5c976d1fb176f9cd5dc04f1d68d0af4fe7a4b7b3 | |
parent | d0081ece36dcb6ecdadeb9fc0ee912cffb7effc7 (diff) | |
download | android_frameworks_wilhelm-460bdad43aaec3c6ffe7f259719e00807742ad6d.tar.gz android_frameworks_wilhelm-460bdad43aaec3c6ffe7f259719e00807742ad6d.tar.bz2 android_frameworks_wilhelm-460bdad43aaec3c6ffe7f259719e00807742ad6d.zip |
Audio recorder missing a callback protectorstaging/cm-12.0-caf
Bug: 14291968
Change-Id: I620d5e82f58e57e87097984a649b5c3a25c42963
-rw-r--r-- | src/android/AudioRecorder_to_android.cpp | 24 | ||||
-rw-r--r-- | src/android/AudioRecorder_to_android.h | 2 | ||||
-rw-r--r-- | src/classes.h | 1 | ||||
-rw-r--r-- | src/itf/IEngine.c | 2 | ||||
-rw-r--r-- | src/objects/CAudioRecorder.c | 4 |
5 files changed, 33 insertions, 0 deletions
diff --git a/src/android/AudioRecorder_to_android.cpp b/src/android/AudioRecorder_to_android.cpp index ebb9592..800a767 100644 --- a/src/android/AudioRecorder_to_android.cpp +++ b/src/android/AudioRecorder_to_android.cpp @@ -212,6 +212,12 @@ static void audioRecorder_callback(int event, void* user, void *info) { //SL_LOGV("audioRecorder_callback(%d, %p, %p) entering", event, user, info); CAudioRecorder *ar = (CAudioRecorder *)user; + + if (!android::CallbackProtector::enterCbIfOk(ar->mCallbackProtector)) { + // it is not safe to enter the callback (the track is about to go away) + return; + } + void * callbackPContext = NULL; switch(event) { @@ -289,6 +295,8 @@ static void audioRecorder_callback(int event, void* user, void *info) { break; } + + ar->mCallbackProtector->exitCb(); } @@ -312,6 +320,7 @@ SLresult android_audioRecorder_create(CAudioRecorder* ar) { // microphone to simple buffer queue ar->mAndroidObjType = AUDIORECORDER_FROM_MIC_TO_PCM_BUFFERQUEUE; ar->mAudioRecord.clear(); + ar->mCallbackProtector = new android::CallbackProtector(); ar->mRecordSource = AUDIO_SOURCE_DEFAULT; } else { result = SL_RESULT_CONTENT_UNSUPPORTED; @@ -430,14 +439,29 @@ SLresult android_audioRecorder_realize(CAudioRecorder* ar, SLboolean async) { //----------------------------------------------------------------------------- +/** + * Called with a lock on AudioRecorder, and blocks until safe to destroy + */ +void android_audioRecorder_preDestroy(CAudioRecorder* ar) { + object_unlock_exclusive(&ar->mObject); + if (ar->mCallbackProtector != 0) { + ar->mCallbackProtector->requestCbExitAndWait(); + } + object_lock_exclusive(&ar->mObject); +} + + +//----------------------------------------------------------------------------- void android_audioRecorder_destroy(CAudioRecorder* ar) { SL_LOGV("android_audioRecorder_destroy(%p) entering", ar); if (ar->mAudioRecord != 0) { ar->mAudioRecord->stop(); + ar->mAudioRecord.clear(); } // explicit destructor ar->mAudioRecord.~sp(); + ar->mCallbackProtector.~sp(); #ifdef MONITOR_RECORDING if (NULL != gMonitorFp) { diff --git a/src/android/AudioRecorder_to_android.h b/src/android/AudioRecorder_to_android.h index b8d4dd2..d561ca1 100644 --- a/src/android/AudioRecorder_to_android.h +++ b/src/android/AudioRecorder_to_android.h @@ -45,6 +45,8 @@ extern SLresult android_audioRecorder_getConfig(CAudioRecorder* ar, const SLchar extern SLresult android_audioRecorder_realize(CAudioRecorder* ar, SLboolean async); +extern void android_audioRecorder_preDestroy(CAudioRecorder* ar); + extern void android_audioRecorder_destroy(CAudioRecorder* ar); /************************************************************************************************** diff --git a/src/classes.h b/src/classes.h index 54ca0e8..f4ac305 100644 --- a/src/classes.h +++ b/src/classes.h @@ -153,6 +153,7 @@ // FIXME consolidate the next several variables into ARecorder class to avoid placement new enum AndroidObjectType mAndroidObjType; android::sp<android::AudioRecord> mAudioRecord; + android::sp<android::CallbackProtector> mCallbackProtector; audio_source_t mRecordSource; #endif } /*CAudioRecorder*/; diff --git a/src/itf/IEngine.c b/src/itf/IEngine.c index 38b37dc..4ff32c9 100644 --- a/src/itf/IEngine.c +++ b/src/itf/IEngine.c @@ -457,6 +457,8 @@ static SLresult IEngine_CreateAudioRecorder(SLEngineItf self, SLObjectItf *pReco // FIXME unnecessary once those fields are encapsulated in one class, rather // than a structure (void) new (&thiz->mAudioRecord) android::sp<android::AudioRecord>(); + (void) new (&thiz->mCallbackProtector) + android::sp<android::CallbackProtector>(); thiz->mRecordSource = AUDIO_SOURCE_DEFAULT; #endif diff --git a/src/objects/CAudioRecorder.c b/src/objects/CAudioRecorder.c index 956e987..6eab0cf 100644 --- a/src/objects/CAudioRecorder.c +++ b/src/objects/CAudioRecorder.c @@ -59,5 +59,9 @@ void CAudioRecorder_Destroy(void *self) predestroy_t CAudioRecorder_PreDestroy(void *self) { + CAudioRecorder *thiz = (CAudioRecorder *) self; +#ifdef ANDROID + android_audioRecorder_preDestroy(thiz); +#endif return predestroy_ok; } |