今天来看看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对象已被删除,所以会产生异常。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&