Loading media/jni/audioeffect/android_media_AudioEffect.cpp +60 −55 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ static jint translateError(int code) { } } static Mutex sLock; // ---------------------------------------------------------------------------- static void effectCallback(int event, void* user, void *info) { Loading Loading @@ -181,6 +182,32 @@ effectCallback_Exit: } } // ---------------------------------------------------------------------------- static sp<AudioEffect> getAudioEffect(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); AudioEffect* const ae = (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); return sp<AudioEffect>(ae); } static sp<AudioEffect> setAudioEffect(JNIEnv* env, jobject thiz, const sp<AudioEffect>& ae) { Mutex::Autolock l(sLock); sp<AudioEffect> old = (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); if (ae.get()) { ae->incStrong((void*)setAudioEffect); } if (old != 0) { old->decStrong((void*)setAudioEffect); } env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)ae.get()); return old; } // ---------------------------------------------------------------------------- // This function gets some field IDs, which in turn causes class initialization. // It is called from a static block in AudioEffect, which won't run until the Loading Loading @@ -257,7 +284,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ALOGV("android_media_AudioEffect_native_setup"); AudioEffectJniStorage* lpJniStorage = NULL; int lStatus = AUDIOEFFECT_ERROR_NO_MEMORY; AudioEffect* lpAudioEffect = NULL; sp<AudioEffect> lpAudioEffect; jint* nId = NULL; const char *typeStr = NULL; const char *uuidStr = NULL; Loading @@ -272,6 +299,8 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ScopedUtfChars opPackageNameStr(env, opPackageName); setAudioEffect(env, thiz, 0); if (type != NULL) { typeStr = env->GetStringUTFChars(type, NULL); if (typeStr == NULL) { // Out of memory Loading Loading @@ -324,7 +353,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t &lpJniStorage->mCallbackData, sessionId, 0); if (lpAudioEffect == NULL) { if (lpAudioEffect == 0) { ALOGE("Error creating AudioEffect"); goto setup_failure; } Loading Loading @@ -394,7 +423,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t env->SetObjectArrayElement(javadesc, 0, jdesc); env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)lpAudioEffect); setAudioEffect(env, thiz, lpAudioEffect); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); Loading @@ -407,12 +436,9 @@ setup_failure: env->ReleasePrimitiveArrayCritical(jId, nId, 0); } if (lpAudioEffect) { delete lpAudioEffect; } env->SetLongField(thiz, fields.fidNativeAudioEffect, 0); if (lpJniStorage) { env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class); env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref); delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); Loading @@ -430,20 +456,20 @@ setup_failure: // ---------------------------------------------------------------------------- static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); // delete the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect) { ALOGV("deleting AudioEffect: %p\n", lpAudioEffect); delete lpAudioEffect; static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { sp<AudioEffect> lpAudioEffect = setAudioEffect(env, thiz, 0); if (lpAudioEffect == 0) { return; } // delete the JNI data AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)env->GetLongField( thiz, fields.fidJniData); AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)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; Loading @@ -451,24 +477,16 @@ static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz } // ---------------------------------------------------------------------------- static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { // do everything a call to finalize would android_media_AudioEffect_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.fidNativeAudioEffect, 0); env->SetLongField(thiz, fields.fidJniData, 0); static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); android_media_AudioEffect_native_release(env, thiz); } static jint android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for enable()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading @@ -480,11 +498,8 @@ android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean static jboolean android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getEnabled()"); return JNI_FALSE; Loading @@ -501,11 +516,8 @@ android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) static jboolean android_media_AudioEffect_native_hasControl(JNIEnv *env, jobject thiz) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for hasControl()"); return JNI_FALSE; Loading @@ -528,10 +540,8 @@ static jint android_media_AudioEffect_native_setParameter(JNIEnv *env, effect_param_t *p; int voffset; AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading Loading @@ -591,10 +601,8 @@ android_media_AudioEffect_native_getParameter(JNIEnv *env, effect_param_t *p; int voffset; AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading Loading @@ -657,11 +665,8 @@ static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz, jbyte* pReplyData = NULL; jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE; // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading media/jni/audioeffect/android_media_Visualizer.cpp +79 −69 Original line number Diff line number Diff line Loading @@ -102,14 +102,14 @@ struct visualizer_callback_cookie { }; // ---------------------------------------------------------------------------- class visualizerJniStorage { class VisualizerJniStorage { public: visualizer_callback_cookie mCallbackData; visualizerJniStorage() { VisualizerJniStorage() { } ~visualizerJniStorage() { ~VisualizerJniStorage() { } }; Loading @@ -135,6 +135,7 @@ static jint translateError(int code) { } } static Mutex sLock; // ---------------------------------------------------------------------------- static void ensureArraySize(JNIEnv *env, jbyteArray *array, uint32_t size) { Loading Loading @@ -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); } return 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); } env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)v.get()); return old; } // ---------------------------------------------------------------------------- Loading Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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); Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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(); Loading @@ -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; } Loading @@ -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(); Loading @@ -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)); Loading @@ -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(); Loading @@ -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(); Loading @@ -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; } Loading @@ -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; } Loading @@ -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]; Loading @@ -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; Loading Loading
media/jni/audioeffect/android_media_AudioEffect.cpp +60 −55 Original line number Diff line number Diff line Loading @@ -92,6 +92,7 @@ static jint translateError(int code) { } } static Mutex sLock; // ---------------------------------------------------------------------------- static void effectCallback(int event, void* user, void *info) { Loading Loading @@ -181,6 +182,32 @@ effectCallback_Exit: } } // ---------------------------------------------------------------------------- static sp<AudioEffect> getAudioEffect(JNIEnv* env, jobject thiz) { Mutex::Autolock l(sLock); AudioEffect* const ae = (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); return sp<AudioEffect>(ae); } static sp<AudioEffect> setAudioEffect(JNIEnv* env, jobject thiz, const sp<AudioEffect>& ae) { Mutex::Autolock l(sLock); sp<AudioEffect> old = (AudioEffect*)env->GetLongField(thiz, fields.fidNativeAudioEffect); if (ae.get()) { ae->incStrong((void*)setAudioEffect); } if (old != 0) { old->decStrong((void*)setAudioEffect); } env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)ae.get()); return old; } // ---------------------------------------------------------------------------- // This function gets some field IDs, which in turn causes class initialization. // It is called from a static block in AudioEffect, which won't run until the Loading Loading @@ -257,7 +284,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ALOGV("android_media_AudioEffect_native_setup"); AudioEffectJniStorage* lpJniStorage = NULL; int lStatus = AUDIOEFFECT_ERROR_NO_MEMORY; AudioEffect* lpAudioEffect = NULL; sp<AudioEffect> lpAudioEffect; jint* nId = NULL; const char *typeStr = NULL; const char *uuidStr = NULL; Loading @@ -272,6 +299,8 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t ScopedUtfChars opPackageNameStr(env, opPackageName); setAudioEffect(env, thiz, 0); if (type != NULL) { typeStr = env->GetStringUTFChars(type, NULL); if (typeStr == NULL) { // Out of memory Loading Loading @@ -324,7 +353,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t &lpJniStorage->mCallbackData, sessionId, 0); if (lpAudioEffect == NULL) { if (lpAudioEffect == 0) { ALOGE("Error creating AudioEffect"); goto setup_failure; } Loading Loading @@ -394,7 +423,7 @@ android_media_AudioEffect_native_setup(JNIEnv *env, jobject thiz, jobject weak_t env->SetObjectArrayElement(javadesc, 0, jdesc); env->SetLongField(thiz, fields.fidNativeAudioEffect, (jlong)lpAudioEffect); setAudioEffect(env, thiz, lpAudioEffect); env->SetLongField(thiz, fields.fidJniData, (jlong)lpJniStorage); Loading @@ -407,12 +436,9 @@ setup_failure: env->ReleasePrimitiveArrayCritical(jId, nId, 0); } if (lpAudioEffect) { delete lpAudioEffect; } env->SetLongField(thiz, fields.fidNativeAudioEffect, 0); if (lpJniStorage) { env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_class); env->DeleteGlobalRef(lpJniStorage->mCallbackData.audioEffect_ref); delete lpJniStorage; } env->SetLongField(thiz, fields.fidJniData, 0); Loading @@ -430,20 +456,20 @@ setup_failure: // ---------------------------------------------------------------------------- static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); // delete the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect) { ALOGV("deleting AudioEffect: %p\n", lpAudioEffect); delete lpAudioEffect; static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { sp<AudioEffect> lpAudioEffect = setAudioEffect(env, thiz, 0); if (lpAudioEffect == 0) { return; } // delete the JNI data AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)env->GetLongField( thiz, fields.fidJniData); AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)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; Loading @@ -451,24 +477,16 @@ static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz } // ---------------------------------------------------------------------------- static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { // do everything a call to finalize would android_media_AudioEffect_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.fidNativeAudioEffect, 0); env->SetLongField(thiz, fields.fidJniData, 0); static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { ALOGV("android_media_AudioEffect_native_finalize jobject: %p\n", thiz); android_media_AudioEffect_native_release(env, thiz); } static jint android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean enabled) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for enable()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading @@ -480,11 +498,8 @@ android_media_AudioEffect_native_setEnabled(JNIEnv *env, jobject thiz, jboolean static jboolean android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getEnabled()"); return JNI_FALSE; Loading @@ -501,11 +516,8 @@ android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) static jboolean android_media_AudioEffect_native_hasControl(JNIEnv *env, jobject thiz) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetLongField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for hasControl()"); return JNI_FALSE; Loading @@ -528,10 +540,8 @@ static jint android_media_AudioEffect_native_setParameter(JNIEnv *env, effect_param_t *p; int voffset; AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading Loading @@ -591,10 +601,8 @@ android_media_AudioEffect_native_getParameter(JNIEnv *env, effect_param_t *p; int voffset; AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading Loading @@ -657,11 +665,8 @@ static jint android_media_AudioEffect_native_command(JNIEnv *env, jobject thiz, jbyte* pReplyData = NULL; jint lStatus = AUDIOEFFECT_ERROR_BAD_VALUE; // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *) env->GetLongField(thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { sp<AudioEffect> lpAudioEffect = getAudioEffect(env, thiz); if (lpAudioEffect == 0) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for setParameter()"); return AUDIOEFFECT_ERROR_NO_INIT; Loading
media/jni/audioeffect/android_media_Visualizer.cpp +79 −69 Original line number Diff line number Diff line Loading @@ -102,14 +102,14 @@ struct visualizer_callback_cookie { }; // ---------------------------------------------------------------------------- class visualizerJniStorage { class VisualizerJniStorage { public: visualizer_callback_cookie mCallbackData; visualizerJniStorage() { VisualizerJniStorage() { } ~visualizerJniStorage() { ~VisualizerJniStorage() { } }; Loading @@ -135,6 +135,7 @@ static jint translateError(int code) { } } static Mutex sLock; // ---------------------------------------------------------------------------- static void ensureArraySize(JNIEnv *env, jbyteArray *array, uint32_t size) { Loading Loading @@ -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); } return 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); } env->SetLongField(thiz, fields.fidNativeVisualizer, (jlong)v.get()); return old; } // ---------------------------------------------------------------------------- Loading Loading @@ -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(); Loading @@ -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; Loading Loading @@ -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; } Loading @@ -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); Loading @@ -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); Loading @@ -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) Loading @@ -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; } Loading Loading @@ -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; } Loading @@ -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(); Loading @@ -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; } Loading @@ -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(); Loading @@ -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)); Loading @@ -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(); Loading @@ -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(); Loading @@ -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; } Loading @@ -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; } Loading @@ -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]; Loading @@ -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; Loading