alsa技术文档 下载本文

内容发布更新时间 : 2024/4/26 19:48:40星期一 下面是文章的全部内容请认真阅读。

Android 基于Linux,我们先来了解一下Linux的特点。Linux使用ALSA作为其音频架构,其全称Advanced Linux Sound Architecture,即高级Linux声音架构的意思,在2.6核心之后,ALSA成为了Linux系统默认的音频子架构。取代了之前的OSS[Open Sound System,开放式声音系统]。

ALSA并不太好理解,它首先是一个驱动库,包含了大量的声卡设备的开源驱动,并提供了核心层API与ALSA库通信,而ALSA库则是应用程序访问和操控音频硬件的中间层,这个中间层有标准接口,开发者可以无须考虑硬件差异性进行开发,它对提升开发效率是大有帮助的。ALSA可以向下兼容OSS,因为OSS已经被淘汰,其兼容的工作模式不再讨论。

Android 2.2 OS Alsa架构示意图:

Android 2.3 OS Alsa架构示意图

Android 4.0 OS 简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述。

1、 AudioFlinger

1. frameworks/base/services/audioflinger/ 2. +-- Android.mk

3. +-- AudioBufferProvider.h 4. +-- AudioFlinger.cpp 5. +-- AudioFlinger.h 6. +-- AudioMixer.cpp 7. +-- AudioMixer.h

8. +-- AudioPolicyService.cpp 9. +-- AudioPolicyService.h 10. +-- AudioResampler.cpp 11. +-- AudioResamplerCubic.cpp 12. +-- AudioResamplerCubic.h 13. +-- AudioResampler.h 14. +-- AudioResamplerSinc.cpp 15. +-- AudioResamplerSinc.h

AudioFlinger相关代码,好像这部分与2.3相差不大,至少接口是兼容的。值得注意的是:2.3位于这里的还有AudioHardwareGeneric、AudioHardwareInterface、A2dpAudioInterface等一系列接口代码,现在都移除了。实际上,这些接口变更为legacy(有另外更好的实现方式,但也兼容之前的方法),取而代之的是要实现hardware/libhardware/include/hardware/audio.h提供的接口,这是一个较大的变化。 两种Audio Hardware HAL接口定义: 1、 legacy:

hardware/libhardware_legacy/include/hardware_legacy/AudioHardwareInterface.h/ 2、非legacy:hardware/libhardware/include/hardware/audio.h

2、audio_hw

1. hardware/libhardware_legacy/audio/ 2. +-- A2dpAudioInterface.cpp 3. +-- A2dpAudioInterface.h 4. +-- Android.mk

5. +-- AudioDumpInterface.cpp 6. +-- AudioDumpInterface.h 7. +-- AudioHardwareGeneric.cpp 8. +-- AudioHardwareGeneric.h 9. +-- AudioHardwareInterface.cpp 10. +-- AudioHardwareStub.cpp 11. +-- AudioHardwareStub.h 12. +-- audio_hw_hal.cpp

13. +-- AudioPolicyCompatClient.cpp 14. +-- AudioPolicyCompatClient.h 15. +-- audio_policy_hal.cpp 16. +-- AudioPolicyManagerBase.cpp 17. +-- AudioPolicyManagerDefault.cpp 18. +-- AudioPolicyManagerDefault.h

上面提及的AudioHardwareGeneric、AudioHardwareInterface、A2dpAudioInterface等都放到libhardware_legacy里。事实上legacy也要封装成非legacy中的audio.h,确切的说需要一个联系legacy interface和not legacy interface的中间层,这里的audio_hw_hal.cpp就充当这样的一个角色了。因此,我们其实也可以把2.3之前的alsa_sound这一套东西也搬过来。

[plain]view plaincopyprint?

1. hardware/libhardware/modules/audio/ 2. +-- Android.mk 3. +-- audio_hw.c 4. +-- audio_policy.c

这是一个stub(类似于2.3中的AudioHardwareStub),大多数函数只是简单的返回一个值,并没有实际操作,只是保证Android能得到一个audio hardware hal实例,从而启动运行,当然声音没有输出到外设的。在底层音频驱动或audio hardware hal还没有实现好的情况下,可以使用这个stub device,先让Android跑起来。

3、tinyalsa

[plain]view plaincopyprint?

1. external/tinyalsa/ 2. +-- Android.mk 3. +-- include 4. | +-- tinyalsa 5. | +-- asoundlib.h

6. +-- mixer.c ##类alsa-lib的control,作用音频部件开关、音量调节等 7. +-- pcm.c ##类alsa-lib的pcm,作用音频pcm数据回放录制

8. +-- README

9. +-- tinycap.c ##类alsa_arecord 10. +-- tinymix.c ##类alsa_amixer 11. +-- tinyplay.c ##类alsa_aplay

在2.3时代,Android还隐晦把它放在

android2.3.1-gingerbread/device/samsung/crespo/libaudio,现在终于把alsa-lib一脚踢开,小三变正室了,正名tinyalsa。这其实是历史的必然了,alsa-lib太过复杂繁琐了,我看得也很不爽;更重要的商业上面的考虑,必须移除被GNU GPL授权证所约束的部份,alsa-lib并不是个例。

注意:上面的hardware/libhardware_legacy/audio/、hardware/libhardware/modules/audio/、device/samsung/tuna/audio/是同层的。之一是legacy audio,用于兼容2.2时代的alsa_sound;之二是stub audio接口;之三是Samsung Tuna的音频抽象层实现。调用层次:AudioFlinger ->audio_hw ->tinyalsa。

二、Audio Hardware HAL加载

1、AudioFlinger