使用 libaudiopolicyengineconfigurable.so
来取缔默认安卓音频引擎 libaudiopolicyenginedefault.so
,因为默认安卓音频引擎是通过代码来决定策略,然而 libaudiopolicyengineconfigurable 采用读取pfw
类型的文件来实现音频策略配置。
不需要修改代码,直接修改pfw配置文件就可以修改音频策略
audio_policy_configuration.xml
文件中 globalConfiguration
字段增加字段: engine_library="configurable"
audio_policy_engine_criterion_types.xml
和 audio_policy_engine_criteria.xml
文件存在就会启用
hardware\interfaces\audio\aidl\default\EngineConfigXmlConverter.cpp
void EngineConfigXmlConverter::init() {
...
if (getXsdcConfig()->hasCriteria() && getXsdcConfig()->hasCriterion_types()) {
AudioHalEngineConfig::CapSpecificConfig capSpecificConfig;
capSpecificConfig.criteriaV2 =
std::make_optional<>(VALUE_OR_FATAL((convertCapCriteriaCollectionToAidl(
getXsdcConfig()->getCriteria(), getXsdcConfig()->getCriterion_types()))));
...
当前主要是3大配置
device_for_input_source.pfw
不同的audio_source_t使用什么样的输入设备
device_for_product_strategy_phone.pfw
、device_for_product_strategy_media.pfw
…
不同的product_strategy_t使用什么样的输出设备
volumes.pfw
不同的audio_stream_type_t使用哪个stream type的音量曲线
eg: system的stream可以使用music的音量曲线
supDomain: DeviceForProductStrategy
supDomain: Media
domain: Device1
conf: ForceUseBtA2dpSpeaker
AvailableOutputDevices Includes BLUETOOTH_A2DP_SPEAKER
ForceUseForMedia Is BT_A2DP
component: /Policy/policy/product_strategies/vx_1005/selected_output_devices/mask
speaker = 0
spdif = 0
bluetooth_a2dp_speaker = 1
...
supDomain: DeviceForProductStrategy
supDomain: Assistant
domain: Device1
conf: RemoteSubmix
AvailableOutputDevices Includes REMOTE_SUBMIX
AvailableOutputDevicesAddresses Includes 0
component: /Policy/policy/product_strategies/assistant/selected_output_devices/mask
speaker = 0
remote_submix = 1
...
domain: Device2
#
# these following domains consists in device(s) that can co-exist with others
# e.g. ARC, SPDIF, AUX_LINE
#
conf: Selected
AvailableOutputDevices Includes HDMI_ARC
component: /Policy/policy/product_strategies/assistant/selected_output_devices/mask
hdmi_arc = 1
conf: NotSelected
component: /Policy/policy/product_strategies/assistant/selected_output_devices/mask
hdmi_arc = 0
...
domain: Device1
conf: ForceUseBtA2dpSpeaker
AvailableOutputDevices Includes BLUETOOTH_A2DP_SPEAKER
ForceUseForMedia Is BT_A2DP
component: /Policy/policy/product_strategies/vx_1005/selected_output_devices/mask
speaker = 0
spdif = 0
hdmi = 0
hdmi_arc = 0
bluetooth_a2dp_speaker = 1
usb_device = 0
conf: UsbDevice
AvailableOutputDevices Includes USB_DEVICE
component: /Policy/policy/product_strategies/vx_1005/selected_output_devices/mask
speaker = 0
spdif = 0
hdmi = 0
hdmi_arc = 0
bluetooth_a2dp_speaker = 0
usb_device = 1
每个criterion 定义: pfw中所有能使用的准则类型 audio_policy_engine_criteria.xml
frameworks/av/services/audiopolicy/engineconfigurable/config/example/common/audio_policy_engine_criteria.xml
...
/vendor/etc/audio_policy_engine_criteria.xml
是audio_policy_engine_criterion_types
python脚本根据audio_policy_engine_criterion_types.xml.in
文件自动生成。
capBuildPolicyCriterionTypes.py
,之前安卓版本使用buildPolicyCriterionTypes.py
的Python脚本。frameworks/av/services/audiopolicy/engineconfigurable/tools/
frameworks/av/services/audiopolicy/engineconfigurable/config/example/common/audio_policy_engine_criterion_types.xml.in
...
...
例如:配置输出设备策略
conf: UsbDevice
AvailableOutputDevices Includes USB_DEVICE
AvailableOutputDevices Excludes WIRED_HEADPHONE
ANY
ForceUseForCommunication Is BT_SCO
ALL
ForceUseForCommunication Is SPEAKER
TelephonyMode IsNot IN_CALL
component: /Policy/policy/product_strategies/vx_1000/selected_output_devices/mask
...
usb_accessory = 0
usb_device = 1
usb_headset = 0
speaker = 0
...
上面的config转化为伪代码的case:
if (AvailableOutputDevices 存在 USB_DEVICE) {
if (AvailableOutputDevices 不存在 WIRED_HEADPHONE) {
if (ForceUseForCommunication == BT_SCO ||
(ForceUseForCommunication == SPEAKER && TelephonyMode != IN_CALL)) {
return USB_DEVICE;
}
}
}
当前Google pfw支持3个SubSystem(Stream、InputSource、ProductStrategy)
frameworks\av\services\audiopolicy\engineconfigurable\parameter-framework\plugin\PolicySubsystem.cpp
// Provide creators to upper layer
addSubsystemObjectFactory(
new TSubsystemObjectFactory(
mStreamComponentName,
(1 << MappingKeyName))
);
addSubsystemObjectFactory(
new TSubsystemObjectFactory(
mInputSourceComponentName,
(1 << MappingKeyName))
);
addSubsystemObjectFactory(
new TSubsystemObjectFactory(
mProductStrategyComponentName, (1 << MappingKeyName))
);
分别通过下面3个函数推送到Engine中
frameworks\av\services\audiopolicy\engineconfigurable\parameter-framework\plugin\
/vendor/etc/parameter-framework/Structure/Policy/PolicySubsystem-CommonTypes.xml
修改完对应的pfw文件之后
parameter framework的pfw所在路径下mm -j
,将/vendor/etc/parameter-framework/
目录替换到平台即可