Android Audio代码分析22 - AudioEffect::getEnabled函数
2011-10-20 19:42
357 查看
今天来看看AudioEffect中enable相关的接口。
*****************************************源码*************************************************
**********************************************************************************************
源码路径:
frameworks\base\media\tests\mediaframeworktest\src\com\android\mediaframeworktest\functional\MediaAudioEffectTest.java
#######################说明################################
###########################################################
&&&&&&&&&&&&&&&&&&&&&&&总结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
release时会删除native中创建的AudioEffectJniStorage对象和AudioEffect对象。
getEnabled是根据EffectModule的状态返回的。
release之后,再调用getEnabled函数,由于AudioEffect对象已被删除,所以会产生异常。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*****************************************源码*************************************************
//Test case 1.3: test getEnabled() failure when called on released effect @LargeTest public void test1_3GetEnabledAfterRelease() throws Exception { boolean result = false; String msg = "test1_3GetEnabledAfterRelease()"; try { AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, AudioEffect.EFFECT_TYPE_NULL, 0, 0); assertNotNull(msg + ": could not create AudioEffect", effect); effect.release(); try { effect.getEnabled(); } catch (IllegalStateException e) { result = true; } } catch (IllegalArgumentException e) { msg = msg.concat(": Equalizer not found"); } catch (UnsupportedOperationException e) { msg = msg.concat(": Effect library not loaded"); } assertTrue(msg, result); }
**********************************************************************************************
源码路径:
frameworks\base\media\tests\mediaframeworktest\src\com\android\mediaframeworktest\functional\MediaAudioEffectTest.java
#######################说明################################
//Test case 1.3: test getEnabled() failure when called on released effect @LargeTest public void test1_3GetEnabledAfterRelease() throws Exception { boolean result = false; String msg = "test1_3GetEnabledAfterRelease()"; try { AudioEffect effect = new AudioEffect(AudioEffect.EFFECT_TYPE_EQUALIZER, AudioEffect.EFFECT_TYPE_NULL, 0, 0); assertNotNull(msg + ": could not create AudioEffect", effect); effect.release(); // ++++++++++++++++++++++++++++++release++++++++++++++++++++++++++++++++++ /** * Releases the native AudioEffect resources. It is a good practice to * release the effect engine when not in use as control can be returned to * other applications or the native resources released. */ public void release() { synchronized (mStateLock) { native_release(); // ++++++++++++++++++++++++++++++android_media_AudioEffect_native_release++++++++++++++++++++++++++++++++++ static void android_media_AudioEffect_native_release(JNIEnv *env, jobject thiz) { // do everything a call to finalize would // 删除创建AudioEffect时,创建的对象 android_media_AudioEffect_native_finalize(env, thiz); // ++++++++++++++++++++++++++++++android_media_AudioEffect_native_finalize++++++++++++++++++++++++++++++++++ static void android_media_AudioEffect_native_finalize(JNIEnv *env, jobject thiz) { LOGV("android_media_AudioEffect_native_finalize jobject: %x\n", (int)thiz); // delete the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetIntField( thiz, fields.fidNativeAudioEffect); // 此处删除了lpAudioEffect // getEnabled的时候会调用lpAudioEffect的接口,所以release后再getEnabled会产生异常 if (lpAudioEffect) { LOGV("deleting AudioEffect: %x\n", (int)lpAudioEffect); delete lpAudioEffect; } // delete the JNI data AudioEffectJniStorage* lpJniStorage = (AudioEffectJniStorage *)env->GetIntField( thiz, fields.fidJniData); if (lpJniStorage) { LOGV("deleting pJniStorage: %x\n", (int)lpJniStorage); delete lpJniStorage; } } // ------------------------------android_media_AudioEffect_native_finalize---------------------------------- // + reset the native resources in the Java object so any attempt to access // them after a call to release fails. env->SetIntField(thiz, fields.fidNativeAudioEffect, 0); env->SetIntField(thiz, fields.fidJniData, 0); } // ------------------------------android_media_AudioEffect_native_release---------------------------------- mState = STATE_UNINITIALIZED; } } // ------------------------------release---------------------------------- try { effect.getEnabled(); // ++++++++++++++++++++++++++++++++getEnabled++++++++++++++++++++++++++++++++ /** * Returns effect enabled state * * @return true if the effect is enabled, false otherwise. * @throws IllegalStateException */ public boolean getEnabled() throws IllegalStateException { checkState("getEnabled()"); return native_getEnabled(); // ++++++++++++++++++++++++++++++android_media_AudioEffect_native_getEnabled++++++++++++++++++++++++++++++++++ static jboolean android_media_AudioEffect_native_getEnabled(JNIEnv *env, jobject thiz) { // retrieve the AudioEffect object AudioEffect* lpAudioEffect = (AudioEffect *)env->GetIntField( thiz, fields.fidNativeAudioEffect); if (lpAudioEffect == NULL) { jniThrowException(env, "java/lang/IllegalStateException", "Unable to retrieve AudioEffect pointer for getEnabled()"); return false; } return (jboolean)lpAudioEffect->getEnabled(); // ++++++++++++++++++++++++++++AudioEffect::getEnabled++++++++++++++++++++++++++++++++++++ bool AudioEffect::getEnabled() const { // mEnabled在函数AudioEffect::set中被赋值:mEnabled = (volatile int32_t)enabled; // enabled产生于对函数AudioFlinger::createEffect的调用 // iEffect = audioFlinger->createEffect(getpid(), (effect_descriptor_t *)&mDescriptor, // mIEffectClient, priority, output, mSessionId, &mStatus, &mId, &enabled); // 又将地址传给了函数AudioFlinger::PlaybackThread::createEffect_l // create effect on selected output trhead // handle = thread->createEffect_l(client, effectClient, priority, sessionId, // &desc, enabled, &lStatus); // 调用函数AudioFlinger::EffectModule::isEnabled // *enabled = (int)effect->isEnabled(); // ++++++++++++++++++++++++++++AudioFlinger::EffectModule::isEnabled++++++++++++++++++++++++++++++++++++ bool AudioFlinger::EffectModule::isEnabled() { // EffectModule构造函数中会将mState设为IDLE // 函数updateState和函数setEnabled都会改变mState。 // 函数AudioFlinger::EffectChain::process_l会调用函数updateState来更新状态 switch (mState) { case RESTART: case STARTING: case ACTIVE: return true; case IDLE: case STOPPING: case STOPPED: default: return false; } } // ----------------------------AudioFlinger::EffectModule::isEnabled------------------------------------ return (mEnabled != 0); } // ----------------------------AudioEffect::getEnabled------------------------------------ } // ------------------------------android_media_AudioEffect_native_getEnabled---------------------------------- } // --------------------------------getEnabled-------------------------------- } catch (IllegalStateException e) { result = true; } } catch (IllegalArgumentException e) { msg = msg.concat(": Equalizer not found"); } catch (UnsupportedOperationException e) { msg = msg.concat(": Effect library not loaded"); } assertTrue(msg, result); }
###########################################################
&&&&&&&&&&&&&&&&&&&&&&&总结&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
release时会删除native中创建的AudioEffectJniStorage对象和AudioEffect对象。
getEnabled是根据EffectModule的状态返回的。
release之后,再调用getEnabled函数,由于AudioEffect对象已被删除,所以会产生异常。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
相关文章推荐
- Android Audio代码分析22 - AudioEffect::getEnabled函数
- Android Audio代码分析24 - AudioEffect::setEnabled函数
- Android Audio代码分析24 - AudioEffect::setEnabled函数
- Android Audio代码分析21 - 创建AudioEffect对象
- Android Audio代码分析6 - AudioEffect
- Android Audio代码分析21 - 创建AudioEffect对象
- Android Audio代码分析26 - Audio Strategy
- Android Audio 代码分析- Audio Strategy
- Android Audio代码分析2 - 函数getMinBufferSize (补充)
- Android Audio代码分析15 - testPlaybackHeadPositionAfterFlush
- Android Audio代码分析17 - setvolume函数
- Android Audio代码分析23 - attachAuxEffect函数
- Android Audio代码分析1 - AudioTrack使用示例
- Android Audio代码分析26 - Audio Strategy
- Android Audio代码分析11 - AudioStreamOutALSA::write函数
- Android Audio代码分析15 - testPlaybackHeadPositionAfterFlush
- Android Audio代码分析17 - setvolume函数
- Android Audio代码分析23 - attachAuxEffect函数
- Android Audio代码分析1 - AudioTrack使用示例
- Android Audio代码分析9 - AudioTrack::write函数