Android Audio程式碼分析22 - AudioEffect::getEnabled函數

來源:互聯網
上載者:User

 

今天來看看AudioEffect中enable相關的介面。

 

 

*****************************************源碼*************************************************

    //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對象已被刪除,所以會產生異常。

&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

摘自:江風的專欄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.