手机上有多少设备都是通过配置xml文件来实现的,然后在构造AudioPolicyManager实例时进行文件解析,初始化相关的变量。比如有些手机有两个麦克风,通常叫做内置麦克风,和副麦克风,但是有些低端手机只会配置内置的麦克风。
通过全局搜索可以看到
/device/google/dragon/device.mk:USE_XML_AUDIO_POLICY_CONF := 1
在源码的device.mk中有USE_XML_AUDIO_POLICY_CONF的定义,device.mk应该是手机上所有硬件的配置目录,芯片开发商可以根据自己产品的需要另外配置相关的产品。
以下/device/google/dragon/项目为基础进行分析,这样不会涉及到公司的代码,这个目录应该是标准的配置目录,其它芯片厂商可以修改配置文件进行自己项目的配置。需要掌握Android的编译原理,后面会有专门的章节进行介绍。
目前只重点关注这两句话
PRODUCT_COPY_FILES += \
frameworks/av/services/audiopolicy/config/default_volume_tables.xml:system/etc/default_volume_tables.xml \
$(LOCAL_PATH)/audio_policy_configuration.xml:system/etc/audio_policy_configuration.xml
LOCAL_PATH := $(call my-dir)
上面这个Android.mk编译语句表示返回当前被调用的文件路径。PRODUCT_COPY_FILES的意思是将前面的文件复制到后面的文件中,最后编译打包/system/etc/default_volume_tables.xml和/system/etc/audio_policy_configuration.xml会放到手机的/system/etc/目录中,可以通过adb shell进行查看。
这两个文件在AudioPolicyManager中已经指定文件目录
#define AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH 128
#define AUDIO_POLICY_XML_CONFIG_FILE_NAME "audio_policy_configuration.xml"
接下来通过这两个文件来分析解析过程,配置不同可能解析的文件的路径不相同,文件的内容也会不相同,但是原理是相同的。
查看if分支
IVolumeCurvesCollection *mVolumeCurves; // Volume Curves per use case and device category
mVolumeCurves = new VolumeCurvesCollection();
AudioPolicyConfig config(mHwModules, mAvailableOutputDevices, mAvailableInputDevices,
mDefaultOutputDevice, speakerDrcEnabled,
static_cast<VolumeCurvesCollection *>(mVolumeCurves));
if (deserializeAudioPolicyXmlConfig(config) != NO_ERROR) {
ALOGE("could not load audio policy configuration file, setting defaults");
config.setDefault();
}
有对HwModules进行配置,有输入输出以及默认设备的配置,和音量曲线分布的配置。定义一个config变量,然后调用deserializeAudioPolicyXmlConfig函数进行初始化。
/