Loading services/audiopolicy/enginedefault/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ cc_library_shared { "libaudiopolicyengine_config", ], shared_libs: [ "com.android.media.audioserver-aconfig-cc", "libaudio_aidl_conversion_common_cpp", "libaudiofoundation", "libaudiopolicy", Loading services/audiopolicy/enginedefault/src/Engine.cpp +59 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <PolicyAudioPort.h> #include <IOProfile.h> #include <AudioIODescriptorInterface.h> #include <com_android_media_audioserver.h> #include <policy.h> #include <media/AudioContainers.h> #include <utils/String8.h> Loading Loading @@ -154,12 +155,58 @@ status_t Engine::setForceUse(audio_policy_force_use_t usage, audio_policy_forced return EngineBase::setForceUse(usage, config); } bool Engine::isBtScoActive(DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const { if (availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) { return false; } // SCO is active if: // 1) we are in a call and SCO is the preferred device for PHONE strategy if (isInCall() && audio_is_bluetooth_out_sco_device( getPreferredDeviceTypeForLegacyStrategy(availableOutputDevices, STRATEGY_PHONE))) { return true; } // 2) A strategy for which the preferred device is SCO is active for (const auto &ps : getOrderedProductStrategies()) { if (outputs.isStrategyActive(ps) && !getPreferredAvailableDevicesForProductStrategy(availableOutputDevices, ps) .getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) { return true; } } // 3) a ringtone is active and SCO is used for ringing if (outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_RING)) && (getForceUse(AUDIO_POLICY_FORCE_FOR_VIBRATE_RINGING) == AUDIO_POLICY_FORCE_BT_SCO)) { return true; } // 4) an active input is routed from SCO DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices(); const auto &inputs = getApmObserver()->getInputs(); if (inputs.activeInputsCountOnDevices(availableInputDevices.getDevicesFromType( AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) > 0) { return true; } return false; } void Engine::filterOutputDevicesForStrategy(legacy_strategy strategy, DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const { DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices(); if (com::android::media::audioserver::use_bt_sco_for_media()) { // remove A2DP and LE Audio devices whenever BT SCO is in use if (isBtScoActive(availableOutputDevices, outputs)) { availableOutputDevices.remove( availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllA2dpSet())); availableOutputDevices.remove( availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllBleSet())); } } switch (strategy) { case STRATEGY_SONIFICATION_RESPECTFUL: { if (!(isInCall() || outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_VOICE_CALL)))) { Loading Loading @@ -418,15 +465,27 @@ DeviceVector Engine::getDevicesForStrategyInt(legacy_strategy strategy, getLastRemovableMediaDevices(GROUP_WIRED, excludedDevices)); } } if (com::android::media::audioserver::use_bt_sco_for_media()) { if (devices2.isEmpty() && isBtScoActive(availableOutputDevices, outputs)) { devices2 = availableOutputDevices.getFirstDevicesFromTypes( { AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO}); } } if ((devices2.isEmpty()) && (getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK) == AUDIO_POLICY_FORCE_ANALOG_DOCK)) { devices2 = availableOutputDevices.getDevicesFromType( AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET); } if (devices2.isEmpty()) { devices2 = availableOutputDevices.getFirstDevicesFromTypes({ AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_SPEAKER}); } DeviceVector devices3; if (strategy == STRATEGY_MEDIA) { // ARC, SPDIF and AUX_LINE can co-exist with others. Loading services/audiopolicy/enginedefault/src/Engine.h +3 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,9 @@ private: DeviceVector getDisabledDevicesForInputSource( const DeviceVector& availableInputDevices, audio_source_t inputSource) const; bool isBtScoActive(DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const; std::map<product_strategy_t, legacy_strategy> mLegacyStrategyMap; }; } // namespace audio_policy Loading Loading
services/audiopolicy/enginedefault/Android.bp +1 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ cc_library_shared { "libaudiopolicyengine_config", ], shared_libs: [ "com.android.media.audioserver-aconfig-cc", "libaudio_aidl_conversion_common_cpp", "libaudiofoundation", "libaudiopolicy", Loading
services/audiopolicy/enginedefault/src/Engine.cpp +59 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,7 @@ #include <PolicyAudioPort.h> #include <IOProfile.h> #include <AudioIODescriptorInterface.h> #include <com_android_media_audioserver.h> #include <policy.h> #include <media/AudioContainers.h> #include <utils/String8.h> Loading Loading @@ -154,12 +155,58 @@ status_t Engine::setForceUse(audio_policy_force_use_t usage, audio_policy_forced return EngineBase::setForceUse(usage, config); } bool Engine::isBtScoActive(DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const { if (availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) { return false; } // SCO is active if: // 1) we are in a call and SCO is the preferred device for PHONE strategy if (isInCall() && audio_is_bluetooth_out_sco_device( getPreferredDeviceTypeForLegacyStrategy(availableOutputDevices, STRATEGY_PHONE))) { return true; } // 2) A strategy for which the preferred device is SCO is active for (const auto &ps : getOrderedProductStrategies()) { if (outputs.isStrategyActive(ps) && !getPreferredAvailableDevicesForProductStrategy(availableOutputDevices, ps) .getDevicesFromTypes(getAudioDeviceOutAllScoSet()).isEmpty()) { return true; } } // 3) a ringtone is active and SCO is used for ringing if (outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_RING)) && (getForceUse(AUDIO_POLICY_FORCE_FOR_VIBRATE_RINGING) == AUDIO_POLICY_FORCE_BT_SCO)) { return true; } // 4) an active input is routed from SCO DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices(); const auto &inputs = getApmObserver()->getInputs(); if (inputs.activeInputsCountOnDevices(availableInputDevices.getDevicesFromType( AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET)) > 0) { return true; } return false; } void Engine::filterOutputDevicesForStrategy(legacy_strategy strategy, DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const { DeviceVector availableInputDevices = getApmObserver()->getAvailableInputDevices(); if (com::android::media::audioserver::use_bt_sco_for_media()) { // remove A2DP and LE Audio devices whenever BT SCO is in use if (isBtScoActive(availableOutputDevices, outputs)) { availableOutputDevices.remove( availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllA2dpSet())); availableOutputDevices.remove( availableOutputDevices.getDevicesFromTypes(getAudioDeviceOutAllBleSet())); } } switch (strategy) { case STRATEGY_SONIFICATION_RESPECTFUL: { if (!(isInCall() || outputs.isActiveLocally(toVolumeSource(AUDIO_STREAM_VOICE_CALL)))) { Loading Loading @@ -418,15 +465,27 @@ DeviceVector Engine::getDevicesForStrategyInt(legacy_strategy strategy, getLastRemovableMediaDevices(GROUP_WIRED, excludedDevices)); } } if (com::android::media::audioserver::use_bt_sco_for_media()) { if (devices2.isEmpty() && isBtScoActive(availableOutputDevices, outputs)) { devices2 = availableOutputDevices.getFirstDevicesFromTypes( { AUDIO_DEVICE_OUT_BLUETOOTH_SCO_CARKIT, AUDIO_DEVICE_OUT_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_OUT_BLUETOOTH_SCO}); } } if ((devices2.isEmpty()) && (getForceUse(AUDIO_POLICY_FORCE_FOR_DOCK) == AUDIO_POLICY_FORCE_ANALOG_DOCK)) { devices2 = availableOutputDevices.getDevicesFromType( AUDIO_DEVICE_OUT_ANLG_DOCK_HEADSET); } if (devices2.isEmpty()) { devices2 = availableOutputDevices.getFirstDevicesFromTypes({ AUDIO_DEVICE_OUT_DGTL_DOCK_HEADSET, AUDIO_DEVICE_OUT_SPEAKER}); } DeviceVector devices3; if (strategy == STRATEGY_MEDIA) { // ARC, SPDIF and AUX_LINE can co-exist with others. Loading
services/audiopolicy/enginedefault/src/Engine.h +3 −0 Original line number Diff line number Diff line Loading @@ -109,6 +109,9 @@ private: DeviceVector getDisabledDevicesForInputSource( const DeviceVector& availableInputDevices, audio_source_t inputSource) const; bool isBtScoActive(DeviceVector& availableOutputDevices, const SwAudioOutputCollection &outputs) const; std::map<product_strategy_t, legacy_strategy> mLegacyStrategyMap; }; } // namespace audio_policy Loading