Android AudioHAL

一、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:一个用于从动态链接库或可执行文件中获取符号地址的函数。

六、AudioHAL流程分析

AudioHAL Device::setParameters流程分析

Android13 AudioHAL Device::setParameters流程分析-CSDN博客

  • 30
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值