参考:
1. 奇小葩 https://blog.csdn.net/u012489236/article/details/98068122
2. 技术芯 https://blog.csdn.net/sinat_37817094/article/details/80490830
3. 哈迪斯_石头 https://blog.csdn.net/zqh6516336520/article/details/38226333
4. linux kernel:4.4
简介
Alsa是Advanced Linux Sound Architecture的缩写,即高级Linux声音架构,在Linux操作系统上提供了对音频和MIDI的支持。在Linux 2.6的内核版本后,Alsa目前已经成为了linux的主流音频体系结构。除了 alsa-driver,ALSA 包含在用户空间的 alsa-lib 函数库,具有更加友好的编程接口,并且完全兼容于 OSS,开发者可以通过这些高级 API 使用驱动,不必直接与内核驱动 API 进行交互。
ALSA 主要有如下特点:
- 支持多种声卡设备、
- 模块化的内核驱动程序 、
- 支持 SMP(对称多处理)和多线程、
- 提供应用开发函数库
- 兼容OSS应用程序
系统框架
在这里插入图片描述 User空间:主要由Alsa Libray API对应用程序提供统一的API接口,各个APP应用程序只要调用 alsa-lib 提供的 API接口来实现放音、录音、控制。现在提供了两套基本的库,tinyalsa是一个简化的alsa-lib库,现在Android的系统中主要使用它。
ALSA CORE:alsa 核心层,向上提供逻辑设备(PCM/CTL/MIDI/TIMER/…)系统调用,向下驱动硬件设备(Machine/I2S/DMA/CODEC)
ASOC Core:是 ALSA 的标准框架,是 ALSA-driver 的核心部分,提供了各种音频设备驱动的通用方法和数据结构,为 Audio driver提供 ALSA Driver API
Hardware Driver:音频硬件设备驱动,由三大部分组成,分别是 Machine、Platform、Codec,提供的 ALSA Driver API 和相应音频设备的初始化及工作流程,实现具体的功能组件,这也是驱动开发人员需要具体实现的部分。
目录结构
.
├── ac97_bus.c
├── aoa
├── arm
├── atmel
├── core
├── drivers
├── firewire
├── hda
├── i2c
├── isa
├── last.c
├── mips
├── oss
├── parisc
├── pci
├── pcmcia
├── ppc
├── sh
├── soc
├── sound_core.c
├── sound_firmware.c
├── sparc
├── spi
├── synth
└── usb
- ac97_bus.c -->实现AC97标准总线。
AC97 标准把音频设备中的数字部分和模拟部分分开, 并规定数字信号处理由CPU 来负责,或者采用专门的DSP 芯片; 而模拟部分, 即A/D、D/A 转换与Mix 混音操作, 则由CODEC 芯片(Coder2Decoder: 编码/解码器) 完成。
音频处理的流程如下:
①CODEC 采样音频数据, 把模拟信号转换成数字信号通过AC2link 和AC 控制单元传送给CPU 或DSP 处理。
②CPU 对数字信号处理后交由AC 控制单元通过AC2link 传输给CODEC 进行混音处理,再转换成模拟信号输出。其中AC 控制单元是AC97 CODEC 的控制器。AC2link 是AC97 标准定义的全双工的串行接口, 负责传输音频数据、寄存器控制命令和状态信息。
AC2link 由4 根串行总线和一个nRESET 信号线组成。串行总线分别是: 位时钟信号线(B IT_CL K ) , 帧同步信号线(SYNC ) , 数据输出(SDA TA _OU T ) 和数据输入(SDA TA _IN ) 信号线。它按照AC97 rev211 标准规定的AC2link数字串口接口协议[ 1 ]进行数据的传输。AC2link在B IT _CL K 的上升沿发送数据, 在下降沿接收数据, 实现全双工的数据传输。
- last.c -->所有音频设备注册完成后打印ALSA devices List
下面是一个log示例:
[ 1.814400] ALSA device list:
[ 1.814432] #0: rockchip,rt5640-codec
[ 1.814440] #1: RK-FPGA-I2S
- sound_core.c -->注册音频核心层子系统
subsys_initcall(init_soundcore);
module_exit(cleanup_soundcore);
- sound_firmware.c --> 加载音频驱动固件
EXPORT_SYMBOL(mod_firmware_load);
下面是目录及其说明
目录 | 说明 |
---|---|
aoa | 苹果板载音频驱动 |
arm | arm音频设备支持 |
atmel | Atmel ABDAC(音频字节流数模转换器)及AC97C(AC97控制器)支持 |
core | 该目录包含了ALSA驱动的中间层,它是整个ALSA驱动的核心部分 |
driver | 放置一些与CPU、BUS架构无关的公用代码 |
firewire | 火线(IEEE-1394/FireWire/iLink)音频设备支持 |
hda | HD Audio(高保真音频)支持 |
i2c | ALSA自己的I2C控制代码 |
isa | isa声卡的顶层目录,子目录包含各种isa声卡的代码 |
mips | mips音频设备支持 |
oss | 对oss的兼容支持 |
parisc | 鸿蒙(harmony)音频设备支持(注:支持PA-RISC架构上的GSC音频设备) |
pci | pci音频设备支持 |
pcmcia | pcmcia音频设备支持 |
ppc | PowerPC 音频设备支持 |
sh | SUPERH架构音频设备支持 |
soc | 针对system-on-chip体系的中间层代码 |
sparc | SPARC架构音频设备支持 |
spi | SPI音频设备支持 |
synth | 一些工具 |
usb | USB音频设备支持 |
网友评论