Expose API to set audio device as non-default playback
Bug: 259094683
Test: atest AudioServiceHostTest AudioHostTest
Change-Id: I3120a7b46675925497187614db8fbeb4d24572a8
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index 520bad2..b58a26d 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -323,8 +323,11 @@
const AudioDeviceTypeAddrVector &devices) = 0;
virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy,
- device_role_t role) = 0;
+ device_role_t role,
+ const AudioDeviceTypeAddrVector &devices) = 0;
+ virtual status_t clearDevicesRoleForStrategy(product_strategy_t strategy,
+ device_role_t role) = 0;
virtual status_t getDevicesForRoleAndStrategy(product_strategy_t strategy,
device_role_t role,
diff --git a/services/audiopolicy/engine/common/include/EngineBase.h b/services/audiopolicy/engine/common/include/EngineBase.h
index 7d21ae0..8cfa592 100644
--- a/services/audiopolicy/engine/common/include/EngineBase.h
+++ b/services/audiopolicy/engine/common/include/EngineBase.h
@@ -105,7 +105,10 @@
status_t setDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role,
const AudioDeviceTypeAddrVector &devices) override;
- status_t removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role) override;
+ status_t removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role,
+ const AudioDeviceTypeAddrVector &devices) override;
+
+ status_t clearDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role) override;
status_t getDevicesForRoleAndStrategy(product_strategy_t strategy, device_role_t role,
AudioDeviceTypeAddrVector &devices) const override;
diff --git a/services/audiopolicy/engine/common/src/EngineBase.cpp b/services/audiopolicy/engine/common/src/EngineBase.cpp
index e34f08b..8015ae0 100644
--- a/services/audiopolicy/engine/common/src/EngineBase.cpp
+++ b/services/audiopolicy/engine/common/src/EngineBase.cpp
@@ -411,6 +411,36 @@
}
template <typename T>
+status_t removeDevicesRoleForT(
+ std::map<std::pair<T, device_role_t>, AudioDeviceTypeAddrVector>& tDevicesRoleMap,
+ T t, device_role_t role, const AudioDeviceTypeAddrVector &devices,
+ const std::string& logStr, std::function<bool(T)> p) {
+ if (!p(t)) {
+ ALOGE("%s invalid %s %u", __func__, logStr.c_str(), t);
+ return BAD_VALUE;
+ }
+
+ switch (role) {
+ case DEVICE_ROLE_PREFERRED:
+ case DEVICE_ROLE_DISABLED: {
+ auto it = tDevicesRoleMap.find(std::make_pair(t, role));
+ if (it != tDevicesRoleMap.end()) {
+ it->second = excludeDeviceTypeAddrsFrom(it->second, devices);
+ if (it->second.empty()) {
+ tDevicesRoleMap.erase(it);
+ }
+ }
+ } break;
+ case DEVICE_ROLE_NONE:
+ // Intentionally fall-through as it is not needed to set device role as none for a strategy.
+ default:
+ ALOGE("%s invalid role %d", __func__, role);
+ return BAD_VALUE;
+ }
+ return NO_ERROR;
+}
+
+template <typename T>
status_t removeAllDevicesRoleForT(
std::map<std::pair<T, device_role_t>, AudioDeviceTypeAddrVector>& tDevicesRoleMap,
T t, device_role_t role, const std::string& logStr, std::function<bool(T)> p) {
@@ -479,7 +509,18 @@
mProductStrategyDeviceRoleMap, strategy, role, devices, "strategy" /*logStr*/, p);
}
-status_t EngineBase::removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role)
+status_t EngineBase::removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role,
+ const AudioDeviceTypeAddrVector &devices)
+{
+ std::function<bool(product_strategy_t)> p = [this](product_strategy_t strategy) {
+ return mProductStrategies.find(strategy) != mProductStrategies.end();
+ };
+ return removeDevicesRoleForT(
+ mProductStrategyDeviceRoleMap, strategy, role, devices, "strategy" /*logStr*/, p);
+}
+
+status_t EngineBase::clearDevicesRoleForStrategy(product_strategy_t strategy,
+ device_role_t role)
{
std::function<bool(product_strategy_t)> p = [this](product_strategy_t strategy) {
return mProductStrategies.find(strategy) != mProductStrategies.end();
diff --git a/services/audiopolicy/engine/interface/EngineInterface.h b/services/audiopolicy/engine/interface/EngineInterface.h
index 70d25fc..b8e35ed 100644
--- a/services/audiopolicy/engine/interface/EngineInterface.h
+++ b/services/audiopolicy/engine/interface/EngineInterface.h
@@ -326,10 +326,22 @@
* for the given strategy
* @param strategy the audio strategy whose routing will be affected
* @param role the role of the devices for strategy
+ * @param devices the audio devices to be removed
* @return BAD_VALUE if the strategy or role is invalid,
* or NO_ERROR if the devices for this role was removed
*/
- virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy,
+ virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy, device_role_t role,
+ const AudioDeviceTypeAddrVector &devices) = 0;
+
+ /**
+ * @brief clearDevicesRoleForStrategy removes the role of all devices previously set
+ * for the given strategy
+ * @param strategy the audio strategy whose routing will be affected
+ * @param role the role of the devices for strategy
+ * @return BAD_VALUE if the strategy or role is invalid,
+ * or NO_ERROR if the devices for this role was removed
+ */
+ virtual status_t clearDevicesRoleForStrategy(product_strategy_t strategy,
device_role_t role) = 0;
/**
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
index f99f76e..248b5ae 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.cpp
@@ -3875,14 +3875,47 @@
}
}
-status_t AudioPolicyManager::removeDevicesRoleForStrategy(product_strategy_t strategy,
- device_role_t role)
+status_t
+AudioPolicyManager::removeDevicesRoleForStrategy(product_strategy_t strategy,
+ device_role_t role,
+ const AudioDeviceTypeAddrVector &devices) {
+ ALOGV("%s() strategy=%d role=%d %s", __func__, strategy, role,
+ dumpAudioDeviceTypeAddrVector(devices).c_str());
+
+ if (!areAllDevicesSupported(devices, audio_is_output_device, __func__)) {
+ return BAD_VALUE;
+ }
+ status_t status = mEngine->removeDevicesRoleForStrategy(strategy, role, devices);
+ if (status != NO_ERROR) {
+ ALOGW("Engine could not remove devices %s for strategy %d role %d",
+ dumpAudioDeviceTypeAddrVector(devices).c_str(), strategy, role);
+ return status;
+ }
+
+ checkForDeviceAndOutputChanges();
+
+ bool forceVolumeReeval = false;
+ // TODO(b/263479999): workaround for truncated touch sounds
+ // to be removed when the problem is handled by system UI
+ uint32_t delayMs = 0;
+ if (strategy == mCommunnicationStrategy) {
+ forceVolumeReeval = true;
+ delayMs = TOUCH_SOUND_FIXED_DELAY_MS;
+ updateInputRouting();
+ }
+ updateCallAndOutputRouting(forceVolumeReeval, delayMs);
+
+ return NO_ERROR;
+}
+
+status_t AudioPolicyManager::clearDevicesRoleForStrategy(product_strategy_t strategy,
+ device_role_t role)
{
ALOGV("%s() strategy=%d role=%d", __func__, strategy, role);
- status_t status = mEngine->removeDevicesRoleForStrategy(strategy, role);
+ status_t status = mEngine->clearDevicesRoleForStrategy(strategy, role);
if (status != NO_ERROR) {
- ALOGV("Engine could not remove preferred device for strategy %d status %d",
+ ALOGV("Engine could not remove device role for strategy %d status %d",
strategy, status);
return status;
}
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index 885f7c6..5079d69 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -299,8 +299,11 @@
const AudioDeviceTypeAddrVector &devices);
virtual status_t removeDevicesRoleForStrategy(product_strategy_t strategy,
- device_role_t role);
+ device_role_t role,
+ const AudioDeviceTypeAddrVector &devices);
+ virtual status_t clearDevicesRoleForStrategy(product_strategy_t strategy,
+ device_role_t role);
virtual status_t getDevicesForRoleAndStrategy(product_strategy_t strategy,
device_role_t role,
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 5c32209..eb33661 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -2154,8 +2154,31 @@
return binderStatusFromStatusT(status);
}
-Status AudioPolicyService::removeDevicesRoleForStrategy(int32_t strategyAidl,
- media::DeviceRole roleAidl) {
+Status AudioPolicyService::removeDevicesRoleForStrategy(
+ int32_t strategyAidl,
+ media::DeviceRole roleAidl,
+ const std::vector<AudioDevice>& devicesAidl) {
+ product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
+ aidl2legacy_int32_t_product_strategy_t(strategyAidl));
+ device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
+ aidl2legacy_DeviceRole_device_role_t(roleAidl));
+ AudioDeviceTypeAddrVector devices = VALUE_OR_RETURN_BINDER_STATUS(
+ convertContainer<AudioDeviceTypeAddrVector>(devicesAidl,
+ aidl2legacy_AudioDeviceTypeAddress));
+
+ if (mAudioPolicyManager == NULL) {
+ return binderStatusFromStatusT(NO_INIT);
+ }
+ Mutex::Autolock _l(mLock);
+ status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role, devices);
+ if (status == NO_ERROR) {
+ onCheckSpatializer_l();
+ }
+ return binderStatusFromStatusT(status);
+}
+
+Status AudioPolicyService::clearDevicesRoleForStrategy(int32_t strategyAidl,
+ media::DeviceRole roleAidl) {
product_strategy_t strategy = VALUE_OR_RETURN_BINDER_STATUS(
aidl2legacy_int32_t_product_strategy_t(strategyAidl));
device_role_t role = VALUE_OR_RETURN_BINDER_STATUS(
@@ -2164,7 +2187,7 @@
return binderStatusFromStatusT(NO_INIT);
}
Mutex::Autolock _l(mLock);
- status_t status = mAudioPolicyManager->removeDevicesRoleForStrategy(strategy, role);
+ status_t status = mAudioPolicyManager->clearDevicesRoleForStrategy(strategy, role);
if (status == NO_ERROR) {
onCheckSpatializer_l();
}
diff --git a/services/audiopolicy/service/AudioPolicyService.cpp b/services/audiopolicy/service/AudioPolicyService.cpp
index 2be5121..3cd74a0 100644
--- a/services/audiopolicy/service/AudioPolicyService.cpp
+++ b/services/audiopolicy/service/AudioPolicyService.cpp
@@ -145,6 +145,7 @@
BINDER_METHOD_ENTRY(isCallScreenModeSupported) \
BINDER_METHOD_ENTRY(setDevicesRoleForStrategy) \
BINDER_METHOD_ENTRY(removeDevicesRoleForStrategy) \
+BINDER_METHOD_ENTRY(clearDevicesRoleForStrategy) \
BINDER_METHOD_ENTRY(getDevicesForRoleAndStrategy) \
BINDER_METHOD_ENTRY(setDevicesRoleForCapturePreset) \
BINDER_METHOD_ENTRY(addDevicesRoleForCapturePreset) \
@@ -1318,6 +1319,7 @@
case TRANSACTION_setDevicesRoleForStrategy:
case TRANSACTION_setSupportedSystemUsages:
case TRANSACTION_removeDevicesRoleForStrategy:
+ case TRANSACTION_clearDevicesRoleForStrategy:
case TRANSACTION_getDevicesForRoleAndStrategy:
case TRANSACTION_getDevicesForAttributes:
case TRANSACTION_setAllowedCapturePolicy:
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 50f2180..b30e4f0 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -238,7 +238,12 @@
binder::Status setDevicesRoleForStrategy(
int32_t strategy, media::DeviceRole role,
const std::vector<AudioDevice>& devices) override;
- binder::Status removeDevicesRoleForStrategy(int32_t strategy, media::DeviceRole role) override;
+ binder::Status removeDevicesRoleForStrategy(
+ int32_t strategy, media::DeviceRole role,
+ const std::vector<AudioDevice>& devices) override;
+ binder::Status clearDevicesRoleForStrategy(
+ int32_t strategy,
+ media::DeviceRole role) override;
binder::Status getDevicesForRoleAndStrategy(
int32_t strategy, media::DeviceRole role,
std::vector<AudioDevice>* _aidl_return) override;