概述
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);
/* 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)初始化所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复