一、AudioHAL介绍
AudioHAL的上层为AudioFlinger,AudioHAL下层为TiniAlsa(Android下一个简约的Alsa版本)。
AudioHAL分为两部分:
一部分为各种音频设备,每种音频设备由一个独立的库文件实现:如audio.a2dp.default.so(管理蓝牙a2dp音频),audio.usb.default.so(管理usb外接的音频),audio.primary.default.so(管理设备上的大部分音频)。
另一部分为厂家自己实现的音频策略,Android下提供了默认一套音频策略,当厂家有特殊的音频策略时,可以在这部分修改实现。
AudioHAL的核心文件是audio_hw.c,AudioHAL内部采样各种结构体管理AudioStream,如下为高通AudioHAL的结构体图:
二、AudioHAL相关接口
IDevice.hal
IDevicesFactory.hal
IPrimaryDevice
IStream
IStreamIn
IStreamOut
IStreamOutCallback
IStreamOutEventCallback
IStreamOutLatencyModeCallback
三、AudioHAL相关类
StreamHalInterface
frameworks/av/media/libaudiohal/include/media/audiohal/StreamHalInterface.h
class StreamHalInterface : public virtual RefBase{}
class StreamOutHalInterfaceCallback : public virtual RefBase {}
class StreamOutHalInterfaceEventCallback : public virtual RefBase {}
class StreamOutHalInterfaceLatencyModeCallback : public virtual RefBase {}
class StreamOutHalInterface : public virtual StreamHalInterface {}
class StreamInHalInterface : public virtual StreamHalInterface {}
DevicesFactoryHalInterface
frameworks/av/media/libaudiohal/DevicesFactoryHalInterface.cpp
frameworks/av/media/libaudiohal/include/media/audiohal/DevicesFactoryHalInterface.h
class DevicesFactoryHalCallback : public RefBase{}
class DevicesFactoryHalInterface : public RefBase{}
DeviceHalInterface
frameworks/av/media/libaudiohal/include/media/audiohal/DeviceHalInterface.h
class DeviceHalInterface : public RefBase{}
StreamHalHidl
frameworks/av/media/libaudiohal/impl/StreamHalHidl.cpp
frameworks/av/media/libaudiohal/impl/StreamHalHidl.h
class StreamHalHidl : public virtual StreamHalInterface, public CoreConversionHelperHidl{}
class StreamOutHalHidl : public StreamOutHalInterface, public StreamHalHidl {}
class StreamInHalHidl : public StreamInHalInterface, public StreamHalHidl {}
DeviceHalHidl
frameworks/av/media/libaudiohal/impl/DeviceHalHidl.cpp
frameworks/av/media/libaudiohal/impl/DeviceHalHidl.h
class DeviceHalHidl : public DeviceHalInterface, public CoreConversionHelperHidl{}
Device
hardware/interfaces/audio/core/all-versions/default/Device.cpp
hardware/interfaces/audio/core/all-versions/default/include/core/default/Device.h
struct Device : public IDevice, public ParametersUtil {}
StreamOut
hardware/interfaces/audio/core/all-versions/default/StreamOut.cpp
hardware/interfaces/audio/core/all-versions/default/include/core/default/StreamOut.h
struct StreamOut : public IStreamOut {}
StreamIn
hardware/interfaces/audio/core/all-versions/default/StreamIn.cpp
hardware/interfaces/audio/core/all-versions/default/include/core/default/StreamIn.h
struct StreamIn : public IStreamIn {}
四、AudioHAL文件
service.cpp
Device.cpp
DevicesFactory.cpp
ParametersUtil.cpp
PrimaryDevice.cpp
Stream.cpp
StreamIn.cpp
StreamOut.cpp
CoreUtils.cpp
Generators.cpp
PolicyConfig.cpp
audio_hw.c
platform_info.c
voice.c
acdb.c
a2dp.c
audio_extn.c
audiozoom.c
audio_perf.c
cirrus_playback.c
dsm_feedback.c
ext_speaker.c
hfp.c
hwdep_cal.c
maxxaudio.c
sndmonitor.c
soundtrigger.c
spkr_protection.c
tfa_98xx.c
usb.c
utils.c
voice_extn.c
五、AudioHAL函数
str_parms_get_int:
str_parms_get_str:
str_parms_to_str:
str_parms_destroy:
str_parms_del:
list_init:用于初始化一个链表。它的作用是创建一个头节点,并将头节点的next和prev指针都指向自己,从而形成一个空的循环链表。
list_for_each:一个宏定义,用于遍历链表。它的作用是遍历链表中的每个节点,并执行指定的操作。
list_head:list_head是Linux内核中的一个数据结构,用于实现双向链表。它定义在linux/types.h头文件中
list_empty:list_empty函数是一个静态内联函数,用于检查一个链表是否为空。它接受一个指向链表头部的指针作为参数,并返回一个整数值。如果链表为空,返回1;否则,返回0。
list_remove:一个列表的方法,用于从列表中移除指定的元素。
list_add_tail:用于将新节点插入到链表尾部的函数。它接受两个参数,new表示要插入的新节点,head表示链表的头节点。
atoi:
sscanf:
dlsym:一个用于从动态链接库或可执行文件中获取符号地址的函数。