• android audio volume 知识点


    1

    frameworks/av/services/audiopolicy/common/managerdefinitions/include/VolumeCurve.h

    class VolumeCurvesForStream : public KeyedVector<device_category, sp<VolumeCurve> >
    {
    private:
        KeyedVector<device_category, sp<VolumeCurve> > mOriginVolumeCurves;
        KeyedVector<audio_devices_t, int> mIndexCur; /**< current volume index per device. */
        int mIndexMin; /**< min volume index. */
        int mIndexMax; /**< max volume index. */
        bool mCanBeMuted; /**< true is the stream can be muted. */
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    VolumeCurve代表一个音量曲线,即音量值与分贝值或者增益的对应关系。
    mCanBeMuted 表示该流是否可以被Mute
    int mIndexMin; 最小
    int mIndexMax; 最大
    可以看出 一个devices 对应 一个音量值
    一个 device_category 对应 一个VolumeCurve

    device_category是把设备分成了四类DEVICE_CATEGORY_HEADSET, DEVICE_CATEGORY_SPEAKER,DEVICE_CATEGORY_EARPIECE,DEVICE_CATEGORY_EXT_MEDIA. getDeviceCategory(audio_devices_t device)函数可以获得设备的分类。

    2

    frameworks/av/services/audiopolicy/common/managerdefinitions/include/VolumeCurve.h

    class VolumeCurvesCollection : public KeyedVector<audio_stream_type_t, VolumeCurvesForStream>,
                                   public IVolumeCurvesCollection
    {
    public:
        VolumeCurvesCollection()
        {
            // Create an empty collection of curves
            for (ssize_t i = 0 ; i < AUDIO_STREAM_CNT; i++) {
                audio_stream_type_t stream = static_cast<audio_stream_type_t>(i);
                KeyedVector::add(stream, VolumeCurvesForStream());
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    从中可以得到 每个 stream 对应一个 VolumeCurvesForStream

    3

    frameworks/av/services/audiopolicy/common/managerdefinitions/include/AudioPolicyConfig.h
    class AudioPolicyConfig 描述

    class AudioPolicyConfig
    {
    	private:
        		HwModuleCollection &mHwModules; /**< Collection of Module, with Profiles, i.e. Mix Ports. */
        		DeviceVector &mAvailableOutputDevices;
        		DeviceVector &mAvailableInputDevices;
        		sp<DeviceDescriptor> &mDefaultOutputDevices;
        		VolumeCurvesCollection *mVolumeCurves;
        		bool &mIsSpeakerDrcEnabled;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    AudioPolicyConfig类 成员声音类型(但是个指针,需要给他赋予内存)
    当然还包括其他重要的成员变量

    class AudioPolicyConfig 构造函数

    class AudioPolicyConfig
    {
    public:
        AudioPolicyConfig(HwModuleCollection &hwModules,
                          DeviceVector &availableOutputDevices,
                          DeviceVector &availableInputDevices,
                          sp<DeviceDescriptor> &defaultOutputDevices,
                          bool &isSpeakerDrcEnabled,
                          VolumeCurvesCollection *volumes = nullptr)
            : mHwModules(hwModules),
              mAvailableOutputDevices(availableOutputDevices),
              mAvailableInputDevices(availableInputDevices),
              mDefaultOutputDevices(defaultOutputDevices),
              mVolumeCurves(volumes),
              mIsSpeakerDrcEnabled(isSpeakerDrcEnabled)
        {}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    4

    AudioPolicyManager 构造函数

    #ifdef USE_XML_AUDIO_POLICY_CONF
        mVolumeCurves = new VolumeCurvesCollection();
        AudioPolicyConfig config(mHwModules, mAvailableOutputDevices, mAvailableInputDevices,
                                 mDefaultOutputDevice, speakerDrcEnabled,
                                 static_cast<VolumeCurvesCollection *>(mVolumeCurves));
        if (deserializeAudioPolicyXmlConfig(config) != NO_ERROR) {
    #else
        mVolumeCurves = new StreamDescriptorCollection();
        AudioPolicyConfig config(mHwModules, mAvailableOutputDevices, mAvailableInputDevices,
                                 mDefaultOutputDevice, speakerDrcEnabled);
        if ((ConfigParsingUtils::loadConfig(AUDIO_POLICY_VENDOR_CONFIG_FILE, config) != NO_ERROR) &&
                (ConfigParsingUtils::loadConfig(AUDIO_POLICY_CONFIG_FILE, config) != NO_ERROR)) {
    #endif
            ALOGE("could not load audio policy configuration file, setting defaults");
            config.setDefault();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    //构造函数 mVolumeCurves(volumes), 音量赋值给 mVolumeCurves。
    //把申请的空间给了 AudioPolicyConfig类 mVolumeCurves有成员

    5

    frameworks/av/services/audiopolicy/managerdefault/AudioPolicyManager.cpp

    #define AUDIO_POLICY_XML_CONFIG_FILE_NAME "audio_policy_configuration.xml"
    
    #ifdef USE_XML_AUDIO_POLICY_CONF
    // Treblized audio policy xml config will be located in /odm/etc or /vendor/etc.
    static const char *kConfigLocationList[] =
            {"/odm/etc", "/vendor/etc", "/system/etc"};
    static const int kConfigLocationListSize =
            (sizeof(kConfigLocationList) / sizeof(kConfigLocationList[0]));
    
    static status_t deserializeAudioPolicyXmlConfig(AudioPolicyConfig &config) {
        char audioPolicyXmlConfigFile[AUDIO_POLICY_XML_CONFIG_FILE_PATH_MAX_LENGTH];
        status_t ret;
    
        for (int i = 0; i < kConfigLocationListSize; i++) {
            PolicySerializer serializer;
            snprintf(audioPolicyXmlConfigFile,
                     sizeof(audioPolicyXmlConfigFile),
                     "%s/%s",
                     kConfigLocationList[i],
                     AUDIO_POLICY_XML_CONFIG_FILE_NAME);
            ret = serializer.deserialize(audioPolicyXmlConfigFile, config);
            if (ret == NO_ERROR) {
                break;
            }
        }
        return ret;
    }
    #endif
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    //解析 audio_policy_configuration.xml 文件,此xml 文件还会指定 volume的xml 文件是哪个。

    6

    frameworks/av/services/audiopolicy/common/managerdefinitions/src/Serializer.cpp

    status_t PolicySerializer::deserialize(const char *configFile, AudioPolicyConfig &config)
    {
        xmlDocPtr doc;
        doc = xmlParseFile(configFile);
        if (doc == NULL) {
            ALOGE("%s: Could not parse %s document.", __FUNCTION__, configFile);
            return BAD_VALUE;
        }
        xmlNodePtr cur = xmlDocGetRootElement(doc);
        if (cur == NULL) {
            ALOGE("%s: Could not parse %s document: empty.", __FUNCTION__, configFile);
            xmlFreeDoc(doc);
            return BAD_VALUE;
        }
    
        // deserialize volume section  解析声音文件
        VolumeTraits::Collection volumes;
        deserializeCollection<VolumeTraits>(doc, cur, volumes, &config); //解析音量相关的xml
        config.setVolumes(volumes); //并把得到值赋给 config
    
        // Global Configuration
        GlobalConfigTraits::deserialize(cur, config);
    
        xmlFreeDoc(doc);
        return android::OK;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    参考AudioPolicy–音量的控制

  • 相关阅读:
    3、Bean的生命周期
    MinIO:开源对象存储解决方案的领先者
    Java - IO 流
    【树莓派不吃灰系列】快速导航
    【LeetCode热题100】--155.最小栈
    如何做架构设计
    riscv fpga
    ETL是什么
    我与LBM的句号
    MATLAB | 全网唯一,使用MATLAB绘制精致的环形树状图
  • 原文地址:https://blog.csdn.net/aningxiaoxixi/article/details/125469042