Audio解析strategy配置文件

简介

audio_policy_configuration配置文件配置了音频Audio的设备、数据流信息,而strategy相关配置文件则配置某种streamType的音频使用哪种音量曲线,如voice_call和music他们的音量曲线是不一样,后者这种关系叫做strategy策略.
默认解析路径在/vendor/etc/audio_policy_engine_configuration.xml下,如果找不到可以去:

char* POLICY_USAGE_LIBRARY_PATH[] = {"/odm/etc/", "/vendor/etc/", "/system/etc/"};

下去寻找,解析过程同audio_policy_configuration解析一样,解析时机就在audio_policy_configuration解析完成后,初始化时就立即解析strategy部分,这里直接给出xml文件解析后对应c++实体类,解析过程不在分析,如需要了解解析过程可按照以下逻辑去查看:

1. EngineBase.cpp的loadAudioPolicyEngineConfig()
2. EngineConfig.cpp的parse()

奇怪,查看自己的手机Android11,发现没找到audio_policy_engine_configuration这个文件,难道阉割了吗?

配置文件与实体类

audio_policy_engine_default_stream_volumes.xml

<volumeGroup><name>voice_call</name><indexMin>1</indexMin><indexMax>7</indexMax><volume deviceCategory="DEVICE_CATEGORY_HEADSET"><point>0,-4200</point><point>33,-2800</point><point>66,-1400</point><point>100,0</point></volume><volume deviceCategory="DEVICE_CATEGORY_EXT_MEDIA" ref="DEFAULT_MEDIA_VOLUME_CURVE"/>
</volumeGroup>

上面ref标签是引用了另一个文件内的内容,内容类似于这个样子:

<reference name="DEFAULT_MEDIA_VOLUME_CURVE"><!-- Default Media reference Volume Curve --><point>1,-5800</point><point>20,-4000</point><point>60,-1700</point><point>100,0</point>
</reference>

最终结果就是每个volume标签完全是一样的,没有什么不同!

实体类

class VolumeGroup {const std::string mName; //对应name标签const volume_group_t mId; //代码生成ID,与配置文件内容无关VolumeCurves mGroupVolumeCurves; //音量曲线集合,集合内为VolumeCurve类型
}

VolumeCurves与上面VolumeGroup是包含关系,其内部结构如下:

class VolumeCurves : public KeyedVector<device_category, sp<VolumeCurve> >,public IVolumeCurves {int mIndexMin;  //对应indexMix标签 int mIndexMax;  //对应indexMax标签StreamTypeVector<audio_stream_type_t> mStreams;   //集合类,哪些stream可以使用我的音乐曲线类
}class VolumeCurve {const device_category mDeviceCategory;  //对应deviceCategory标签SortedVector<CurvePoint> mCurvePoints;  //集合类型
}struct CurvePoint
{uint32_t mIndex;        //对应标签point第一个值int mAttenuationInMb;   //对应point标签第二个值
}

最后的结果是是每个volumeGroup标签对应VolumeGroup实体类,每个volume标签对应一个VolumeCures音乐曲线类;并且和indexMix、indexMax标签组合对应成一个VolumeCurves音乐曲线集合类;主要注意两点:

  1. VolumeCurves是一个Vector集合类型,内部元素是VolumeCurve类型
  2. VolumeCurves的mStreams也是集合类型,会与后面的strategies配置文件中的streamType联系在一起,表明我这些音乐曲线支持哪些streamType

audio_policy_engine_product_strategies.xml策略文件

<ProductStrategy name="STRATEGY_PHONE"><AttributesGroup streamType="AUDIO_STREAM_VOICE_CALL" volumeGroup="voice_call"><Attributes> <Usage value="AUDIO_USAGE_VOICE_COMMUNICATION"/> </Attributes></AttributesGroup><AttributesGroup streamType="AUDIO_STREAM_BLUETOOTH_SCO" volumeGroup="bluetooth_sco"><Attributes> <Flags value="AUDIO_FLAG_SCO"/> </Attributes></AttributesGroup>
</ProductStrategy>

