Loading policy_hal/AudioPolicyManager.cpp +39 −8 Original line number Diff line number Diff line /* * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Not a contribution. * * Copyright (C) 2009 The Android Open Source Project Loading Loading @@ -69,6 +69,10 @@ #endif // DOLBY_END namespace android { /*audio policy: workaround for truncated touch sounds*/ //FIXME: workaround for truncated touch sounds // to be removed when the problem is handled by system UI #define TOUCH_SOUND_FIXED_DELAY_MS 100 #ifdef VOICE_CONCURRENCY audio_output_flags_t AudioPolicyManagerCustom::getFallBackPath() { Loading Loading @@ -417,6 +421,10 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d } closeAllInputs(); /*audio policy: fix call volume over USB*/ // As the input device list can impact the output device selection, update // getDeviceForStrategy() cache updateDevicesAndOutputs(); if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) { audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/); Loading Loading @@ -1068,9 +1076,17 @@ void AudioPolicyManagerCustom::setForceUse(audio_policy_force_use_t usage, checkOutputForAllStrategies(); updateDevicesAndOutputs(); /*audio policy: workaround for truncated touch sounds*/ //FIXME: workaround for truncated touch sounds // to be removed when the problem is handled by system UI uint32_t delayMs = 0; uint32_t waitMs = 0; if (usage == AUDIO_POLICY_FORCE_FOR_COMMUNICATION) { delayMs = TOUCH_SOUND_FIXED_DELAY_MS; } if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) { audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, true /*fromCache*/); updateCallRouting(newDevice); waitMs = updateCallRouting(newDevice, delayMs); } // Use reverse loop to make sure any low latency usecases (generally tones) // are not routed before non LL usecases (generally music). Loading @@ -1082,11 +1098,12 @@ void AudioPolicyManagerCustom::setForceUse(audio_policy_force_use_t usage, for (size_t i = mOutputs.size(); i > 0; i--) { sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(i-1); audio_devices_t newDevice = getNewOutputDevice(outputDesc, true /*fromCache*/); if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || outputDesc != mPrimaryOutput) { setOutputDevice(outputDesc, newDevice, (newDevice != AUDIO_DEVICE_NONE)); if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (outputDesc != mPrimaryOutput)) { waitMs = setOutputDevice(outputDesc, newDevice, (newDevice != AUDIO_DEVICE_NONE), delayMs); } if (forceVolumeReeval && (newDevice != AUDIO_DEVICE_NONE)) { applyStreamVolumes(outputDesc, newDevice, 0, true); applyStreamVolumes(outputDesc, newDevice, waitMs, true); } } Loading Loading @@ -1160,6 +1177,11 @@ status_t AudioPolicyManagerCustom::stopSource(sp<AudioOutputDescriptor> outputDe dev, force, delayMs); /*audio policy: fix media volume after ringtone*/ // re-apply device specific volume if not done by setOutputDevice() if (!force) { applyStreamVolumes(desc, dev, delayMs); } } } // update the outputs if stopping one with a stream that can affect notification routing Loading Loading @@ -1266,6 +1288,10 @@ status_t AudioPolicyManagerCustom::startSource(sp<AudioOutputDescriptor> outputD if (strategy == STRATEGY_SONIFICATION) { mpClientInterface->invalidateStream(AUDIO_STREAM_ACCESSIBILITY); } if (waitMs > muteWaitMs) { *delayMs = waitMs - muteWaitMs; } } else { // handle special case for sonification while in call Loading Loading @@ -2160,11 +2186,16 @@ status_t AudioPolicyManagerCustom::startInput(audio_io_handle_t input, mpClientInterface->onDynamicPolicyMixStateUpdate(inputDesc->mPolicyMix->mDeviceAddress, MIX_STATE_MIXING); } if (mInputs.activeInputsCountOnDevices() == 0) { /*audio policy: fix capture indication to sound trigger service*/ // indicate active capture to sound trigger service if starting capture from a mic on // primary HW module audio_devices_t device = getNewInputDevice(input); audio_devices_t primaryInputDevices = availablePrimaryInputDevices(); if (((device & primaryInputDevices & ~AUDIO_DEVICE_BIT_IN) != 0) && mInputs.activeInputsCountOnDevices(primaryInputDevices) == 0) { SoundTrigger::setCaptureState(true); } setInputDevice(input, getNewInputDevice(input), true /* force */); setInputDevice(input, device, true /* force */); // automatically enable the remote submix output when input is started if not // used by a policy mix of type MIX_TYPE_RECORDERS Loading Loading
policy_hal/AudioPolicyManager.cpp +39 −8 Original line number Diff line number Diff line /* * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved. * Copyright (c) 2013-2017 The Linux Foundation. All rights reserved. * Not a contribution. * * Copyright (C) 2009 The Android Open Source Project Loading Loading @@ -69,6 +69,10 @@ #endif // DOLBY_END namespace android { /*audio policy: workaround for truncated touch sounds*/ //FIXME: workaround for truncated touch sounds // to be removed when the problem is handled by system UI #define TOUCH_SOUND_FIXED_DELAY_MS 100 #ifdef VOICE_CONCURRENCY audio_output_flags_t AudioPolicyManagerCustom::getFallBackPath() { Loading Loading @@ -417,6 +421,10 @@ status_t AudioPolicyManagerCustom::setDeviceConnectionStateInt(audio_devices_t d } closeAllInputs(); /*audio policy: fix call volume over USB*/ // As the input device list can impact the output device selection, update // getDeviceForStrategy() cache updateDevicesAndOutputs(); if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) { audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, false /*fromCache*/); Loading Loading @@ -1068,9 +1076,17 @@ void AudioPolicyManagerCustom::setForceUse(audio_policy_force_use_t usage, checkOutputForAllStrategies(); updateDevicesAndOutputs(); /*audio policy: workaround for truncated touch sounds*/ //FIXME: workaround for truncated touch sounds // to be removed when the problem is handled by system UI uint32_t delayMs = 0; uint32_t waitMs = 0; if (usage == AUDIO_POLICY_FORCE_FOR_COMMUNICATION) { delayMs = TOUCH_SOUND_FIXED_DELAY_MS; } if (mEngine->getPhoneState() == AUDIO_MODE_IN_CALL && hasPrimaryOutput()) { audio_devices_t newDevice = getNewOutputDevice(mPrimaryOutput, true /*fromCache*/); updateCallRouting(newDevice); waitMs = updateCallRouting(newDevice, delayMs); } // Use reverse loop to make sure any low latency usecases (generally tones) // are not routed before non LL usecases (generally music). Loading @@ -1082,11 +1098,12 @@ void AudioPolicyManagerCustom::setForceUse(audio_policy_force_use_t usage, for (size_t i = mOutputs.size(); i > 0; i--) { sp<SwAudioOutputDescriptor> outputDesc = mOutputs.valueAt(i-1); audio_devices_t newDevice = getNewOutputDevice(outputDesc, true /*fromCache*/); if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || outputDesc != mPrimaryOutput) { setOutputDevice(outputDesc, newDevice, (newDevice != AUDIO_DEVICE_NONE)); if ((mEngine->getPhoneState() != AUDIO_MODE_IN_CALL) || (outputDesc != mPrimaryOutput)) { waitMs = setOutputDevice(outputDesc, newDevice, (newDevice != AUDIO_DEVICE_NONE), delayMs); } if (forceVolumeReeval && (newDevice != AUDIO_DEVICE_NONE)) { applyStreamVolumes(outputDesc, newDevice, 0, true); applyStreamVolumes(outputDesc, newDevice, waitMs, true); } } Loading Loading @@ -1160,6 +1177,11 @@ status_t AudioPolicyManagerCustom::stopSource(sp<AudioOutputDescriptor> outputDe dev, force, delayMs); /*audio policy: fix media volume after ringtone*/ // re-apply device specific volume if not done by setOutputDevice() if (!force) { applyStreamVolumes(desc, dev, delayMs); } } } // update the outputs if stopping one with a stream that can affect notification routing Loading Loading @@ -1266,6 +1288,10 @@ status_t AudioPolicyManagerCustom::startSource(sp<AudioOutputDescriptor> outputD if (strategy == STRATEGY_SONIFICATION) { mpClientInterface->invalidateStream(AUDIO_STREAM_ACCESSIBILITY); } if (waitMs > muteWaitMs) { *delayMs = waitMs - muteWaitMs; } } else { // handle special case for sonification while in call Loading Loading @@ -2160,11 +2186,16 @@ status_t AudioPolicyManagerCustom::startInput(audio_io_handle_t input, mpClientInterface->onDynamicPolicyMixStateUpdate(inputDesc->mPolicyMix->mDeviceAddress, MIX_STATE_MIXING); } if (mInputs.activeInputsCountOnDevices() == 0) { /*audio policy: fix capture indication to sound trigger service*/ // indicate active capture to sound trigger service if starting capture from a mic on // primary HW module audio_devices_t device = getNewInputDevice(input); audio_devices_t primaryInputDevices = availablePrimaryInputDevices(); if (((device & primaryInputDevices & ~AUDIO_DEVICE_BIT_IN) != 0) && mInputs.activeInputsCountOnDevices(primaryInputDevices) == 0) { SoundTrigger::setCaptureState(true); } setInputDevice(input, getNewInputDevice(input), true /* force */); setInputDevice(input, device, true /* force */); // automatically enable the remote submix output when input is started if not // used by a policy mix of type MIX_TYPE_RECORDERS Loading