通过对androia audio架构的整体分析,我们知道android audio framework中的audio flinger是通过操作audio hal层对间接的对底层设备进行操作的。(音频数据的读写以及各种参数的设定);
那么audio hal到底具备哪些能力,以及向上提供了哪些功能接口自然也是我们关注重点。
(个人认为分析软件无非就是两条路线,数据流与控制流;数据流是指软件底层具备怎样的能力,而控制流就是上层软件使用怎样的策略对底层进行控制。先了解底层具备怎样的能力,这样对于以后分析控制流会有很大的帮助,否则很容易出现知其然而不知其所以然的现象)
参照安卓官方文档(https://source.android.google.cn/devices/audio/implement),我们知道audio hal一定要实现system/media/audio/include/system/audio.h文件中的全部接口。那么我们就可以认为这个文件中所描述的就是audio hal的必须具备的基本能力与功能。
文件内容大概如图中表示,其中audio_hw_device 代表的是实际物理硬件的抽象;
这个对象中主要包括了如下两类内容:
(1)对实际物理硬件的操作,比如init_check检测硬件是否初始化完毕;set_mic_mute设置静音等;
(2)用stream对数据流进行抽象,用stream来对实际的物理数据来进行控制。使用audio_stream_in来表示输入流;用audio_stream_out表示输出流;
在stream中使用int (*set_device)(struct audio_stream *stream, audio_devices_t device);让stream与具体物理设备进行绑定。对此我们可以用linux中的文件描述符与文件之间的关系来进行理解。
由此,我们就可以大致理解audio底层软件的基本设计。由于audio hal只对上层提供了这些能力,那么上层软件中的audio fligner以及audio policy无非就是使用这些能力来做自己内部的逻辑设计,来满足不同的业务场景。
而且,对此我们也可以对上层软件设计的基本逻辑作出一些初步的判断,其基本时序为:
(1)使用load等方法,加载hal动态库。
(2)通过init_check来检车物理硬件初始化状态
(3)使用get_supported_devices来获得audio hal所支持的物理硬件类型
(4)通过open_output_stream或者open_input_stream方法创建输出、输入数据流。
(5)通过stream_out以及stream_in中的write以及read方法对数据进行读写。
(6)当需要操作音量等物理硬件能力时,则使用audio_hw_device 的相关方法。如果需要对数据流中的内容,则应该直接或者间接的调用到stream_out或者stream_in中的方法。
对此,我们则对audio hal层的内容有了大致的了解。
其中详细内容,我们以后会结合上层代码进一步分析。