ProductStrategy实体类

class ProductStrategy {std::string mName = "STRATEGY_PHONE";//集合类型,但是有点特殊,针对一个Attributes标签,其内部就有1个AudioAttributes元素;有n个AudioAttributes标签,就有n个AudioAttributes元素AudioAttributesVector mAttributesVector;product_strategy_t mId;  //代码自动生成
}using AudioAttributesVector = std::vector<AudioAttributes>;
//AudioAttributes封装了一个streamType支持某个volumeGroup
struct AudioAttributes {audio_stream_type_t mStream ; //对应streamType标签volume_group_t mVolumeGroup ; //支持音乐曲线group的id,指向上面的VolumeGroup实体类对象的idaudio_attributes_t mAttributes; //对应一个Attributes标签
};
//对应一个Attributes标签标签里面的内容,content_type,usage等等
typedef struct {audio_content_type_t content_type;audio_usage_t        usage;audio_source_t       source;audio_flags_mask_t   flags;char                 tags[AUDIO_ATTRIBUTES_TAGS_MAX_SIZE]; /* UTF8 */
} __attribute__((packed)) audio_attributes_t; // sent through Binder;

这里有点奇怪,AudioAttributesVector内部元素有多少,是根据Attributes标签来的,有多个标签,就有多少个AudioAttributes,并且每个AudioAttributes类型里面指向了当前streamType支持哪些音乐曲线;Attributes标签内部的内容主要是指明stream的用途,如AUDIO_USAGE_VOICE_COMMUNICATION是用于语音通话;最后联系图如下:

针对ProductStrategy来说

  • 每一个ProductStrategy标签对应一个实体类ProductStrategy
  • 每一个Attributes标签对应一个AudioAttributes结构体,结构体内部mStream代表streamType标签,mAttributes代表Attributes标签,mVolumeGroup是一个id,与VolumeGroup对象的id建立连接

针对VolumeGroup来说

  • 每个volumeGroup标签对应一个volumeGroup实体类,并且有一个mId成员
  • 每个volume标签对应一个VolumeCurve实体类
  • VolumeCurves实体类是集合类型,集合内元素是VolumeCurve实体类,并且是volumeGroup的内的成员变量;

ProductStrategy策略实体类表示内部有多个AudioAttributes属性集合,这个AudioAttributes表示特定的streamType和mAttributes的音频支持特定的音乐属性VolumeGroup,通过AudioAttributes的mVolumeGroup成员变量与VolumeGroup的mId成员相等建立连接,而VolumeGroup内也有多个VolumeCurve音乐曲线属性集合,可以任由AudioAttributes来选择

通常我们在播放音频时,我们会指定音频的content_type、usage等等attr属性,通过这些属性决定这个音频是哪个streamType?
这个过程就是上面的文件配置好的,转化为c++实体类建立好映射,在ProductStrategy实体类的AudioAttributes成员的audio_attributes_t mAttributes成员,封装了音频的content_type、usage等等,找到这个就能决定它是哪个streamType,以及后续的工作

