1. 程式人生 > >linux alsa 體系簡介

linux alsa 體系簡介

一、 總體介紹

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.1 alsa-lib User空間的 alsa-lib 對應用程式提供統一的 alsa-lib-API 介面,簡化了應用程式的實現難度。alsa-lib 主要以 plugin 外掛的形式體現。詳細資訊詳見http://www.alsa-project.org/alsa-doc/alsa-lib/ 。 2.2 ALSA-driver Linux 核心空間中,ALSA-driver 其大致可分為三層:音效卡物件描述層、ALSA 核心層 ASLA Core 和 Audio 裝置驅動層 Audio device driver。 最上層的是音效卡物件描述層,是音效卡硬體的抽象描述,是一個虛擬層,使用者空間通過這些描述可以得知該音效卡硬體的功能、裝置元件和操作方法等。 中間層是 ASLA Croe,是 ALSA 的標準框架,是 ALSA-driver 的核心部分,提供了各種音訊裝置驅動的通用方法和資料結構,為 Audio driver提供 ALSA Driver API。 最底層是 Audio device driver,根據 ALSA-driver 提供的 ALSA Driver API 和相應音訊裝置的初始化及工作流程,實現具體的功能元件函式,這也是驅動開發人員需要具體實現的部分。

三、驅動程式碼目錄:

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體系的各種音訊編碼器的驅動實現,與平臺無關。 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 部分組成。 1. Codec 驅動。這一部分只關心 Codec 本身,與 CPU 平臺相關的特性不由此部分操作。 2. 平臺驅動。這一部分只關心 CPU 本身,不關心 Codec。它主要處理兩個問題: DMA 引擎和 SoC 整合的 PCM、 I2S 或 AC ‘97 數字介面控制。 3. 板驅動(也稱為 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 進行任何改動。而