ALSA架構簡介


一、概述

ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構。

首先來了解一下,alsa架構的組成部分以及它們的作用。

Native ALSA Applicationtinyplay/tinycap/tinymix,這些用戶程序直接調用 alsa 用戶庫接口來實現播放、錄音、控制。

ALSA Library API:alsa 用戶庫接口,常見有 tinyalsa、alsa-lib。

ALSA CORE:alsa 核心層,向上提供邏輯設備(PCM/CTL/MIDI/TIMER/…)系統調用,向下驅動硬件設備(Machine/I2S/DMA/CODEC)。

ASoC CORE:asoc 是建立在標准 alsa core 基礎上,為了更好支持嵌入式系統和應用於移動設備的音頻 codec 的一套軟件體系。

Hardware Driver:音頻硬件設備驅動,由三大部分組成,分別是 Machine、Platform、Codec

 

 

二.ALSA設備文件結構

在ubuntu系統中,看一下alsa設備的文件結構:

cd /dev/snd

ls -l

crw-rw----+ 1 root audio controlC0 crw-rw----+ 1 root audio midiC0D0 crw-rw----+ 1 root audio pcmC0D0c crw-rw----+ 1 root audio pcmC0D0p crw-rw----+ 1 root audio pcmC0D1p crw-rw----+ 1 root audio seq crw-rw----+ 1 root audio  timer

可以看到以下設備文件:

controlC0 -->                 用於聲卡的控制,例如通道選擇,混音,麥克風的控制等

midiC0D0  -->                用於播放midi音頻

pcmC0D0c --〉             用於錄音的pcm設備

pcmC0D0p --〉             用於播放的pcm設備

seq  --〉                        音序器

timer --〉                       定時器

其中,C0D0代表的是聲卡0中的設備0,pcmC0D0c最后一個c代表capture,pcmC0D0p最后一個p代表playback,這些都是alsa-driver中的命名規則。從上面的列表可以看出,我的聲卡下掛了6個設備,根據聲卡的實際能力,驅動實際上可以掛上更多種類的設備,在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)

通常,我們更關心pcm和control這兩種設備。

三. 驅動代碼的文件結構

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM