參考:
1. 奇小葩 https://blog.csdn.net/u012489236/article/details/98068122
2. 技術(shù)芯 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聲音架構(gòu),在Linux操作系統(tǒng)上提供了對音頻和MIDI的支持。在Linux 2.6的內(nèi)核版本后,Alsa目前已經(jīng)成為了linux的主流音頻體系結(jié)構(gòu)。除了 alsa-driver,ALSA 包含在用戶空間的 alsa-lib 函數(shù)庫,具有更加友好的編程接口,并且完全兼容于 OSS,開發(fā)者可以通過這些高級 API 使用驅(qū)動,不必直接與內(nèi)核驅(qū)動 API 進(jìn)行交互。
? ALSA 主要有如下特點(diǎn):
- 支持多種聲卡設(shè)備、
- 模塊化的內(nèi)核驅(qū)動程序 、
- 支持 SMP(對稱多處理)和多線程、
- 提供應(yīng)用開發(fā)函數(shù)庫
- 兼容OSS應(yīng)用程序
系統(tǒng)框架
? User空間:主要由Alsa Libray API對應(yīng)用程序提供統(tǒng)一的API接口,各個APP應(yīng)用程序只要調(diào)用 alsa-lib 提供的 API接口來實(shí)現(xiàn)放音、錄音、控制?,F(xiàn)在提供了兩套基本的庫,tinyalsa是一個簡化的alsa-lib庫,現(xiàn)在Android的系統(tǒng)中主要使用它。
? ALSA CORE:alsa 核心層,向上提供邏輯設(shè)備(PCM/CTL/MIDI/TIMER/…)系統(tǒng)調(diào)用,向下驅(qū)動硬件設(shè)備(Machine/I2S/DMA/CODEC)
? ASOC Core:是 ALSA 的標(biāo)準(zhǔn)框架,是 ALSA-driver 的核心部分,提供了各種音頻設(shè)備驅(qū)動的通用方法和數(shù)據(jù)結(jié)構(gòu),為 Audio driver提供 ALSA Driver API
? Hardware Driver:音頻硬件設(shè)備驅(qū)動,由三大部分組成,分別是 Machine、Platform、Codec,提供的 ALSA Driver API 和相應(yīng)音頻設(shè)備的初始化及工作流程,實(shí)現(xiàn)具體的功能組件,這也是驅(qū)動開發(fā)人員需要具體實(shí)現(xiàn)的部分。
目錄結(jié)構(gòu)
.
├── 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 -->實(shí)現(xiàn)AC97標(biāo)準(zhǔn)總線。
AC97 標(biāo)準(zhǔn)把音頻設(shè)備中的數(shù)字部分和模擬部分分開, 并規(guī)定數(shù)字信號處理由CPU 來負(fù)責(zé),或者采用專門的DSP 芯片; 而模擬部分, 即A/D、D/A 轉(zhuǎn)換與Mix 混音操作, 則由CODEC 芯片(Coder2Decoder: 編碼/解碼器) 完成。
音頻處理的流程如下:
①CODEC 采樣音頻數(shù)據(jù), 把模擬信號轉(zhuǎn)換成數(shù)字信號通過AC2link 和AC 控制單元傳送給CPU 或DSP 處理。
②CPU 對數(shù)字信號處理后交由AC 控制單元通過AC2link 傳輸給CODEC 進(jìn)行混音處理,再轉(zhuǎn)換成模擬信號輸出。其中AC 控制單元是AC97 CODEC 的控制器。AC2link 是AC97 標(biāo)準(zhǔn)定義的全雙工的串行接口, 負(fù)責(zé)傳輸音頻數(shù)據(jù)、寄存器控制命令和狀態(tài)信息。
AC2link 由4 根串行總線和一個nRESET 信號線組成。串行總線分別是: 位時鐘信號線(B IT_CL K ) , 幀同步信號線(SYNC ) , 數(shù)據(jù)輸出(SDA TA _OU T ) 和數(shù)據(jù)輸入(SDA TA _IN ) 信號線。它按照AC97 rev211 標(biāo)準(zhǔn)規(guī)定的AC2link數(shù)字串口接口協(xié)議[ 1 ]進(jìn)行數(shù)據(jù)的傳輸。AC2link在B IT _CL K 的上升沿發(fā)送數(shù)據(jù), 在下降沿接收數(shù)據(jù), 實(shí)現(xiàn)全雙工的數(shù)據(jù)傳輸。
- last.c -->所有音頻設(shè)備注冊完成后打印ALSA devices List
下面是一個log示例:
[ 1.814400] ALSA device list:
[ 1.814432] #0: rockchip,rt5640-codec
[ 1.814440] #1: RK-FPGA-I2S
- sound_core.c -->注冊音頻核心層子系統(tǒng)
subsys_initcall(init_soundcore);
module_exit(cleanup_soundcore);
- sound_firmware.c --> 加載音頻驅(qū)動固件
EXPORT_SYMBOL(mod_firmware_load);
下面是目錄及其說明
| 目錄 | 說明 |
|---|---|
| aoa | 蘋果板載音頻驅(qū)動 |
| arm | arm音頻設(shè)備支持 |
| atmel | Atmel ABDAC(音頻字節(jié)流數(shù)模轉(zhuǎn)換器)及AC97C(AC97控制器)支持 |
| core | 該目錄包含了ALSA驅(qū)動的中間層,它是整個ALSA驅(qū)動的核心部分 |
| driver | 放置一些與CPU、BUS架構(gòu)無關(guān)的公用代碼 |
| firewire | 火線(IEEE-1394/FireWire/iLink)音頻設(shè)備支持 |
| hda | HD Audio(高保真音頻)支持 |
| i2c | ALSA自己的I2C控制代碼 |
| isa | isa聲卡的頂層目錄,子目錄包含各種isa聲卡的代碼 |
| mips | mips音頻設(shè)備支持 |
| oss | 對oss的兼容支持 |
| parisc | 鴻蒙(harmony)音頻設(shè)備支持(注:支持PA-RISC架構(gòu)上的GSC音頻設(shè)備) |
| pci | pci音頻設(shè)備支持 |
| pcmcia | pcmcia音頻設(shè)備支持 |
| ppc | PowerPC 音頻設(shè)備支持 |
| sh | SUPERH架構(gòu)音頻設(shè)備支持 |
| soc | 針對system-on-chip體系的中間層代碼 |
| sparc | SPARC架構(gòu)音頻設(shè)備支持 |
| spi | SPI音頻設(shè)備支持 |
| synth | 一些工具 |
| usb | USB音頻設(shè)備支持 |