兩篇寫的很好的博文:(作者:https://me.csdn.net/zyuanyun)
Linux ALSA 音頻系統:物理鏈路篇
硬件平臺及軟件版本:
- Kernel - 3.4.5
- SoC - Samsung exynos
- CODEC - WM8994
- Machine - goni_wm8994
- Userspace - tinyalsa
Linux ALSA 音頻系統架構大致如下:
+--------+ +--------+ +--------+
|tinyplay| |tinycap | |tinymix |
+--------+ +--------+ +--------+
| ^ ^
V | V
+--------------------------------+
| ALSA Library API |
| (tinyalsa, alsa-lib) |
+--------------------------------+
user space ^
-------------------------------|---------------------
kernel space V
+--------------------------------+
| ALSA CORE |
| +-------+ +-------+ +------+ |
| | PCM | |CONTROL| | MIDI |...|
| +-------+ +-------+ +------+ |
+--------------------------------+
|
+--------------------------------+
| ASoC CORE |
+--------------------------------+
|
+--------------------------------+
| hardware driver |
| +-------+ +--------+ +-----+ |
| |Machine| |Platform| |Codec| |
| +-------+ +--------+ +-----+ |
+--------------------------------+
聲卡和 PCM 設備的建立過程
前面幾章分析了 Codec、Platform、Machine 驅動的組成部分及其註冊過程,這三者都是物理設備相關的,大家應該對音頻物理鏈路有了一定的認知。接着分析音頻驅動的中間層,由於這些並不是真正的物理設備,故我們稱之爲邏輯設備。
PCM 邏輯設備,我們又習慣稱之爲 PCM 中間層或 pcm native,起着承上啓下的作用:往上是與用戶態接口的交互,實現音頻數據在用戶態和內核態之間的拷貝;往下是觸發 codec、platform、machine 的操作函數,實現音頻數據在 dma_buffer <-> cpu_dai <-> codec 之間的傳輸。後面章節將會詳細分析這個過程,這裏還是先從聲卡的註冊談起