Android Audio代码分析22 - AudioEffect::getEnabled函数

今天来看看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对象已被删除,所以会产生异常。
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
优化代码 public static void main(String[] args) { ZkemSDK sdk = new ZkemSDK(); boolean connFlag = sdk.connect("192.168.1.201", 4370); System.out.println("conn:" + connFlag); boolean readGeneralLogData = sdk.readGeneralLogData(); System.out.println("读取打卡机信息到缓存:" + readGeneralLogData); //如果连接打卡机和读取信息到缓存都没问题再去缓存中获取数据 if (connFlag) { //获取打卡机所有的用户信息 List<UserInfo> userInfo = sdk.getUserInfo(); //转化为JSON字符串 String usersJsonString = JSON.toJSONString(userInfo); //反序列化对象 List<UserInfo> userInfos = JSON.parseArray(usersJsonString, UserInfo.class); userInfos.forEach(System.out::println); for (UserInfo info : userInfos) { String name = info.getName(); Boolean enabled = info.getEnabled(); String pwd = info.getPassword(); Integer privilege = info.getPrivilege(); String enrollNumber = info.getEnrollNumber(); Integer userId = Integer.valueOf(enrollNumber); /** * 上面的都是打卡机的数据,可以根据自己的需求处理 / System.out.println(name+"-"+enabled+"-"+pwd+"-"+privilege+"-"+userId+""); } List<Map<String, Object>> generalLogData = sdk.getGeneralLogData(); String logDataJsonString = JSON.toJSONString(generalLogData); List<LogData> logDatas = JSON.parseArray(logDataJsonString, LogData.class); logDatas.forEach(System.out::println); for(LogData data : logDatas){ //打卡机的时间 String time = data.getTime(); String enrollNumber = data.getEnrollNumber(); /* * data有很多的数据,可以根据自己的业务逻辑拿想要的数据 * 我这里只取了打卡时间和enrollNumber * */ Map<String, Object> userInfoByNumber = getUserInfoByNumber(enrollNumber); System.out.println(time); } } }
最新发布
07-08

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值