Merge "audiopolicy: allows to fallback or not on default strategy/group" into sc-dev
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index f1fa7f5..74258a1 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -1997,7 +1997,8 @@
}
status_t AudioSystem::getProductStrategyFromAudioAttributes(const AudioAttributes& aa,
- product_strategy_t& productStrategy) {
+ product_strategy_t& productStrategy,
+ bool fallbackOnDefault) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
@@ -2006,7 +2007,8 @@
int32_t productStrategyAidl;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
- aps->getProductStrategyFromAudioAttributes(aaAidl, &productStrategyAidl)));
+ aps->getProductStrategyFromAudioAttributes(aaAidl, fallbackOnDefault,
+ &productStrategyAidl)));
productStrategy = VALUE_OR_RETURN_STATUS(
aidl2legacy_int32_t_product_strategy_t(productStrategyAidl));
return OK;
@@ -2025,7 +2027,8 @@
}
status_t AudioSystem::getVolumeGroupFromAudioAttributes(const AudioAttributes& aa,
- volume_group_t& volumeGroup) {
+ volume_group_t& volumeGroup,
+ bool fallbackOnDefault) {
const sp<IAudioPolicyService>& aps = AudioSystem::get_audio_policy_service();
if (aps == 0) return PERMISSION_DENIED;
@@ -2033,7 +2036,7 @@
legacy2aidl_AudioAttributes_AudioAttributesEx(aa));
int32_t volumeGroupAidl;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
- aps->getVolumeGroupFromAudioAttributes(aaAidl, &volumeGroupAidl)));
+ aps->getVolumeGroupFromAudioAttributes(aaAidl, fallbackOnDefault, &volumeGroupAidl)));
volumeGroup = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_volume_group_t(volumeGroupAidl));
return OK;
}
diff --git a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
index c8ab0ae..89fad5a 100644
--- a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
@@ -297,10 +297,12 @@
boolean isHapticPlaybackSupported();
AudioProductStrategy[] listAudioProductStrategies();
- int /* product_strategy_t */ getProductStrategyFromAudioAttributes(in AudioAttributesEx aa);
+ int /* product_strategy_t */ getProductStrategyFromAudioAttributes(in AudioAttributesEx aa,
+ boolean fallbackOnDefault);
AudioVolumeGroup[] listAudioVolumeGroups();
- int /* volume_group_t */ getVolumeGroupFromAudioAttributes(in AudioAttributesEx aa);
+ int /* volume_group_t */ getVolumeGroupFromAudioAttributes(in AudioAttributesEx aa,
+ boolean fallbackOnDefault);
void setRttEnabled(boolean enabled);
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index db4c28f..694f2d0 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -428,16 +428,17 @@
static bool isHapticPlaybackSupported();
static status_t listAudioProductStrategies(AudioProductStrategyVector &strategies);
- static status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
- product_strategy_t &productStrategy);
+ static status_t getProductStrategyFromAudioAttributes(
+ const AudioAttributes &aa, product_strategy_t &productStrategy,
+ bool fallbackOnDefault = true);
static audio_attributes_t streamTypeToAttributes(audio_stream_type_t stream);
static audio_stream_type_t attributesToStreamType(const audio_attributes_t &attr);
static status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups);
- static status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
- volume_group_t &volumeGroup);
+ static status_t getVolumeGroupFromAudioAttributes(
+ const AudioAttributes &aa, volume_group_t &volumeGroup, bool fallbackOnDefault = true);
static status_t setRttEnabled(bool enabled);
diff --git a/services/audiopolicy/AudioPolicyInterface.h b/services/audiopolicy/AudioPolicyInterface.h
index 7c0f2ce..9132086 100644
--- a/services/audiopolicy/AudioPolicyInterface.h
+++ b/services/audiopolicy/AudioPolicyInterface.h
@@ -285,13 +285,14 @@
virtual status_t listAudioProductStrategies(AudioProductStrategyVector &strategies) = 0;
- virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
- product_strategy_t &productStrategy) = 0;
+ virtual status_t getProductStrategyFromAudioAttributes(
+ const AudioAttributes &aa, product_strategy_t &productStrategy,
+ bool fallbackOnDefault) = 0;
virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups) = 0;
- virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
- volume_group_t &volumeGroup) = 0;
+ virtual status_t getVolumeGroupFromAudioAttributes(
+ const AudioAttributes &aa, volume_group_t &volumeGroup, bool fallbackOnDefault) = 0;
virtual bool isCallScreenModeSupported() = 0;
diff --git a/services/audiopolicy/engine/common/include/EngineBase.h b/services/audiopolicy/engine/common/include/EngineBase.h
index 3e42e2d..9bef97c 100644
--- a/services/audiopolicy/engine/common/include/EngineBase.h
+++ b/services/audiopolicy/engine/common/include/EngineBase.h
@@ -53,7 +53,7 @@
audio_policy_dev_state_t /*state*/) override;
product_strategy_t getProductStrategyForAttributes(
- const audio_attributes_t &attr) const override;
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const override;
audio_stream_type_t getStreamTypeForAttributes(const audio_attributes_t &attr) const override;
@@ -79,9 +79,11 @@
VolumeGroupVector getVolumeGroups() const override;
- volume_group_t getVolumeGroupForAttributes(const audio_attributes_t &attr) const override;
+ volume_group_t getVolumeGroupForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const override;
- volume_group_t getVolumeGroupForStreamType(audio_stream_type_t stream) const override;
+ volume_group_t getVolumeGroupForStreamType(
+ audio_stream_type_t stream, bool fallbackOnDefault = true) const override;
status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups) const override;
diff --git a/services/audiopolicy/engine/common/include/ProductStrategy.h b/services/audiopolicy/engine/common/include/ProductStrategy.h
index c505456..54625ea 100644
--- a/services/audiopolicy/engine/common/include/ProductStrategy.h
+++ b/services/audiopolicy/engine/common/include/ProductStrategy.h
@@ -129,7 +129,8 @@
* @param attr
* @return applicable product strategy for the given attribute, default if none applicable.
*/
- product_strategy_t getProductStrategyForAttributes(const audio_attributes_t &attr) const;
+ product_strategy_t getProductStrategyForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const;
product_strategy_t getProductStrategyForStream(audio_stream_type_t stream) const;
@@ -153,9 +154,11 @@
std::string getDeviceAddressForProductStrategy(product_strategy_t strategy) const;
- volume_group_t getVolumeGroupForAttributes(const audio_attributes_t &attr) const;
+ volume_group_t getVolumeGroupForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const;
- volume_group_t getVolumeGroupForStreamType(audio_stream_type_t stream) const;
+ volume_group_t getVolumeGroupForStreamType(
+ audio_stream_type_t stream, bool fallbackOnDefault = true) const;
volume_group_t getDefaultVolumeGroup() const;
diff --git a/services/audiopolicy/engine/common/src/EngineBase.cpp b/services/audiopolicy/engine/common/src/EngineBase.cpp
index 2137dd0..37e4caa 100644
--- a/services/audiopolicy/engine/common/src/EngineBase.cpp
+++ b/services/audiopolicy/engine/common/src/EngineBase.cpp
@@ -74,9 +74,10 @@
return NO_ERROR;
}
-product_strategy_t EngineBase::getProductStrategyForAttributes(const audio_attributes_t &attr) const
+product_strategy_t EngineBase::getProductStrategyForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault) const
{
- return mProductStrategies.getProductStrategyForAttributes(attr);
+ return mProductStrategies.getProductStrategyForAttributes(attr, fallbackOnDefault);
}
audio_stream_type_t EngineBase::getStreamTypeForAttributes(const audio_attributes_t &attr) const
@@ -320,14 +321,16 @@
return group;
}
-volume_group_t EngineBase::getVolumeGroupForAttributes(const audio_attributes_t &attr) const
+volume_group_t EngineBase::getVolumeGroupForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault) const
{
- return mProductStrategies.getVolumeGroupForAttributes(attr);
+ return mProductStrategies.getVolumeGroupForAttributes(attr, fallbackOnDefault);
}
-volume_group_t EngineBase::getVolumeGroupForStreamType(audio_stream_type_t stream) const
+volume_group_t EngineBase::getVolumeGroupForStreamType(
+ audio_stream_type_t stream, bool fallbackOnDefault) const
{
- return mProductStrategies.getVolumeGroupForStreamType(stream);
+ return mProductStrategies.getVolumeGroupForStreamType(stream, fallbackOnDefault);
}
status_t EngineBase::listAudioVolumeGroups(AudioVolumeGroupVector &groups) const
diff --git a/services/audiopolicy/engine/common/src/ProductStrategy.cpp b/services/audiopolicy/engine/common/src/ProductStrategy.cpp
index 060568a..d4cea5a 100644
--- a/services/audiopolicy/engine/common/src/ProductStrategy.cpp
+++ b/services/audiopolicy/engine/common/src/ProductStrategy.cpp
@@ -169,7 +169,7 @@
}
product_strategy_t ProductStrategyMap::getProductStrategyForAttributes(
- const audio_attributes_t &attr) const
+ const audio_attributes_t &attr, bool fallbackOnDefault) const
{
for (const auto &iter : *this) {
if (iter.second->matches(attr)) {
@@ -178,7 +178,7 @@
}
ALOGV("%s: No matching product strategy for attributes %s, return default", __FUNCTION__,
toString(attr).c_str());
- return getDefault();
+ return fallbackOnDefault? getDefault() : PRODUCT_STRATEGY_NONE;
}
audio_attributes_t ProductStrategyMap::getAttributesForStreamType(audio_stream_type_t stream) const
@@ -272,7 +272,8 @@
return at(psId)->getDeviceAddress();
}
-volume_group_t ProductStrategyMap::getVolumeGroupForAttributes(const audio_attributes_t &attr) const
+volume_group_t ProductStrategyMap::getVolumeGroupForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault) const
{
for (const auto &iter : *this) {
volume_group_t group = iter.second->getVolumeGroupForAttributes(attr);
@@ -280,10 +281,11 @@
return group;
}
}
- return getDefaultVolumeGroup();
+ return fallbackOnDefault ? getDefaultVolumeGroup() : VOLUME_GROUP_NONE;
}
-volume_group_t ProductStrategyMap::getVolumeGroupForStreamType(audio_stream_type_t stream) const
+volume_group_t ProductStrategyMap::getVolumeGroupForStreamType(
+ audio_stream_type_t stream, bool fallbackOnDefault) const
{
for (const auto &iter : *this) {
volume_group_t group = iter.second->getVolumeGroupForStreamType(stream);
@@ -292,7 +294,7 @@
}
}
ALOGW("%s: no volume group for %s, using default", __func__, toString(stream).c_str());
- return getDefaultVolumeGroup();
+ return fallbackOnDefault ? getDefaultVolumeGroup() : VOLUME_GROUP_NONE;
}
volume_group_t ProductStrategyMap::getDefaultVolumeGroup() const
diff --git a/services/audiopolicy/engine/interface/EngineInterface.h b/services/audiopolicy/engine/interface/EngineInterface.h
index a9b536b..f0a01d3 100644
--- a/services/audiopolicy/engine/interface/EngineInterface.h
+++ b/services/audiopolicy/engine/interface/EngineInterface.h
@@ -110,11 +110,12 @@
* Get the strategy selected for a given audio attributes.
*
* @param[in] audio attributes to get the selected @product_strategy_t followed by.
- *
+ * @param fallbackOnDefault if true, will return the fallback strategy if the attributes
+ * are not explicitly assigned to a given strategy.
* @return @product_strategy_t to be followed.
*/
virtual product_strategy_t getProductStrategyForAttributes(
- const audio_attributes_t &attr) const = 0;
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const = 0;
/**
* @brief getOutputDevicesForAttributes retrieves the devices to be used for given
@@ -271,19 +272,25 @@
* @brief getVolumeGroupForAttributes gets the appropriate volume group to be used for a given
* Audio Attributes.
* @param attr to be considered
+ * @param fallbackOnDefault if true, will return the fallback volume group if the attributes
+ * are not associated to any volume group.
* @return volume group associated to the given audio attributes, default group if none
* applicable, VOLUME_GROUP_NONE if no default group defined.
*/
- virtual volume_group_t getVolumeGroupForAttributes(const audio_attributes_t &attr) const = 0;
+ virtual volume_group_t getVolumeGroupForAttributes(
+ const audio_attributes_t &attr, bool fallbackOnDefault = true) const = 0;
/**
* @brief getVolumeGroupForStreamType gets the appropriate volume group to be used for a given
* legacy stream type
* @param stream type to be considered
+ * @param fallbackOnDefault if true, will return the fallback volume group if the stream type
+ * is not associated to any volume group.
* @return volume group associated to the given stream type, default group if none applicable,
* VOLUME_GROUP_NONE if no default group defined.
*/
- virtual volume_group_t getVolumeGroupForStreamType(audio_stream_type_t stream) const = 0;
+ virtual volume_group_t getVolumeGroupForStreamType(
+ audio_stream_type_t stream, bool fallbackOnDefault = true) const = 0;
/**
* @brief listAudioVolumeGroups introspection API to get the Audio Volume Groups, aka
diff --git a/services/audiopolicy/managerdefault/AudioPolicyManager.h b/services/audiopolicy/managerdefault/AudioPolicyManager.h
index d3ceb1b..d0c8673 100644
--- a/services/audiopolicy/managerdefault/AudioPolicyManager.h
+++ b/services/audiopolicy/managerdefault/AudioPolicyManager.h
@@ -329,11 +329,14 @@
return mEngine->listAudioProductStrategies(strategies);
}
- virtual status_t getProductStrategyFromAudioAttributes(const AudioAttributes &aa,
- product_strategy_t &productStrategy)
+ virtual status_t getProductStrategyFromAudioAttributes(
+ const AudioAttributes &aa, product_strategy_t &productStrategy,
+ bool fallbackOnDefault)
{
- productStrategy = mEngine->getProductStrategyForAttributes(aa.getAttributes());
- return productStrategy != PRODUCT_STRATEGY_NONE ? NO_ERROR : BAD_VALUE;
+ productStrategy = mEngine->getProductStrategyForAttributes(
+ aa.getAttributes(), fallbackOnDefault);
+ return (fallbackOnDefault && productStrategy == PRODUCT_STRATEGY_NONE) ?
+ BAD_VALUE : NO_ERROR;
}
virtual status_t listAudioVolumeGroups(AudioVolumeGroupVector &groups)
@@ -341,11 +344,13 @@
return mEngine->listAudioVolumeGroups(groups);
}
- virtual status_t getVolumeGroupFromAudioAttributes(const AudioAttributes &aa,
- volume_group_t &volumeGroup)
+ virtual status_t getVolumeGroupFromAudioAttributes(
+ const AudioAttributes &aa, volume_group_t &volumeGroup, bool fallbackOnDefault)
{
- volumeGroup = mEngine->getVolumeGroupForAttributes(aa.getAttributes());
- return volumeGroup != VOLUME_GROUP_NONE ? NO_ERROR : BAD_VALUE;
+ volumeGroup = mEngine->getVolumeGroupForAttributes(
+ aa.getAttributes(), fallbackOnDefault);
+ return (fallbackOnDefault && volumeGroup == VOLUME_GROUP_NONE) ?
+ BAD_VALUE : NO_ERROR;
}
bool isCallScreenModeSupported() override;
diff --git a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
index 399dfea..07122cc 100644
--- a/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
+++ b/services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp
@@ -1927,7 +1927,7 @@
}
Status AudioPolicyService::getProductStrategyFromAudioAttributes(
- const media::AudioAttributesEx& aaAidl, int32_t* _aidl_return) {
+ const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
product_strategy_t productStrategy;
@@ -1937,8 +1937,8 @@
}
Mutex::Autolock _l(mLock);
RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
- mAudioPolicyManager->getProductStrategyFromAudioAttributes(aa,
- productStrategy)));
+ mAudioPolicyManager->getProductStrategyFromAudioAttributes(
+ aa, productStrategy, fallbackOnDefault)));
*_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(
legacy2aidl_product_strategy_t_int32_t(productStrategy));
return Status::ok();
@@ -1959,8 +1959,8 @@
return Status::ok();
}
-Status AudioPolicyService::getVolumeGroupFromAudioAttributes(const media::AudioAttributesEx& aaAidl,
- int32_t* _aidl_return) {
+Status AudioPolicyService::getVolumeGroupFromAudioAttributes(
+ const media::AudioAttributesEx& aaAidl, bool fallbackOnDefault, int32_t* _aidl_return) {
AudioAttributes aa = VALUE_OR_RETURN_BINDER_STATUS(
aidl2legacy_AudioAttributesEx_AudioAttributes(aaAidl));
volume_group_t volumeGroup;
@@ -1971,7 +1971,8 @@
Mutex::Autolock _l(mLock);
RETURN_IF_BINDER_ERROR(
binderStatusFromStatusT(
- mAudioPolicyManager->getVolumeGroupFromAudioAttributes(aa, volumeGroup)));
+ mAudioPolicyManager->getVolumeGroupFromAudioAttributes(
+ aa, volumeGroup, fallbackOnDefault)));
*_aidl_return = VALUE_OR_RETURN_BINDER_STATUS(legacy2aidl_volume_group_t_int32_t(volumeGroup));
return Status::ok();
}
diff --git a/services/audiopolicy/service/AudioPolicyService.h b/services/audiopolicy/service/AudioPolicyService.h
index 149a858..a11b2cc 100644
--- a/services/audiopolicy/service/AudioPolicyService.h
+++ b/services/audiopolicy/service/AudioPolicyService.h
@@ -196,10 +196,12 @@
binder::Status listAudioProductStrategies(
std::vector<media::AudioProductStrategy>* _aidl_return) override;
binder::Status getProductStrategyFromAudioAttributes(const media::AudioAttributesEx& aa,
+ bool fallbackOnDefault,
int32_t* _aidl_return) override;
binder::Status listAudioVolumeGroups(
std::vector<media::AudioVolumeGroup>* _aidl_return) override;
binder::Status getVolumeGroupFromAudioAttributes(const media::AudioAttributesEx& aa,
+ bool fallbackOnDefault,
int32_t* _aidl_return) override;
binder::Status setRttEnabled(bool enabled) override;
binder::Status isCallScreenModeSupported(bool* _aidl_return) override;