diff options
Diffstat (limited to 'media/jni/audioeffect/android_media_Visualizer.cpp')
-rw-r--r-- | media/jni/audioeffect/android_media_Visualizer.cpp | 148 |
1 files changed, 79 insertions, 69 deletions
diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index abc681e..6098b4a 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -102,14 +102,14 @@ struct visualizer_callback_cookie { }; // ---------------------------------------------------------------------------- -class visualizerJniStorage { +class VisualizerJniStorage { public: visualizer_callback_cookie mCallbackData; - visualizerJniStorage() { + VisualizerJniStorage() { } - ~visualizerJniStorage() { + ~VisualizerJniStorage() { } }; @@ -135,6 +135,7 @@ static jint translateError(int code) { } } +static Mutex sLock; // ---------------------------------------------------------------------------- static void ensureArraySize(JNIEnv *env, jbyteArray *array, uint32_t size) { @@ -227,15 +228,30 @@ static void captureCallback(void* user, } } -static Visualizer *getVisualizer(JNIEnv* env, jobject thiz) +// ---------------------------------------------------------------------------- + +static sp<Visualizer> getVisualizer(JNIEnv* env, jobject thiz) { - Visualizer *v = (Visualizer *)env->GetLongField( - thiz, fields.fidNativeVisualizer); - if (v == NULL) { - jniThrowException(env, "java/lang/IllegalStateException", - "Unable to retrieve Visualizer pointer"); + Mutex::Autolock l(sLock); + Visualizer* const v = + (Visualizer*)env->GetLongField(thiz, fields.fidNativeVisualizer); + return sp<Visualizer>(v); +} + +static sp<Visualizer> setVisualizer(JNIEnv* env, jobject thiz, + const sp<Visualizer>& v) +{ + Mutex::Autolock l(sLock); + sp<Visualizer> old = + (Visualizer*)env->GetLongField(thiz, fields.fidNativeVisualizer); + if (v.get()) { + v->incStrong((void*)setVisualizer); + } + if (old != 0) { + old->decStrong((void*)setVisualizer); } - return v; + env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)v.get()); + return old; } // ---------------------------------------------------------------------------- @@ -318,7 +334,7 @@ static void android_media_visualizer_effect_callback(int32_t event, void *info) { if ((event == AudioEffect::EVENT_ERROR) && (*((status_t*)info) == DEAD_OBJECT)) { - visualizerJniStorage* lpJniStorage = (visualizerJniStorage*)user; + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage*)user; visualizer_callback_cookie* callbackInfo = &lpJniStorage->mCallbackData; JNIEnv *env = AndroidRuntime::getJNIEnv(); @@ -336,14 +352,16 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th jint sessionId, jintArray jId, jstring opPackageName) { ALOGV("android_media_visualizer_native_setup"); - visualizerJniStorage* lpJniStorage = NULL; + VisualizerJniStorage* lpJniStorage = NULL; int lStatus = VISUALIZER_ERROR_NO_MEMORY; - Visualizer* lpVisualizer = NULL; + sp<Visualizer> lpVisualizer; jint* nId = NULL; ScopedUtfChars opPackageNameStr(env, opPackageName); - lpJniStorage = new visualizerJniStorage(); + setVisualizer(env, thiz, 0); + + lpJniStorage = new VisualizerJniStorage(); if (lpJniStorage == NULL) { ALOGE("setup: Error creating JNI Storage"); goto setup_failure; @@ -371,7 +389,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th android_media_visualizer_effect_callback, lpJniStorage, sessionId); - if (lpVisualizer == NULL) { + if (lpVisualizer == 0) { ALOGE("Error creating Visualizer"); goto setup_failure; } @@ -392,7 +410,7 @@ android_media_visualizer_native_setup(JNIEnv *env, jobject thiz, jobject weak_th env->ReleasePrimitiveArrayCritical(jId, nId, 0); nId = NULL; - env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)lpVisualizer); + setVisualizer(env, thiz, lpVisualizer); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); @@ -405,12 +423,9 @@ setup_failure: env->ReleasePrimitiveArrayCritical(jId, nId, 0); } - if (lpVisualizer) { - delete lpVisualizer; - } - env->SetLongField(thiz, fields.fidNativeVisualizer, 0); - if (lpJniStorage) { + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_class); + env->DeleteGlobalRef(lpJniStorage->mCallbackData.visualizer_ref); delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); @@ -419,49 +434,44 @@ setup_failure: } // ---------------------------------------------------------------------------- -static void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { - ALOGV("android_media_visualizer_native_finalize jobject: %p\n", thiz); - - // delete the Visualizer object - Visualizer* lpVisualizer = (Visualizer *)env->GetLongField( - thiz, fields.fidNativeVisualizer); - if (lpVisualizer) { - ALOGV("deleting Visualizer: %p\n", lpVisualizer); - delete lpVisualizer; +static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { + sp<Visualizer> lpVisualizer = setVisualizer(env, thiz, 0); + if (lpVisualizer == 0) { + return; } // delete the JNI data - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField( - thiz, fields.fidJniData); + VisualizerJniStorage* lpJniStorage = + (VisualizerJniStorage *)env->GetLongField(thiz, fields.fidJniData); + + // reset the native resources in the Java object so any attempt to access + // them after a call to release fails. + env->SetLongField(thiz, fields.fidJniData, 0); + if (lpJniStorage) { ALOGV("deleting pJniStorage: %p\n", lpJniStorage); delete lpJniStorage; } } -// ---------------------------------------------------------------------------- -static void android_media_visualizer_native_release(JNIEnv *env, jobject thiz) { - - // do everything a call to finalize would - android_media_visualizer_native_finalize(env, thiz); - // + reset the native resources in the Java object so any attempt to access - // them after a call to release fails. - env->SetLongField(thiz, fields.fidNativeVisualizer, 0); - env->SetLongField(thiz, fields.fidJniData, 0); +static void android_media_visualizer_native_finalize(JNIEnv *env, jobject thiz) { + ALOGV("android_media_visualizer_native_finalize jobject: %p\n", thiz); + android_media_visualizer_native_release(env, thiz); } +// ---------------------------------------------------------------------------- static jint android_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } jint retVal = translateError(lpVisualizer->setEnabled(enabled)); if (!enabled) { - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField( + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage *)env->GetLongField( thiz, fields.fidJniData); if (NULL != lpJniStorage) @@ -474,8 +484,8 @@ android_media_visualizer_native_setEnabled(JNIEnv *env, jobject thiz, jboolean e static jboolean android_media_visualizer_native_getEnabled(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return JNI_FALSE; } @@ -507,8 +517,8 @@ android_media_visualizer_native_getMaxCaptureRate(JNIEnv* /* env */, jobject /* static jint android_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint size) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -518,8 +528,8 @@ android_media_visualizer_native_setCaptureSize(JNIEnv *env, jobject thiz, jint s static jint android_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint) lpVisualizer->getCaptureSize(); @@ -528,8 +538,8 @@ android_media_visualizer_native_getCaptureSize(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_setScalingMode(JNIEnv *env, jobject thiz, jint mode) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -539,8 +549,8 @@ android_media_visualizer_native_setScalingMode(JNIEnv *env, jobject thiz, jint m static jint android_media_visualizer_native_getScalingMode(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint)lpVisualizer->getScalingMode(); @@ -549,8 +559,8 @@ android_media_visualizer_native_getScalingMode(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_setMeasurementMode(JNIEnv *env, jobject thiz, jint mode) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } return translateError(lpVisualizer->setMeasurementMode(mode)); @@ -559,8 +569,8 @@ android_media_visualizer_native_setMeasurementMode(JNIEnv *env, jobject thiz, ji static jint android_media_visualizer_native_getMeasurementMode(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return MEASUREMENT_MODE_NONE; } return lpVisualizer->getMeasurementMode(); @@ -569,8 +579,8 @@ android_media_visualizer_native_getMeasurementMode(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return -1; } return (jint) lpVisualizer->getSamplingRate(); @@ -579,8 +589,8 @@ android_media_visualizer_native_getSamplingRate(JNIEnv *env, jobject thiz) static jint android_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArray jWaveform) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -597,8 +607,8 @@ android_media_visualizer_native_getWaveForm(JNIEnv *env, jobject thiz, jbyteArra static jint android_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFft) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } @@ -616,8 +626,8 @@ android_media_visualizer_native_getFft(JNIEnv *env, jobject thiz, jbyteArray jFf static jint android_media_visualizer_native_getPeakRms(JNIEnv *env, jobject thiz, jobject jPeakRmsObj) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } int32_t measurements[2]; @@ -635,11 +645,11 @@ android_media_visualizer_native_getPeakRms(JNIEnv *env, jobject thiz, jobject jP static jint android_media_setPeriodicCapture(JNIEnv *env, jobject thiz, jint rate, jboolean jWaveform, jboolean jFft) { - Visualizer* lpVisualizer = getVisualizer(env, thiz); - if (lpVisualizer == NULL) { + sp<Visualizer> lpVisualizer = getVisualizer(env, thiz); + if (lpVisualizer == 0) { return VISUALIZER_ERROR_NO_INIT; } - visualizerJniStorage* lpJniStorage = (visualizerJniStorage *)env->GetLongField(thiz, + VisualizerJniStorage* lpJniStorage = (VisualizerJniStorage *)env->GetLongField(thiz, fields.fidJniData); if (lpJniStorage == NULL) { return VISUALIZER_ERROR_NO_INIT; |