linux音訊子系統--概述
1.簡介
ALSA是目前linux的主流音訊體系架構;
是一個有社群維護的開源專案。
http://www.alsa-project.org/
包括:
1.核心驅動包 alsa-driver
2.使用者空間庫 alsa-lib
3.附加庫外掛包 alsa-libplugins
4.音訊處理工具集 alsa-utils
5.其他音訊處理小工具包 alsa-tools
6.特殊音訊韌體支援包 alsa-firmware
7.alsa-lib的Python繫結包 pyalsa
8.OSS介面相容包 alsa-oss
2.架構圖
硬體架構:
軟體架構:
3.初識alsa裝置
注:
controlC0:控制介面,用於控制音效卡,如通道選擇,混音,麥克風輸入增益調節等。
midiC0D0:Raw迷笛介面,用於播放midi音訊。
pcmC0D0c:pcm介面,用於錄音的pcm裝置。
pcmC0D0p:用於播放的pcm裝置。
pcmC0D1p:
seq:音序器介面。
timer:定時器介面。
即該音效卡下掛載了7個裝置。根據音效卡實際能力,驅動實際上可以掛載更多種類的裝置
其中
C0D0表示音效卡0中的裝置0。
pcmC0D0c:最後的c表示capture。
pcmC0D0p:最後一個p表示playback。
裝置種類 include/sound/core.h:
#define SNDRV_DEV_TOPLEVEL ((__force snd_device_type_t) 0)
#define SNDRV_DEV_CONTROL ((__force snd_device_type_t) 1)
#define SNDRV_DEV_LOWLEVEL_PRE ((__force snd_device_type_t) 2)
#define SNDRV_DEV_LOWLEVEL_NORMAL ((__force snd_device_type_t) 0x1000)
#define SNDRV_DEV_PCM ((__force snd_device_type_t) 0x1001)
#define SNDRV_DEV_RAWMIDI ((__force snd_device_type_t) 0x1002)
#define SNDRV_DEV_TIMER ((__force snd_device_type_t) 0x1003)
#define SNDRV_DEV_SEQUENCER ((__force snd_device_type_t) 0x1004)
#define SNDRV_DEV_HWDEP ((__force snd_device_type_t) 0x1005)
#define SNDRV_DEV_INFO ((__force snd_device_type_t) 0x1006)
#define SNDRV_DEV_BUS ((__force snd_device_type_t) 0x1007)
#define SNDRV_DEV_CODEC ((__force snd_device_type_t) 0x1008)
#define SNDRV_DEV_JACK ((__force snd_device_type_t) 0x1009)
#define SNDRV_DEV_LOWLEVEL ((__force snd_device_type_t) 0x2000)
4.linux核心中音訊驅動程式碼分佈
其中:
core:包含 ALSA 驅動的核心層程式碼實現。
core/oss:包含模擬舊的OSS架構的PCM和Mixer模組。
core/seq:音序器相關的程式碼。
drivers:存放一些與CPU,bus架構無關的公用程式碼。
i2c:ALSA的i2c控制程式碼。
pci:PCI匯流排 音效卡的頂層目錄,其子目錄包含各種PCI音效卡程式碼。
isa:ISA匯流排 音效卡的頂層目錄,其子目錄包含各種ISA音效卡程式碼。
soc:ASoC(ALSA System on Chip)層實現程式碼,針對嵌入式音訊裝置。
soc/codecs:針對ASoC體系的各種音訊編碼器的驅動實現,與平臺無關。
include/sound:ALSA驅動的公共標頭檔案目錄。
5.驅動分類
OSS音訊裝置驅動:
OSS 標準中有兩個最基本的音訊裝置: mixer(混音器)和 dsp(數字訊號處理器)。
ALSA音訊裝置驅動:
雖然 OSS 已經非常成熟,但它畢竟是一個沒有完全開放原始碼的商業產品,而且目前
基本上在 Linux mainline 中失去了更新。而 ALSA (Advanced Linux Sound Architecture)恰
好彌補了這一空白,它符合 GPL,是在 Linux 下進行音訊程式設計時另一種可供選擇的音效卡驅動
體系結構。 ALSA 除了像 OSS 那樣提供了一組核心驅動程式模組之外,還專門為簡化應用
程式的編寫提供了相應的函式庫,與 OSS 提供的基於 ioctl 的原始程式設計介面相比, ALSA 函
數庫使用起來要更加方便一些。 ALSA 的主要特點如下。
- 支援多種音效卡裝置。
- 模組化的核心驅動程式。
- 支援 SMP 和多執行緒。
- 提供應用開發函式庫(alsa-lib)以簡化應用程式開發。
- 支援 OSS API,相容 OSS 應用程式。
ASoC音訊裝置驅動:
ASoC(ALSA System on Chip)是 ALSA 在 SoC 方面的發展和演變,它在本質上仍然屬於
ALSA,但是在 ALSA 架構基礎上對 CPU 相關的程式碼和 Codec 相關的程式碼進行了分離。其原因是,
採用傳統 ALSA 架構的情況下,同一型號的 Codec 工作於不同的 CPU 時,需要不同的驅動,這
不符合程式碼重用的要求。
對於目前嵌入式系統上的音效卡驅動開發,我們建議讀者儘量採用 ASoC 框架, ASoC 主要
由 3 部分組成。
- Codec 驅動。這一部分只關心 Codec 本身,與 CPU 平臺相關的特性不由此部分操作。
- 平臺驅動。這一部分只關心 CPU 本身,不關心 Codec。它主要處理兩個問題: DMA 引
擎和 SoC 整合的 PCM、 I2S 或 AC ‘97 數字介面控制。 - 板驅動(也稱為 machine 驅動)。這一部分將平臺驅動和 Codec 驅動繫結在一起,描述了
板一級的硬體特徵。
在以上 3 部分中, 1 和 2 基本都可以仍然是通用的驅動了,也就是說, Codec 驅動認為自己
可以連線任意 CPU,而 CPU 的 I2S、 PCM 或 AC ‘97 介面對應的平臺驅動則認為自己可以連線任
意符合其介面型別的 Codec,只有 3 是不通用的,由特定的電路板上具體的 CPU 和 Codec 確定,
因此它很像一個插座,上面插上了 Codec 和平臺這兩個插頭。
在以上三部分之上的是 ASoC 核心層,由核心原始碼中的 sound/soc/soc-core.c 實現,檢視其
原始碼發現它完全是一個傳統的 ALSA 驅動。因此,對於基於 ASoC 架構的音效卡驅動而言, alsa-lib
以及 ALSA 的一系列 utility 仍然是可用的,如 amixer、 aplay 均無需針對 ASoC 進行任何改動。而
ASoC 的使用者程式設計方法也與 ALSA 完全一致。
核心原始碼的 Documentation/sound/alsa/soc/目錄包含了 ASoC 相關的文件。