Audio解析strategy配置文件相关推荐

  1. php 解析配置文件,php 解析ini配置文件

    ①函数 parse_ini_file  说明:解析一个配置文件,并以数组的形式返回其中的设置. w3c地址:http://www.w3school.com.cn/php/func_filesystem ...

  2. java中项目启动时加载_如何在项目启动时,加载或解析某配置文件

    在web项目中有很多时候需要在项目启动时就执行一些方法,而且只需要执行一次,比如:加载解析自定义的配置文件.初始化数据库信息等等,在项目启动时就直接执行一些方法,可以减少很多繁琐的操作. 在工作中遇到 ...

  3. 解析conf配置文件的c++神器

    有一个解析conf配置文件的代码,写的非常精简.贴出来,供大家借鉴. 不说了.上代码 //Config.h #pragma once #include <string> #include ...

  4. python解析yml配置文件

    一.如何读取yml配置文件中的配置 二.yml配置文件 三.解析yml配置文件 python 代码 一.如何读取yml配置文件中的配置 本文主要演示如何使用 python 代码,解析 yml 格式的配 ...

  5. 在C语言中解析json配置文件

    业务需求 在C或者C++项目中常常需要解析配置文件,我们常见的配置文件格式一般就是.ini,xml,lua或者是一般的text文件,这些格式比较恼人的一个问题就是数据格式过于冗余,或者功能不够强大,不 ...

  6. 深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件

    文章目录: 1 yaml说明介绍 1.1 yaml介绍 1.2 YAML 相关网址 2 YAML的python包PyYAML的使用 2.1 关于PyYAML的相关网址 2.2 安装PyYAML 2.3 ...

  7. 用C语言实现解析简单配置文件的小工具

    本文介绍作者写的一个小工具,简单的代码中包含了C语言对字符串的处理技巧,对文本文件的简单解析,二进制文件的数据复制的方法,以及格式化输出文本文件的示例. 工具的输入是如下内容的配置文件: [plain ...

  8. linux ini文件,Shell script - Linux下解析ini配置文件

    导语Linux 有时候需要统计多台主机上面的数据,比如合并N多主机的日志,然后进行下一步的分析.这个时候如果直接把所有主机IP写死到脚本中的话,下次新增一台主机,就需要再去修改脚本,如果涉及到多个脚本 ...

  9. python解析nginx配置文件_Nginx情景分析之配置文件解析

    现在针对nginx源码分析的blog和文章已经很多了,之前我也看过不少,大家的分析都很不错.在这里,我不想写太多重复的内容,只是针对在我分析代码和查阅blog的过程中,发现的一些比较晦涩或者某些细节有 ...

  10. Springboot框架学习笔记------项目搭建、程序解析、配置文件的作用

    今天开始学习spring boot,这个框架整合spring和springmvc,简化了很多的配置,这是目前的理解. 搭建流程: 1.从idea搭建,利用maven创建项目,前提是联网,需要下载mav ...

最新文章

  1. 感知器调参之梯度下降法
  2. npm run build 打包 之后怎么用_基于createreactapp打包编译自己的第三方UI组件库
  3. 十天冲刺开发第八天个人工作总结
  4. Windows 10的应用体验之二
  5. WDS 自动化部署安装 win2008 服务器实验
  6. 进口配额管理和出口配额管理_SAP采购管理模块中的quot;配额协议quot;应用详解...
  7. 求两个数的公约数java_java中怎样求两个数的最大公约数?
  8. 前台html基础标签7.6
  9. html论坛页面怎么做_用php怎么做一个简单的留言页面?
  10. SharePoint 2010: Claims-based Authentication
  11. Java二维码登录流程实现(包含短地址生成,含部分代码)
  12. 2020学而思笔记小初课程百度云网盘分享下载
  13. uC/Modbus 用户手册——第一节
  14. IT人员必学最基础知识(四)——补充总结
  15. 数据库与身份认证 - 04
  16. IE8中的可访问性功能(一):光标浏览
  17. 同岗不同命,软件测试的薪资跨度到底有多大?
  18. stm32-A4988驱动步进电机
  19. 安卓App抓包经验谈
  20. 关于2023年度陕西省职称评审申报发表论文的相关规定

热门文章

  1. NOI 十连测 Zbox loves stack
  2. 浪潮服务器键盘自动输空格,键盘空格键的常用技巧分享
  3. Android学习--04(打地鼠小游戏App源码+提示框Toast+提示窗口Dialog+菜单Menu+下拉框Spinner)
  4. kit框架详解(基于go-kit)
  5. 解决IISASP调用XmlHTTP出现msxml3.dll (0x80070005) 拒绝访问的错误
  6. [动态规划-0] 前言-我的动态规划学习之路
  7. 新手前端程序员就职指南之 - 入职第一天
  8. java6发布_Minecraft Java版 1.13-pre6 发布
  9. [LOCAL] 画画图(结论 + DP + 常数分析) | 错题本
  10. 实例99:使用AEGAN对MNIST数据集压缩特征及重建