AudioPolicyManagerBase & AudioFlinger 的Inteface(hw module)初始化

AudioFlinger通过loadHwModule加载audio的各个interface(也叫hw module),各个interface就是audio的HAL。
Audioflinger不会主动调用 loadHwModule,而是由audiopolicy发起的,AudioFlinger是个执行机构。

在AudioPolicyManagerBase的构造函数中,能找到loadAudioPolicyConfig,这个函数负责解析 **/etc/audio_policy.conf这个配置文件,在这个文件中她会找出所有的Interface,audio_hw_module关键字定义的模块,比如primary、usb、a2dp、r_submix(WiDi用)。
在每个interface下面会包含若干个Outputs,有的还有Inputs,同时在每个Outputs/Inputs下面又包含若干个Profile,每个Profile描述了该profile支持sample rate,channel mask, devices & flags。

AudioPolicy将所有的这些信息用变量 Vector <HwModule *> mHwModules 保存,其中HwModule的关键字段如下
        class HwModule {
            const char *const mName; // base name of the audio HW module (primary, a2dp ...)
            audio_module_handle_t mHandle;
            Vector <IOProfile *> mOutputProfiles; // output profiles exposed by this module
            Vector <IOProfile *> mInputProfiles;  // input profiles exposed by this module
        };
接着AudioPolicy遍历 mHwModules ,调用 mHwModules[i]->mHandle = Audioflinger::loadHwModule(mHwModules[i]->mName)
在 Audioflinger load各个interface的so文件初始化各个interface,并返回该 interface 对应的 handle (audio_module_handle_t)。

同时还会遍历每个 HwModule 中的 mOutputProfiles, 并且通过 AudioFlinger::openOutput 打开每个output,并且此函数的返回值 audio_io_handle_t 被 AudioPolicy 保存在 DefaultKeyedVector<audio_io_handle_t, AudioOutputDescriptor *> mOutputs; 这个 audio_io_handle_t 在后续真正播放audio的时候会有用,具体还没有分析透。


另外,在 Audioflinger 初始化各个 interface 的时候,会将 handle 和 对应的device 保存在 DefaultKeyedVector<audio_module_handle_t, AudioHwDevice*>  mAudioHwDevs 中。
AudioHwDevice->audio_hw_device是HAL的核心数据结构,在audioflinger load各个interface的时候,会将so中对应函数的指针分别赋给这个变量对应的指针变量,这样Audioflinger就能通过它和HAL和kernel通信了。
其中的数据结构定义如下:
typedef int audio_module_handle_t;
AudioHwDevice:
        const audio_module_handle_t mHandle;
        const char * const mModuleName;
        audio_hw_device_t * const mHwDevice;
        const Flags mFlags;
type audio_hw_device audio_hw_device_t;
struct audio_hw_device {
    struct hw_device_t common;
    uint32_t (*get_supported_devices)(const struct audio_hw_device *dev);
    int (*init_check)(const struct audio_hw_device *dev);
    int (*set_voice_volume)(struct audio_hw_device *dev, float volume);
    int (*set_master_volume)(struct audio_hw_device *dev, float volume);
    int (*get_master_volume)(struct audio_hw_device *dev, float *volume);
    int (*set_mode)(struct audio_hw_device *dev, audio_mode_t mode);
    int (*set_mic_mute)(struct audio_hw_device *dev, bool state);
    int (*get_mic_mute)(const struct audio_hw_device *dev, bool *state);
    int (*set_parameters)(struct audio_hw_device *dev, const char *kv_pairs);
    char * (*get_parameters)(const struct audio_hw_device *dev,const char *keys);
    size_t (*get_input_buffer_size)(const struct audio_hw_device *dev, const struct audio_config *config);
    int (*open_output_stream)(struct audio_hw_device *dev,
                              audio_io_handle_t handle,
                              audio_devices_t devices,
                              audio_output_flags_t flags,
                              struct audio_config *config,
                              struct audio_stream_out **stream_out,
                              const char *address);
    void (*close_output_stream)(struct audio_hw_device *dev,
                                struct audio_stream_out* stream_out);
    int (*open_input_stream)(struct audio_hw_device *dev,
                             audio_io_handle_t handle,
                             audio_devices_t devices,
                             struct audio_config *config,
                             struct audio_stream_in **stream_in,
                             audio_input_flags_t flags,
                             const char *address,
                             audio_source_t source);
    void (*close_input_stream)(struct audio_hw_device *dev,
                               struct audio_stream_in *stream_in);
    int (*dump)(const struct audio_hw_device *dev, int fd);
    int (*set_master_mute)(struct audio_hw_device *dev, bool mute);

    int (*get_master_mute)(struct audio_hw_device *dev, bool *mute);


    /**     * Routing control     */
    /* Creates an audio patch between several source and sink ports.
     * The handle is allocated by the HAL and should be unique for this
     * audio HAL module. */
    int (*create_audio_patch)(struct audio_hw_device *dev,
                               unsigned int num_sources,
                               const struct audio_port_config *sources,
                               unsigned int num_sinks,
                               const struct audio_port_config *sinks,
                               audio_patch_handle_t *handle);

    /* Release an audio patch */
    int (*release_audio_patch)(struct audio_hw_device *dev,
                               audio_patch_handle_t handle);

    int (*get_audio_port)(struct audio_hw_device *dev,
                          struct audio_port *port);
    /* Set audio port configuration */
    int (*set_audio_port_config)(struct audio_hw_device *dev,
                         const struct audio_port_config *config);
};
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值