status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
        audio_policy_dev_state_t state,
        const char *device_address)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }

#ifdef MTK_AUDIO
    bool bSkipCheck = false;
    if (mHeadsetDetect!=NULL) {
        if (mHeadsetDetect->mCbkEnable == true) {
            bSkipCheck = true;
        }
    }
    if (false == bSkipCheck) {
        if (!settingsAllowed()) {
            return PERMISSION_DENIED;
        }
    }
#else
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
#endif
    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
        return BAD_VALUE;
    }
    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
        return BAD_VALUE;
    }

    ALOGV("setDeviceConnectionState()");
    Mutex::Autolock _l(mLock);
#ifdef MTK_AUDIO
//#ifdef MTK_HEADSET_DETECT
    if(!kHeadsetjavaStart && mHeadsetDetect!=NULL)
    {
        //if this function is called by other threads, headsetdetect can exit.
        if(!mHeadsetDetect->isCurrentThread())
        {
            kHeadsetjavaStart = true;
            mHeadsetDetect->stop();
        }
    }
//#endif
#endif
    return mAudioPolicyManager->setDeviceConnectionState(device,
            state, device_address);
}
status_t AudioPolicyService::setPhoneState(audio_mode_t state)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (uint32_t(state) >= AUDIO_MODE_CNT) {
        return BAD_VALUE;
    }

    ALOGD("+setPhoneState()");
#ifdef MTK_AUDIO // routing first and set mode later
//    char value[PROPERTY_VALUE_MAX];
//    property_get("af.policy.invertModeRout", value, "0");
//    int bflag=atoi(value);
//    if (bflag == 1
//#ifdef EVDO_DT_SUPPORT  //EVDO should use default order
//        && state != 5
//#endif
//)
#ifdef EVDO_DT_SUPPORT
    if (state !=AUDIO_MODE_IN_CALL_EXTERNAL)
#else
    if (1)
#endif
    {
        // Routing
        Mutex::Autolock _l(mLock);
        mAudioPolicyManager->setPhoneState(state);
        mPhoneState = state;
        // Set mode
        AudioSystem::setMode(state);
    }
    else
    {
        AudioSystem::setMode(state);
        Mutex::Autolock _l(mLock);
        mAudioPolicyManager->setPhoneState( state);
        mPhoneState = state;
    }
#else // original Google code

    // TODO: check if it is more appropriate to do it in platform specific policy manager
    AudioSystem::setMode(state);

    Mutex::Autolock _l(mLock);
    mAudioPolicyManager->setPhoneState(state);
    mPhoneState = state;
#endif
    ALOGD("-setPhoneState()");
    return NO_ERROR;
}
status_t AudioPolicyService::initStreamVolume(audio_stream_type_t stream,
                                            int indexMin,
                                            int indexMax)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
        return BAD_VALUE;
    }
    Mutex::Autolock _l(mLock);
    mAudioPolicyManager->initStreamVolume(stream, indexMin, indexMax);
    return NO_ERROR;
}
status_t AudioPolicyService::setStreamVolumeIndex(audio_stream_type_t stream,
                                                  int index,
                                                  audio_devices_t device)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) {
        return BAD_VALUE;
    }
    Mutex::Autolock _l(mLock);
    return mAudioPolicyManager->setStreamVolumeIndex(stream,
                                                    index,
                                                    device);
}
status_t AudioPolicyService::setForceUse(audio_policy_force_use_t usage,
                                         audio_policy_forced_cfg_t config)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (usage < 0 || usage >= AUDIO_POLICY_FORCE_USE_CNT) {
        return BAD_VALUE;
    }
    if (config < 0 || config >= AUDIO_POLICY_FORCE_CFG_CNT) {
        return BAD_VALUE;
    }
    ALOGV("setForceUse()");
    Mutex::Autolock _l(mLock);
    mAudioPolicyManager->setForceUse(usage, config);
    return NO_ERROR;
}
status_t AudioPolicyService::setPhoneState(audio_mode_t state)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (uint32_t(state) >= AUDIO_MODE_CNT) {
        return BAD_VALUE;
    }

    ALOGV("setPhoneState()");

    // TODO: check if it is more appropriate to do it in platform specific policy manager
    AudioSystem::setMode(state);

    Mutex::Autolock _l(mLock);
    mAudioPolicyManager->setPhoneState(state);
    mPhoneState = state;
    return NO_ERROR;
}
status_t AudioPolicyService::setDeviceConnectionState(audio_devices_t device,
                                                  audio_policy_dev_state_t state,
                                                  const char *device_address,
                                                  const char *device_name)
{
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
    }
    if (!settingsAllowed()) {
        return PERMISSION_DENIED;
    }
    if (!audio_is_output_device(device) && !audio_is_input_device(device)) {
        return BAD_VALUE;
    }
    if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE &&
            state != AUDIO_POLICY_DEVICE_STATE_UNAVAILABLE) {
        return BAD_VALUE;
    }

    ALOGV("setDeviceConnectionState()");
    Mutex::Autolock _l(mLock);
    return mAudioPolicyManager->setDeviceConnectionState(device, state,
                                                         device_address, device_name);
}