status_t AudioResourceManager::TurnonAudioDevice(unsigned int mDlOutputDevice)
{
    uint32 DeviceCount = PopCount(mDlOutputDevice);
    ALOGD("TurnonAudioDevice = 0x%x DeviceCount = %d", mDlOutputDevice, DeviceCount);
    if (DeviceCount == 1) {
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE) {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) {
            if (mAudioAnalogInstance->GetAnalogState(AudioAnalogType::DEVICE_IN_LINEINR) ||
               mAudioAnalogInstance->GetAnalogState(AudioAnalogType::DEVICE_IN_LINEINL)) {
                ALOGD("SetHeadsetPinmux as MUX_LINEIN_AUDIO_MONO ");
                mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::MUX_LINEIN_AUDIO_MONO);
                mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL, AudioAnalogType::MUX_LINEIN_AUDIO_MONO);
            }
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX) {
            // do nothing
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) {
            // fix me , may not use headset
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET) {
            // do nothing
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
            EnableAudioClock(AudioResourceManagerInterface::CLOCK_AUD_HDMI,true);
            //todo :: if htere is analog block need to turn on
        }
    }
    else { // open for dual mode
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER)
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
    }

    // do set analog gain control
    if (IsModeIncall() == false) {
        mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice);
    }
    else {
        mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain
        mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume
    }
    return NO_ERROR;
}
status_t AudioResourceManager::TurnonAudioDeviceIncall(unsigned int mDlOutputDevice)
{
    ALOGD("TurnonAudioDeviceIncall mDlOutputDevice = 0x%x", mDlOutputDevice);

    SetMicInvserse(mMicInverseSetting);

    if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE) {
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_EARPIECER , AudioAnalogType::MUX_VOICE);
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_EARPIECER , AudioAnalogType::MUX_VOICE);
        mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
    }
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER) {
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_SPEAKERR , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_SPEAKERL , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
    }
    if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE)) {
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
    }
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX) {
        // do nothing
    }
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET) {
        // fix me , may not use HeadSetDetect
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETR , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogSetMux(AudioAnalogType::DEVICE_OUT_HEADSETL , AudioAnalogType::MUX_AUDIO);
        mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
    }
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)   {
        // do nothing
    }
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL) {
        //todo :: if htere is analog block need to turn onAsBinde
    }
    // do set analog gain control
    if (IsModeIncall() == false) {
        mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice);
    }
    else {
        // check TTY status to avoid override mic gain
        if (SpeechPhoneCallController::GetInstance()->CheckTtyNeedOn() == false){
            mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain
        }

        mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume
    }
    return NO_ERROR;
}
status_t AudioResourceManager::TurnonAudioDevice(unsigned int mDlOutputDevice)
{
    uint32 DeviceCount = PopCount(mDlOutputDevice);
    ALOGD("TurnonAudioDevice = 0x%x DeviceCount = %d", mDlOutputDevice, DeviceCount);

#ifdef EXTMD_LOOPBACK_TEST //BTSCO UL sound out from headset&Speaker
    if (mDlOutputDevice & AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET)
    {
        ALOGD("EXTMD_LOOPBACK_TEST TurnonAudioDevice() AnalogClose() DEVICE_OUT_HEADSETR (to reset DL sampling frequency)");
        mAudioAnalogInstance->AnalogClose(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        mDlOutputDevice = AUDIO_DEVICE_OUT_WIRED_HEADSET;
        ALOGD("EXTMD_LOOPBACK_TEST TurnonAudioDevice() mDlOutputDevice=0x%x", mDlOutputDevice);
    }
#endif

    if (DeviceCount == 1)
    {
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_EARPIECE)
        {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_EARPIECER, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER)
        {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKERR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if ((mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADSET) || (mDlOutputDevice & AUDIO_DEVICE_OUT_WIRED_HEADPHONE))
        {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_FM_TX)
        {
            // do nothing
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET)
        {
            // fix me , may not use headset
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_HEADSETR, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET)
        {
            // do nothing
        }
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_AUX_DIGITAL)
        {
            EnableAudioClock(AudioResourceManagerInterface::CLOCK_AUD_HDMI, true);
            //todo :: if htere is analog block need to turn on
        }
    }
    else // open for dual mode
    {
        if (mDlOutputDevice & AUDIO_DEVICE_OUT_SPEAKER)
        {
            mAudioAnalogInstance->AnalogOpen(AudioAnalogType::DEVICE_OUT_SPEAKER_HEADSET_R, AudioAnalogType::DEVICE_PLATFORM_MACHINE);
        }
    }

    // do set analog gain control
    if (IsModeIncall() == false)
    {
        mAudioVolumeInstance->setMasterVolume(mAudioVolumeInstance->getMasterVolume(), mAudioMode, mDlOutputDevice);
    }
    else
    {
        mAudioVolumeInstance->ApplyMicGain(GetIncallMicDevice(mDlOutputDevice), mAudioMode); // set incall mic gain
        mAudioVolumeInstance->setVoiceVolume(mAudioVolumeInstance->getVoiceVolume(), mAudioMode, mDlOutputDevice);// set DL volume
    }
    return NO_ERROR;
}