Audio解析strategy配置文件

Audio解析strategy配置文件,第1张

Audio解析strategy配置文件 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

    voice_call
    1
    7
    
        0,-4200
        33,-2800
        66,-1400
        100,0
    
    

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


    
        1,-5800
        20,-4000
        60,-1700
        100,0

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

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

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

class VolumeCurves : public KeyedVector >,
                     public IVolumeCurves {
    int mIndexMin;  //对应indexMix标签 
    int mIndexMax;  //对应indexMax标签
    StreamTypeVector mStreams;   //集合类,哪些stream可以使用我的音乐曲线类
}

class VolumeCurve {
    const device_category mDeviceCategory;  //对应deviceCategory标签
    SortedVector 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实体类
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封装了一个streamType支持某个volumeGroup
struct AudioAttributes {
    audio_stream_type_t mStream ; //对应streamType标签
    volume_group_t mVolumeGroup ; //支持音乐曲线group的id,指向上面的VolumeGroup实体类对象的id
    audio_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]; 
} __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,以及后续的工作

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5687714.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存