ALSA 包括驱动包 alsa-driver,开发包 alsa-libs,开发包插件 alsa-lib plugins,设置管理工具包 alsa-utils,其它声音相关处理小程序包 alsa-tools,特殊音频固件支持包 alsa-firmware,OSS 接口兼容模拟层工具 alsa-oss 共 7 个子项目,其中只有驱动包是必须的。
alsa-libs 指用户空间的函数库,提供给应用程序使用,应用程序应包括头文件 asoundlib.h,并使用共享库 libasound.so。
目前 ALSA 内核提供给用户空间的接口有:
1】信息接口(proc/asound):ALSA 使用/proc/asound 目录下的文件保存设备信息并且实现一些控制。
2】控制接口(dev/snd/controlCX):提供灵活的方式管理注册的声卡和对存在的声卡进行查询。
3】混音器接口(dev/snd/mixerCXDX):控制发送信号和控制声音大小的声卡上的设备。
4】PCM 接口(dev/snd/pcmCXDX):提供管理数字音频的录音和回放,pcmCXDXc 对应录音设备,pcmCXDXp 对应回放设备。
5】原始 MIDI 接口(dev/snd/midiCXDX):支持 MIDI(Musical Instrument DigitalInterface,音乐设备数字化接口),一种标准电子音乐指令集。这些 API 提供访问声卡上的 MIDI 总线。这些原始接口直接工作在 MIDI 事件上,程序员只需管理协议和时间。
6】音序器接口(dev/snd/seq):一个比原始 MIDI 接口高级的 MIDI 编程和声音同步高层接口。它可以处理很多 MIDI 协议和定时器。
7】定时器接口(dev/snd/timer):为支持声音的同步事件提供访问声卡上的定时器。
基于 ALSA 的 Android 音频系统的实现主要需要完成以下几方面的工作:
1】获取 ALSA 相关源码,主要有 ALSA 库 alsa-lib,ALSA 工具 alsa-utils,Audio 硬 件 抽 象 层 alsa_sound , 这 三 部 分 需 要 分 别 放 到 以 下 指 定 位 置external/alsa-lib,external/alsa-utils,hardware/alsa_sound。
2】修改 BoardConfig.mk,如下:
BOARD_USES_GENERIC_AUDIO := false
BOARD_USES_ALSA_AUDIO := true
BUILD_WITH_ALSA_UTILS := true
通过以上设置,音频系统便被切换成基于 ALSA 实现。
3】移植 Audio 硬件抽象层。Audio 硬件抽象层是 AudioFlinger 和 Audio 驱动的接口,基于 ALSA 的具体
实现位于 hardware/alsa_sound 文件夹中,该部分需要根据特定平台进行修改。
4】实现 Audio 驱动。Audio 驱动采用 ASoC 架构。ASoC 中,Audio 驱动主要包含 codec 驱动、platform 驱动和 machine 驱动,实现这些驱动是本次设计重要的工作,而实现codec 驱动则是重中之重。
5】配置 asound.conf。Asound.conf 是 ALSA 的配置文件,位于 system/etc 下。Asound.conf 的配置需要根据底层 Audio 驱动注册的信息来完成,配置好 asound.conf 之后上层便可打开 asound.conf 中定义的虚拟设备,并自动选择相应的音频通路。