audio policy: LE audio broadcast routing policy
Implement routing policy for LE audio broadcast device.
LE audio broadcast device is only used if:
- No call is active
- Either MEDIA or SONIFICATION_RESPECTFUL is the highest priority active strategy
OR the LE audio unicast device is not active
Bug: 213188698
Test: make
Change-Id: I47eb42066fe41c01867c35b1256241037583420b
diff --git a/services/audiopolicy/enginedefault/src/Engine.cpp b/services/audiopolicy/enginedefault/src/Engine.cpp
index dc34a38..cc24381 100644
--- a/services/audiopolicy/enginedefault/src/Engine.cpp
+++ b/services/audiopolicy/enginedefault/src/Engine.cpp
@@ -344,6 +344,30 @@
(getForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA) == AUDIO_POLICY_FORCE_SPEAKER)) {
devices2 = availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_SPEAKER);
}
+
+ // LE audio broadcast device is only used if:
+ // - No call is active
+ // - either MEDIA or SONIFICATION_RESPECTFUL is the highest priority active strategy
+ // OR the LE audio unicast device is not active
+ if (devices2.isEmpty() && !isInCall()
+ && (strategy == STRATEGY_MEDIA || strategy == STRATEGY_SONIFICATION_RESPECTFUL)) {
+ legacy_strategy topActiveStrategy = STRATEGY_NONE;
+ for (const auto &ps : getOrderedProductStrategies()) {
+ if (outputs.isStrategyActive(ps)) {
+ topActiveStrategy = mLegacyStrategyMap.find(ps) != end(mLegacyStrategyMap) ?
+ mLegacyStrategyMap.at(ps) : STRATEGY_NONE;
+ break;
+ }
+ }
+
+ if (topActiveStrategy == STRATEGY_NONE || topActiveStrategy == STRATEGY_MEDIA
+ || topActiveStrategy == STRATEGY_SONIFICATION_RESPECTFUL
+ || !outputs.isAnyDeviceTypeActive(getAudioDeviceOutLeAudioUnicastSet())) {
+ devices2 =
+ availableOutputDevices.getDevicesFromType(AUDIO_DEVICE_OUT_BLE_BROADCAST);
+ }
+ }
+
if (devices2.isEmpty() && (getLastRemovableMediaDevices().size() > 0)) {
if ((getForceUse(AUDIO_POLICY_FORCE_FOR_MEDIA) != AUDIO_POLICY_FORCE_NO_BT_A2DP)) {
// Get the last connected device of wired and bluetooth a2dp