summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGlenn Kasten <gkasten@google.com>2014-04-24 09:29:05 -0700
committerGlenn Kasten <gkasten@google.com>2014-08-27 08:46:37 -0700
commit460bdad43aaec3c6ffe7f259719e00807742ad6d (patch)
tree5c976d1fb176f9cd5dc04f1d68d0af4fe7a4b7b3
parentd0081ece36dcb6ecdadeb9fc0ee912cffb7effc7 (diff)
downloadandroid_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.cpp24
-rw-r--r--src/android/AudioRecorder_to_android.h2
-rw-r--r--src/classes.h1
-rw-r--r--src/itf/IEngine.c2
-rw-r--r--src/objects/CAudioRecorder.c4
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;
}