解析audio_policy.conf(android_audio)

本文详细介绍了Android系统中音频策略配置文件`audio_policy.conf`的结构和内容,包括设备类型、采样率、通道配置等关键参数,并展示了加载配置的源码流程,涉及`ConfigParsingUtils`类的使用,对于理解Android音频系统的内部工作原理具有指导意义。

 参考文章  https://blog.youkuaiyun.com/qq_33750826/article/details/82455026

/vendor/etc/audio_policy.conf 加载 或者 /system/etc/audio_policy.conf 

audio_hw_modules {
  primary {    //一个module对应厂家提供的一个so文件
    global_configuration {
      attached_output_devices AUDIO_DEVICE_OUT_SPEAKER
      default_output_device AUDIO_DEVICE_OUT_SPEAKER
      attached_input_devices AUDIO_DEVICE_IN_BUILTIN_MIC
      audio_hal_version 3.0
    }
    devices {
      speaker {
        type AUDIO_DEVICE_OUT_SPEAKER
        gains {
          gain_1 {
            mode AUDIO_GAIN_MODE_JOINT
            min_value_mB -8400
            max_value_mB 4000
            default_value_mB 0
            step_value_mB 100
          }
        }
      }
    }
    outputs {     //一个module里面可以有多个outputs
      primary {   //一个output里,表明参数
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices speaker                      //设备  喇叭
        flags AUDIO_OUTPUT_FLAG_PRIMARY      //这个代表是默认设备
      }
    }
    inputs {      //一个module里面可以有多个inputs
      primary {
        sampling_rates 8000|16000
        channel_masks AUDIO_CHANNEL_IN_MONO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_BUILTIN_MIC   //设备  麦克
      }
    }
  }
  r_submix {
    global_configuration {
      attached_input_devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
      audio_hal_version 2.0
    }
    outputs {
      submix {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_OUT_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_OUT_REMOTE_SUBMIX
      }
    }
    inputs {
      submix {
        sampling_rates 48000
        channel_masks AUDIO_CHANNEL_IN_STEREO
        formats AUDIO_FORMAT_PCM_16_BIT
        devices AUDIO_DEVICE_IN_REMOTE_SUBMIX
      }
    }
  }
}

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

cnode节点在  system/core/include/cutils/config_utils.h

typedef struct cnode cnode;


struct cnode
{
    cnode *next;
    cnode *first_child;
    cnode *last_child;
    const char *name;
    const char *value;
};
//static
status_t ConfigParsingUtils::loadConfig(const char *path, AudioPolicyConfig &config)
{
    cnode *root;
    char *data;

    data = (char *)load_file(path, NULL);
    if (data == NULL) {
        return -ENODEV;
    }
    root = config_node("", "");
    config_load(root, data);

    HwModuleCollection hwModules;
    loadHwModules(root, hwModules, config);

    // legacy audio_policy.conf files have one global_configuration section, attached to primary.
    loadGlobalConfig(root, config, hwModules.getModuleFromName(AUDIO_HARDWARE_MODULE_ID_PRIMARY));

    config.setHwModules(hwModules);

    config_free(root);
    free(root);
    free(data);

    ALOGI("loadAudioPolicyConfig() loaded %s\n", path);

    return NO_ERROR;
}
### audio_policy_configuration.xml 和 audio_policy.conf 的区别 #### 文件格式与结构 `audio_policy_configuration.xml` 是一个基于 XML 格式的配置文件,用于定义音频策略的核心逻辑,包括音频设备、音频流类型、混音规则等。它具有清晰的层级结构,便于开发者维护和扩展。例如,该文件中可以包含对不同音频硬件模块的引用,如 A2DP、USB、Remote Submix 等音频 HAL 的配置: ```xml <!-- A2dp Audio HAL --> <xi:include href="a2dp_audio_policy_configuration.xml"/> <!-- Usb Audio HAL --> <xi:include href="usb_audio_policy_configuration.xml"/> <!-- Remote Submix Audio HAL --> <xi:include href="r_submix_audio_policy_configuration.xml"/> ``` 该文件通常位于 `frameworks/av/services/audiopolicy/config/` 目录下,是 Android 音频策略服务的重要配置源[^1]。 相比之下,`audio_policy.conf` 是一个传统的文本配置文件,格式较为简单,通常以键值对形式定义音频策略。它主要用于早期版本的 Android 系统,支持基于硬件抽象层(HAL)的音频策略配置,但不具备 XML 文件那样的结构化和可扩展性。 #### 配置内容与功能 `audio_policy_configuration.xml` 更加结构化,支持定义音频流、设备、混音规则、音频 HAL 的绑定关系等。例如,可以定义特定音频流在不同设备上的路由规则,以及音频策略服务在不同场景下的行为模式。 `audio_policy.conf` 则主要用于定义音频设备的路径、音频 HAL 的加载方式等基础配置。它通常用于定义音频硬件模块的路径、默认设备等信息,例如: ``` audio_hw_modules { primary { outputs { primary { sampling_rates = 44100 channel_masks = AUDIO_CHANNEL_OUT_STEREO formats = AUDIO_FORMAT_PCM_16_BIT } } inputs { primary { sampling_rates = 44100 channel_masks = AUDIO_CHANNEL_IN_STEREO formats = AUDIO_FORMAT_PCM_16_BIT } } } } ``` #### 使用场景与兼容性 `audio_policy_configuration.xml` 是现代 Android 系统(尤其是 Android 9 及以上版本)推荐使用的音频策略配置方式,它支持模块化配置,便于通过 `<xi:include>` 引入不同硬件模块的策略配置,提高了可维护性和灵活性。 `audio_policy.conf` 则更多用于旧版本的 Android 系统或某些特定平台,尤其是一些尚未完全迁移到 XML 配置体系的设备。它在结构上较为扁平,缺乏 XML 文件的层级化表达能力,因此在复杂音频策略场景下维护成本较高。 #### 可扩展性与维护性 由于 XML 文件支持模块化设计,`audio_policy_configuration.xml` 可以通过引入多个子配置文件(如 `a2dp_audio_policy_configuration.xml`)来实现不同音频硬件模块的独立配置,从而提升系统的可维护性和可扩展性。 `audio_policy.conf` 则通常需要将所有配置信息集中在一个文件中,难以实现模块化管理,尤其在音频策略复杂的情况下,容易导致配置文件臃肿且不易维护。 ### 总结 | 特性 | audio_policy_configuration.xml | audio_policy.conf | |------|-------------------------------|-------------------| | 格式 | XML | 文本键值对 | | 结构 | 层级化,支持模块化 | 扁平化,集中式 | | 功能 | 支持音频流、设备、混音规则等完整策略定义 | 主要用于定义音频硬件模块路径和基本参数 | | 使用场景 | Android 9+ 及现代系统 | 旧版本 Android 或特定平台 | | 可维护性 | 高,支持模块化配置 | 低,配置集中且不易维护 | ###
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值