我是靠谱客的博主 默默红酒,最近开发中收集的这篇文章主要介绍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);
};

最后

以上就是默默红酒为你收集整理的AudioPolicyManagerBase & AudioFlinger 的Inteface(hw module)初始化的全部内容,希望文章能够帮你解决AudioPolicyManagerBase & AudioFlinger 的Inteface(hw module)初始化所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部