如下图为android音频hal层所处的位置:

从上图可以看出,HAL层下面使用TiniAlsa(Android下一个简约的Alsa版本)。HAL层分为两部分,一部分为各种音频设备,每种音频设备由一个独立的库文件实现:如audio.a2dp.default.so(管理蓝牙a2dp音频),audio.usb.default.so(管理usb外接的音频),audio.primary.default.so(管理设备上的大部分音频)。另一部分为厂家自己实现的音频策略,Android下提供了默认一套音频策略,当厂家有特殊的音频策略时,可以在这部分修改实现。HAL层上面就是音频系统的核心AudioFlinger,这里实现了各种输入、输出音频流的管理,管理实时可用的音频通道,为各种音频流选择音频通道,实现多个音频流的混音等。
这里只介绍HAL中各种音频设备的管理,如何确定各种音频设备支持哪些输入、输出音频等。AudioFlinger在加载音频设备库文件时,从/system/lib/hw/下查找以audio开头的库,同时根据audio_policy.conf中定义的音频设备名(如a2dp、usb、primary)作为库的第二部分名称,对于没有特别指定的,库的第三部分名称就是default,所以加载音频设备库的名称就可以确定了,如:audio.a2dp.default.so。每个音频库的实现接口都是一样的,这样就可以让AudioFlinger使用相同的接口调用不同音频设备。
android\external\bluetooth\bluedroid\audio_a2dp_hw\Audio_a2dp_hw.c
static int adev_open(const hw_module_t* module, const char* name,
hw_device_t** device)
{
struct a2dp_audio_device *adev
int ret
INFO(" adev_open in A2dp_hw module")
FNLOG()
if (strcmp(name, AUDIO_HARDWARE_INTERFACE) != 0)
{
ERROR("interface %s not matching [%s]", name, AUDIO_HARDWARE_INTERFACE)
return -EINVAL
}
adev = calloc(1, sizeof(struct a2dp_audio_device))
if (!adev)
return -ENOMEM
adev->device.common.tag = HARDWARE_DEVICE_TAG
adev->device.common.version = AUDIO_DEVICE_API_VERSION_2_0
adev->device.common.module = (struct hw_module_t *) module
adev->device.common.close = adev_close
adev->device.init_check = adev_init_check
adev->device.set_voice_volume = adev_set_voice_volume
adev->device.set_master_volume = adev_set_master_volume
adev->device.set_mode = adev_set_mode
adev->device.set_mic_mute = adev_set_mic_mute
adev->device.get_mic_mute = adev_get_mic_mute
adev->device.set_parameters = adev_set_parameters
adev->device.get_parameters = adev_get_parameters
adev->device.get_input_buffer_size = adev_get_input_buffer_size
adev->device.open_output_stream = adev_open_output_stream
adev->device.close_output_stream = adev_close_output_stream
adev->device.open_input_stream = adev_open_input_stream
adev->device.close_input_stream = adev_close_input_stream
adev->device.dump = adev_dump
adev-&g