精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

ALSA高級Linux聲音架構淺析

Linux閱碼場 ? 來源:Leo Linux ? 2023-03-25 16:52 ? 次閱讀

一、數字音頻背景

1.1 數字音頻簡介

聲音在自然界以聲波的形式存在,是一系列連續變化的模擬信號,聲音的三個要素是音調、音強和音色。聲波有三個重要參數:頻率 ω0、幅度A n 和相位ψn ,這也就決定了音頻信號的特征。根據聲波的特征,可把音頻信息分類為規則音頻和不規則聲音。其中規則音頻又可以分為語音、音樂和音效。音頻信號是(Audio)帶有語音、音樂和音效的有規律的聲波的頻率、幅度變化信息載體。

1.1.1 數字音頻

數字音頻是一種利用數字化手段對聲音進行錄制、存放、編輯、壓縮或播放的技術,它是隨著數字信字音頻號處理技術、計算機技術、多媒體技術的發展而形成的一種全新的聲音處理手段。數字音頻計算機數據的存儲是以0、1的形式存取的,那么數字音頻就是首先將音頻文件轉化,接著再將這些電平信號轉化成二進制數據保存,播放的時候就把這些數據轉換為模擬的電平信號再送到喇叭播出,數字聲音和一般磁帶、廣播、電視中的聲音就存儲播放方式而言有著本質區別。相比而言,它具有存儲方便、存儲成本低廉、存儲和傳輸的過程中沒有聲音的失真、編輯和處理非常方便等特點。

1.1.2 數字音頻文件

數字音頻文件是通過聲音錄入設備錄制的原始聲音,直接記錄了真實聲音的二進制采樣數據,有些文件并對原始數據進行了頻率過濾和存儲格式壓縮,音頻文件格式主要分有損和無損兩類。有損文件格式是基于聲學心理學的模型,除去人類很難或根本聽不到的聲音。

無損格式如:PCM,WAV,ALS,ALAC,TAK,FLAC,APE,WavPack(WV) ;

有損格式如:MP3,AAC,WMA,Ogg ;

數字音頻文件幾個重要參數:采樣頻率、量化位寬、聲道數。

1.1.3 采樣頻率

采樣頻率是指將模擬聲音波形進行數字化時,每秒鐘抽取聲波幅度樣本的次數。采樣頻率的選擇應該遵循奈奎斯特(Harry Nyquist)采樣理論:如果對某一模擬信號進行采樣,則采樣后可還原的最高信號頻率只有采樣頻率的一半,或者說只要采樣頻率高于輸入信號最高頻率的兩倍,就能從采樣信號系列重構原始信號。正常人聽覺的頻率范圍大約在20Hz~20kHz之間,根據奈奎斯特采樣理論,為了保證聲音不失真,采樣頻率應該在40kHz左右,常用的采樣率有:

8,000 Hz - 電話所用采樣率,對于人的說話已經足夠;

11,025 Hz

22,050 Hz - 無線電廣播所用采樣率;

32,000 Hz - miniDV 數碼視頻camcorder、DAT(LP mode)所用采樣率;

44,100 Hz - 音頻CD,也常用于MPEG-1音頻(VCD, SVCD, MP3)所用采樣率;

47,250 Hz - 商用 PCM 錄音機所用采樣率;

48,000 Hz - miniDV、數字電視、DVD、DAT、電影和專業音頻所用的數字聲音所用采樣率;

50,000 Hz - 商用數字錄音機所用采樣率;

96,000192,000Hz - DVD Audio、一些LPCMDVD音軌、BD-OM(藍光盤)音軌、和HDDVD(高清晰度DVD)音軌所用所用采樣率;

2.8224 MHz - Direct Stream Digital的1位sigma-delta modulation過程所用采樣率。

1.1.4 量化位寬

量化位寬是對模擬音頻信號的幅度進行數字化,它決定了模擬信號數字化以后的動態范圍,常用的有8位、12位、16位、24位和32位。量化位越高,信號的動態范圍越大,數字化后的音頻信號就越可能接近原始信號,但所需要的存貯空間也越大。

1.1.5 聲道數

聲道數是反映音頻數字化質量的另一個重要因素,聲道技術已廣泛運用于各類傳統影院和家庭影院中:

單聲道的聲道數為1個聲道;

雙聲道的聲道數為2個聲道,立體聲道的聲道數默認為2個聲道;

四聲道環繞規定了4個發音點:前左、前右,后左、后右,4.1聲道音箱系統其中“.1”聲道,則是一個專門設計的超低音聲道,這一聲道可以產生頻響范圍20~120Hz的超低音;

5.1聲音系統其實來源于4.1環繞,不同之處在于它增加了一個中置單元。這個中置單元負責傳送低于80Hz的聲音信號,在欣賞影片時有利于加強人聲,把對話集中在整個聲場的中部,以增加整體效果;

7.1系統已經出現,它在5.1的基礎上又增加了中左和中右兩個發音點,以求達到更加完美的境界。

1.2 linux音頻子系統介紹

Linux音頻系統比較復雜,各層間有很多交叉,可能是最無序的子系統,并且它有兩套音頻驅動框架: OSS (Open Sound System)和ALSA (Advanced Linux Sound Architechture),所以底層驅動有OSS和ALSA兩套API。ALSA經過多年的發展,基本統一了Linux聲卡硬件驅動層的接口,OSS日漸退出,但是在ALSA之上的各個應用層,方案和軟件繁多復雜,ESD,PulseAudio, JACK,GStreamer, 這些系統組件各個為戰,實現了不同的功能。

bf09c95c-cae8-11ed-bfe3-dac502259ad0.jpg

圖1.2

上圖1.2描述了Linux音頻系統各部分調用關系,下面簡要介紹各部分。

1.2.1 ALSA和OSS

ALSA 是 Advanced Linux Sound Architecture 的縮寫,即高級 Linux聲音架構,在 Linux 操作系統上提供了對音頻和 MIDI(Musical InstrumentDigital Interface,音樂設備數字化接口)的支持。在 Linux2.6 版本內核以后,ALSA 已經成為默認的聲音子系統,用來替換 2.4 版本內核中的OSS(Open Sound System,開放聲音系統)。

ALSA 是一個完全開放源碼的音頻驅動程序集,是由志愿者維護的開源項目,而 OSS 則是由公司提供的商業產品。ALSA 系統包括驅動包alsa-driver(集成在內核源碼),開發包 alsa-libs,開發包插件 alsalibplugins,設置管理工具包 alsa-utils,其他聲音相關處理小程序包alsa-tools,特殊音頻固件支持包 alsa-firmware,OSS 接口兼容模擬層工具 alsa-oss 共 7 個子項目,其中只有 alsa-driver 是必須的。

1.2.2 FFADO

很多專業音樂設備都是通過“火線”連接到pc的。FFADO項目旨在通過提供一個通用的火線上,支持基于Linux平臺的開源音頻設備解決方案。FFADO項目是的FreeBOB項目的繼任者。FFADO在志愿者為基礎的社區的努力下,試圖提供Linux至少是存在于其他操作系統功能相同的水平,并且希望支持的火線音頻設備的范圍非常廣泛:從混合音頻控制設備到DSP算法設備的純音頻接口。然而,能夠支持的是設備供應商的合作。優先考慮提供信息和測試設備的制造商。

FFADO另一個特性是整合了dsp芯片的混音驅動,你可以通過圖形界面設置輸入輸出,以及音效等。不同于alsa的軟混音,你可以真正的對硬件進 行控制,做到真正的0延時,這對現場錄音等需求大大有助。和alsa等其他架構不同,jack僅僅對其支持的硬件進行處理,沒有對alsa或者pulse提供接口,除非你用alsa替代jack,否則你無 法使用jack正常的進行音頻播放。但是很多專業設備對jack支持良好,所以jack是你的最優選擇。

1.2.3 PulseAudio

PulseAudio是內置POSIX的操作系統是一個完善的機制,它是聲音的應用程序代理。它允許應用程序和硬件之間傳遞聲音數據上的高級操作。諸如將音頻傳輸到不同的機器、改變采樣格式或通道計數以及將多個聲音混合成一個,這些都很容易使用聲音服務器實現。內置專為Linux系統。它也被移植到Solaris、FreeBSD,NetBSD,MacOS X的測試,Windows 2000和Windows XP。內置是所有有關linux系統的一個組成部分,用于由多個供應商的各種移動設備。

1.2.4 GStreamer

GStreamer是一個開源的多媒體框架庫。利用它,可以構建一系列的媒體處理模塊,包括從簡單的ogg播放功能到復雜的音頻(混音)和視頻(非線性編輯)的處理。應用程序可以透明的利用解碼和過濾技術。開發者可以使用簡潔通用的接口來編寫一個簡單的插件來添加新的解碼器或濾鏡。

1.2.5 JACK

Jack(JACK Audio Connection Kit 的遞歸縮寫)是一個專業級的聲音服務(守護進程),它為聲音和MIDI數據提供實時的、低延時的連接,有關的程序使用JACK的API。

JACK能使用ALSA、PortAudio、CoreAudio、FFADO和OSS作為硬件層的后端。此外, 還有一個虛擬的驅動(當不需要聲音輸出時是很有用的,例如離線渲染)和一個通過UDP協議的音頻驅動(Audio-over-UDP driver)。它可以運行在Linux、Mac OS X、Solaris、Windows、FreeBSD、OpenBSD和NetBSD上。JACK的API被標準化,并且存在兩種可融合的實現:jack1,由簡單的C實現并且已經維護了一段時間;至于jack2(原來的jackdmp),由Stéphane Letz領導的用C++重寫的實現,jack2在積極開發中,目標是支持多處理器和對其它非Linux操作系統。

1.2.6 Xin

如果說linux音頻發展像地球史,那xine就處在白堊紀。它就像個遺老,你仍能從很多播放器中發現它的身影,所以很多linux發行版仍然捆綁 著xine。xine創立之初,設計分為前端和后端,前端用于和用戶交互,后端處理多媒體。得益于封裝的解碼庫,它可以播放包括AVI、Matroska和 Ogg以及它們 包含的數十種格式,例如AAC、Flack、MP3、Vorbis和WMA。因為它依賴于庫實現,所以xine被開發成一個多媒體框架,庫的開發,使得xine在法律允許范圍內對多媒體文件提供最好的支持。xine可以和 alsa,pulse通信,很多程序也可以調用xine,例如totme-xine。同時xine也是kde的Phonon默認后端,所以不論是 Amarok 還是 Kaffeine,都能看到他的蹤跡。

1.2.7 Phonon

Phonon是KDE 4的多媒體API 。Phonon提供一個穩定的API允許KDE 4獨立于任何一個聲音系統服務器如xine。Phonon讓各種后端提供界面給開發者所謂的”引擎”;每個引擎運作在一個具體的后端。每個后端都可讓Phonon控制基本功能,如播放、暫停和搜尋。Phonon也支持更高層次的功能,如讓音軌轉化之間變微弱。使用Solid,Phonon將給予用戶更多配件的控制能力如耳機、揚聲器、麥克風。一個例子是,因為你可能只有一個VoIP會話使用您的耳機,但所有其他的聲音通過揚聲器出來。支援 Unix-like 系統下的后端xine、VLC、MPlayer。支援 Windows 下的后端 DirectShow、VLC和MPlayer.支持 Mac OS X下的后端QuickTime。QT4.4和之后版本使用了Phonon,作為跨平臺的音頻/視頻播放。

1.2.8、其他

其他有一些很多小眾的音頻技術,例如ESD、SDL和 PortAudio。

ESD

ESD是聲音啟發守護進程(Enlightenment Sound Daemon),它在曾經很長的一段時間里曾是Gnome桌面的默認聲音服務。后來,Gnome開始使用libcanberra(它本身可以和ALSA、 GStreamer、OSS和PulseAudio通信),ESD在2009年4月被徹底放棄支持。在kde上esd也是杯具。因為大部分人都是使用 kde4,所以phonon替代了esd。

SDL

SDL依然欣欣向榮的發展著。因為已經是用他開發了上百款跨平臺游戲, 所以SDL庫的音頻輸出組件依然支持良好,具有大量新的特性,并且成熟而穩定。

PortAudio

PortAudio也是一個跨平臺音頻庫,它把 SGI、Unix和Beos加入到可能的終端混音器中。使用PortAudio的最知名的應用程序就是Audacity音頻編輯器了,因為使用了 portaudio,使得它音頻輸出遇到了問題,jack支持也遇到了bug。

二、ALSA框架分析

2.1 ALSA框架介紹

2.1.1 ALSA簡介

ALSA 是 Advanced Linux Sound Architecture 的縮寫,即高級 Linux聲音架構,在 Linux 操作系統上提供了對音頻和 MIDI(Musical InstrumentDigital Interface,音樂設備數字化接口)的支持。在 Linux2.6 版本內核以后,ALSA 已經成為默認的聲音子系統,用來替換 2.4 版本內核中的OSS(Open Sound System,開放聲音系統)。

ALSA 是一個完全開放源碼的音頻驅動程序集,是由志愿者維護的開源項目,而OSS則是由公司提供的商業產品。ALSA系統包括驅動包alsa-driver(集成在內核源碼),開發包 alsa-libs,開發包插件 alsalibplugins,設置管理工具包 alsa-utils,其他聲音相關處理小程序包alsa-tools,特殊音頻固件支持包 alsa-firmware,OSS 接口兼容模擬層工具 alsa-oss 共 7 個子項目,其中只有 alsa-driver 是必須的。除了 alsa-driver,ALSA 包含在用戶空間的 alsa-lib 函數庫,具有更加友好的編程接口,并且完全兼容于 OSS,開發者可以通過這些高級 API 使用驅動,不必直接與內核驅動 API 進行交互。
ALSA 主要有如下特點:

支持多種聲卡設備;

模塊化的內核驅動程序;

支持 SMP(對稱多處理)和多線程;

提供應用開發函數庫 ;

兼容 OSS 應用程序 。

2.1.2 ALSA整體框架

ALSA 在 Linux 系統中可以主要分兩部分,在Kernel空間的設備驅動層,ALSA 提供了 ALSA-driver,它是整個 ALSA 框架的核心部分;同時在Linux User空間,ALSA 提供了alsa-lib,對 ALSA-driver的系統調用API進行封裝,應用程序只要調用 alsa-lib 提供的 API,即可以完成對底層音頻硬件的控制。下圖2.1.2是基于ALSA框架的Linux音頻系統架構圖:

bf14d112-cae8-11ed-bfe3-dac502259ad0.jpg

圖2.1.2

2.1.2.1 alsa-lib

User空間的 alsa-lib 對應用程序提供統一的 alsa-lib-API 接口,簡化了應用程序的實現難度。alsa-lib 主要以 plugin 插件的形式體現。詳細信息詳見http://www.alsa-project.org/alsa-doc/alsa-lib/ 。

2.1.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 和相應音頻設備的初始化及工作流程,實現具體的功能組件函數,這也是驅動開發人員需要具體實現的部分。

2.2 ALSA的硬件抽象

ALSA 用 cards,device 和 subdevices 的分層結構表示 Audio 硬件設備和他們的組件。這個分層結構是 ALSA 看待硬件設備結構和能力的視角,是對實體硬件的抽象化實例。見圖2.2:

bf33803a-cae8-11ed-bfe3-dac502259ad0.jpg

圖2.2 ALSA設備抽象圖

目前 ALSA 內核提供給用戶空間的 device 文件接口有:

InformationInterface(/proc/asound)信息接口;
ControlInterface(/dev/snd/controlCX)控制接口;
MixerInterface(/dev/snd/mixerCXDX)混音器接口;
PCMInterface(/dev/snd/pcmCXDX) PCM 接口;
RawMIDIInterface(/dev/snd/midiCXDX) Raw 迷笛接口;
SequencerInterface(/dev/snd/seq)音序器接口;
TimerInterface(/dev/snd/timer)定時器接口;

2.2.1 PCM設備

ALSA 已經為我們實現了功能強勁的 PCM 中間層,自己的驅動中只要實現一些底層的需要訪問硬件的函數即可。要訪問 PCM 的中間層代碼,你首先要包含頭文件,另外,如果需要訪問一些與hw_param 相關的函數,可能也要包含。每個 pcm 實例對應一個 pcm 設備文件。一個 pcm 實例由一個playback stream 和一個 capture stream 組成,這兩個 stream 又分別有一個或多個 substreams 組成,見圖2.2.1。

bf49c5a2-cae8-11ed-bfe3-dac502259ad0.png

圖2.2.1 聲卡中的pcm結構圖

2.2.2 Control設備

Control 接口主要讓用戶空間的應用程序(alsa-lib)可以訪問和控制音頻 codec 芯片中的多路開關,滑動控件等。用戶空間通過對 Control設備的操作,從而達到操作 CODEC 相關寄存器的目的。

2.2.3 ALSA設備文件命名規則

ALSA cards和聲卡硬件是一一對應的,ALSA cards主要保存每塊卡上的設備列表,一個card可以通過一個ID(字符串)或者從0開始的數字表示。大部分 ALSA 硬件訪問發生在 device 級別,可以從 0 開始枚舉每個卡的 devices,不同的 devices 可以獨立的打開和使用。

典型的,聲卡和設備這兩個標識足以決定聲音信號從哪里讀取,送到哪里。Subdevices 是 ALSA 能夠區分的更細粒度的對象。最常見的場景是一個 device 的每個 channel 都對應一個 subdevice 或者總共只有一個subdevice。一個 device 的 subdevice 理論上可以單獨使用,但是在一個subdevice 上播放 multi-channel 信號時,也會使用其余的 subdevices。和 device 一樣,subdevices 索引標識從 0 開始。

2.2.4 ALSA 設備文件實例說明

下面舉例查看某 Linux 系統中 dev/snd 路徑下 alsa 驅動設備文件:

crw-rw—-+ 1 root audio 116, 2 4 月 7 18:14 controlC0
crw-rw—-+ 1 root audio 116, 5 4月 7 18:14 controlC1
crw-rw—-+ 1 root audio 116, 3 4 月 7 18:15 pcmC0D3p
crw-rw—-+ 1 root audio 116, 7 4 月 7 18:15 pcmC1D0c
crw-rw—-+ 1 root audio 116, 6 4 月 18 10:38 pcmC1D0p


crw-rw—-+ 1 root audio 116, 8 4 月 7 18:14 pcmC1D2c
crw-rw—-+ 1 root audio 116, 1 4 月 7 18:14 seq
crw-rw—-+ 1 root audio 116, 33 4 月 7 18:14 timer

我們可以看到以下設備文件:

controlCX –>     用于聲卡的控制,例如通道選擇,混音,麥克風的控制等
pcmCXDXc –>      用于錄音的 pcm 設備
pcmCXDXp –>      用于播放的 pcm 設備
seq–>音序器
timer–>定時器

其中,CXDX 代表的是聲卡 X 中的設備 X,pcmC1D0c 最后一個 c 代表 capture,pcmC1D0p 最后一個 p 代表 playback,這些都是 alsa-driver中的命名規則。從上面的列表可以看出,聲卡下掛了 8 個設備,根據聲卡的實際能力,驅動實際上可以掛上更多種類的設備。通常最重要的兩個設備是 PCM 和 control。

2.3 HDA Driver分析

2.3.1 HDA硬件系統框架

HDA(High Definition Audio)是intel設計的用來取代AC97的音頻標準,硬件架構上由hda dodec和hda controller組成見圖2.3.1:

bf56a5b0-cae8-11ed-bfe3-dac502259ad0.png

圖2.3.1

2.3.2 Stream的概念

HAD 引入了 Streams 的概念來組織數據,并通過 HDA Link 總線進行數據傳輸。Stream 是一個在系統內存緩沖區和 codec 之間創建的邏輯的或虛擬的連接用以來呈現數據,該連接由單個 DMA 通道通過 Link總線驅動。一個 Stream 包含一個或多個相關的組件或數據 channels,每個 channel 都被動態綁定到 codec 中的一個單一 converter 上來呈現。

例如,一個立體聲 Stream 包括兩個 channels:左和右,在此 Stream 中的每一個采樣點應該包括兩個采樣數據:左和右。這些采樣在緩沖區中和在鏈路上傳輸的時候是組合在一起的,但是卻在 codec 中連接不同的DA 轉換器

2.3.3 HDA driver模型介紹

2.3.3.1 重要結構體azx

azx 是hda controller的結構體,其中struct hda_bus bus、struct snd_card *card、struct pci_dev *pci是三個重要結構體,分別表示總線、卡、設備。其kernel4.6版的結構體見下:

struct azx {
struct hda_bus bus;


struct snd_card *card;
struct pci_dev *pci;
int dev_index;


/* chip type specific */
int driver_type;  
unsigned int driver_caps;  
int playback_streams;  
int playback_index_offset;  
int capture_streams;  
int capture_index_offset;  
int num_streams;  
const int *jackpoll_ms; /* per-card jack poll interval */


/* Register interaction. */
const struct hda_controller_ops *ops;


/* position adjustment callbacks */
azx_get_pos_callback_t get_position[2];  
azx_get_delay_callback_t get_delay[2];


/* locks */
struct mutex open_mutex; /* Prevents concurrent open/close operations */


/* PCM */
struct list_head pcm_list; /* azx_pcm list */


/* HD codec */
int  codec_probe_mask; /* copied from probe_mask option */
unsigned int beep_mode;


#ifdef CONFIG_SND_HDA_PATCH_LOADER  
const struct firmware *fw;
#endif


/* flags */
int bdl_pos_adj;  
int poll_count;  
unsigned int running:1;  
unsigned int single_cmd:1;  
unsigned int polling_mode:1;  
unsigned int msi:1;  
unsigned int probing:1; /* codec probing phase */
unsigned int snoop:1;  
unsigned int align_buffer_size:1;  
unsigned int region_requested:1;  
unsigned int disabled:1; /* disabled by vga_switcheroo */


#ifdef CONFIG_SND_HDA_DSP_LOADER  
struct azx_dev saved_azx_dev;
#endif
};

2.3.3.2 hda dirver需要實現的操作功能函數

操作函數主要有兩類,一個是IO級操作函數,即寄存器讀寫;一個是功能級操作函數;

IO級操作:

structhdac_io_ops{
/*mappedregisteraccesses*/
void(*reg_writel)(u32value,u32__iomem*addr);
u32(*reg_readl)(u32__iomem*addr);
void(*reg_writew)(u16value,u16__iomem*addr);
u16(*reg_readw)(u16__iomem*addr);
void(*reg_writeb)(u8value,u8__iomem*addr);
u8(*reg_readb)(u8__iomem*addr);
/*Allocationops*/
int(*dma_alloc_pages)(structhdac_bus*bus,inttype,size_tsize,structsnd_dma_buffer*buf);
void(*dma_free_pages)(structhdac_bus*bus,structsnd_dma_buffer*buf);};

功能級操作:

struct hda_controller_ops {
/* Disable msi if supported, PCI only */
int (*disable_msi_reset_irq)(struct azx *);  
int (*substream_alloc_pages)(struct azx *chip,  
structsnd_pcm_substream*substream,
                     size_t size);  
int (*substream_free_pages)(struct azx *chip,  
struct snd_pcm_substream *substream);  
void (*pcm_mmap_prepare)(struct snd_pcm_substream *substream,  
struct vm_area_struct *area);  
/* Check if current position is acceptable */
int (*position_check)(struct azx *chip, struct azx_dev *azx_dev);  
/* enable/disable the link power */
int (*link_power)(struct azx *chip, bool enable);  
};

2.3.3.3 HDA dirver初始化流程

hda dirver的初始化流程見圖2.3.3.3:

bf705938-cae8-11ed-bfe3-dac502259ad0.png

圖2.3.3.3

三、ALSA-lib嵌入式平臺移植

雖然linux下alsa框架給用戶空間提供了系統調用,但alsa-lib對系統調用進行進一步封裝,并實現了很多插件,例如多音頻源進行混音播放時,調用的就是 dmix 插件。

3.1 軟件包下載

進入網站選擇下載合適版本的軟件包,見圖3.1:

bf8aadba-cae8-11ed-bfe3-dac502259ad0.png

圖3.1

其中,alsa-lib是ALSA 應用庫(必需基礎庫),alsa-utils包含一些ALSA小的測試工具.如aplay、arecord 、amixer播放、錄音和調節音量小程序,對于一些應用開發者只需要以上兩個軟件包就可以了。

3.2 配置和編譯

3.2.1 alsa-lib

準備

解壓alsa-lib-x.x.x.tar.bz2,進入解壓后目錄:

cd alsa-lib-x.x.x

配置

./configure --host=aarch64-linux-gnu 
--prefix=/usr/local/share/arm64-alsa 
--enable-static=yes --enable-shared=no 
--enable-python=no 
--with-configdir=/usr/local/share/alsa 
--with-plugindir=/usr/local/lib/alsa_lib 
--with-pcm-plugins=hw

其中配置參數–prefix=/usr/local/share/arm64-alsa 是編譯后結果的輸出路徑,–with-configdir=/usr/local/share/alsa它將影響 include/config.h中的 ALSA_CONFIG_DIR 目錄。

編譯

make 

安裝

make install

3.2.2 alsa-utils

準備

解壓alsa-utils-x.x.x.tar.bz2,進入解壓后目錄:

cd alsa-utils-x.x.x

配置

./configure 
--host=aarch64-linux-gnu 
--prefix=/usr/local/share/arm64-alsa CFLAGS="-I/usr/local/share/arm64-alsa/include" LDFLAGS="-L/usr/local/share/arm64-alsa/lib 
--lasound" 
--disable-alsamixer 
--disable-xmlto

編譯

make  

安裝

make install

3.2.3 移植

準備:

復制目標文件夾下的文件到嵌入式系統的根文件系統:

cp -rfa /usr/local/share/arm64-alsa/lib/*  /initramfs/lib/ 
cp -rfa /usr/local/share/arm64-alsa/bin/*  /initramfs/sbin/ 
cp -rfa /usr/local/share/arm64-alsa/sbin/* /initramfs/sbin/
cp -rfa /usr/local/share/alsa/*  /initramfs/usr/local/share/

配置環境變量:

在rootfs/etc/profile,添加如下兩行:

alsa_init
export ALSA_CONFIG_PATH=/usr/local/share/alsa/alsa.conf

生成跟文件系統:

find .|cpio -o -H newc|gzip -9 > $(pwd)/initramfs.img.gz

3.3 相關軟件應用

在alsa-utils包含一些ALSA小的測試工具,這些工具軟件都是基于alsa-lib的API實現的,其中amixer可以進行音頻通道選通和音量調節,aplay是播放音頻軟件,arecord是錄音軟件。





審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • PCM
    PCM
    +關注

    關注

    1

    文章

    195

    瀏覽量

    53166
  • Linux系統
    +關注

    關注

    4

    文章

    592

    瀏覽量

    27358
  • 電平信號
    +關注

    關注

    3

    文章

    24

    瀏覽量

    9138
  • alsa
    +關注

    關注

    0

    文章

    19

    瀏覽量

    3608

原文標題:ALSA(高級Linux聲音架構)淺析

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    百問網全志系列開發板音頻ALSA配置步驟詳解

    數字音頻系統中,A/D轉換器帶來的量化噪聲是不可避免的。 8.2 ALSA架構 ?ALSA全稱是Advanced Linux Sound Architecture,中文音譯是
    發表于 08-13 09:56

    linux alsa編譯錯誤,急等大俠解救

    /../arm-none-linux-gnueabi//sys-root/usr/include/sys/types.h:220,from /usr/include/stdlib.h:314,from /usr/include/alsa
    發表于 04-05 17:30

    迅為-4418開發板移植ALSA聲卡

    高級Linux 聲音體系(Advanced Linux Sound Architecture,縮寫為 ALSA)是
    發表于 12-08 10:20

    測試環境ubuntu12與其他linux系統有何異同

    測試環境 ubuntu12 與其他linux 系統大同小異 高級Linux聲音體系(英語:Advanced Linux Sound Arch
    發表于 07-29 07:17

    alsa-lib實現聲音數據捕獲保存與播放的方法

    內核: Linux3.5二、下載alsa-lib庫項目主頁下載地址:https://www.alsa-project.org/wiki/Main_PageFTP服務器下載地址(可下載歷史版本):ftp://ftp.
    發表于 12-24 08:17

    ALSA-lib移植的相關資料分享

    Linux ALSA音頻框架分析六:ALSA-lib移植 雖然linuxalsa框架給用戶空間提供了系統調用,但
    發表于 12-24 07:35

    LINUX音頻驅動架構相關資料分享

    1、LINUX音頻驅動架構  LINUX下音頻驅動開發,要遵循標準的ALSA架構,  下面分別從硬件架構
    發表于 11-04 15:57

    Linux下聲卡的安裝(ALSA

    Advanced Linux Sound Architecture (ALSA) 的網站: http://www.alsa-project.org/ 1、現在最新版的的驅動
    發表于 11-07 10:28 ?0次下載

    Linux ALSA聲卡驅動之ALSA架構簡介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構,想了解更多的關于ALSA的這一開源項目的信息和知識
    發表于 04-26 15:55 ?1132次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>ALSA</b>聲卡驅動之<b class='flag-5'>ALSA</b><b class='flag-5'>架構</b>簡介

    Linux ALSA聲卡驅動之一:ALSA架構簡介

    ALSA是Advanced Linux Sound Architecture 的縮寫,目前已經成為了linux的主流音頻體系結構,想了解更多的關于ALSA的這一開源項目的信息和知識
    發表于 05-10 13:44 ?1588次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>ALSA</b>聲卡驅動之一:<b class='flag-5'>ALSA</b><b class='flag-5'>架構</b>簡介

    學習Linux操作系統中Alsa音頻編程

    ALSA項目發起的起因是Linux下的聲卡驅動(OSS/Free drivers)沒有得到積極的維護。并且落后于新的聲卡技術。Jaroslav Kysela早先寫了一個聲卡驅動,并由此開始了ALSA項目,隨便,更多的開發者加入到
    發表于 05-10 14:27 ?5417次閱讀

    你知道Linux audio(OSS)子系統是怎樣?

    linux聲卡的驅動中存在兩種架構,一種是OSS(開放聲音系統),一種是ALSA(先進Linux聲音
    發表于 05-16 15:12 ?2013次閱讀
    你知道<b class='flag-5'>Linux</b> audio(OSS)子系統是怎樣?

    Linux應用開發【第八章】ALSA應用開發

    文章目錄 8 ALSA應用開發 8.1 音頻相關概念 8.1.1 采樣頻率 8.1.2 量化位數 8.2 ALSA架構 8.2.1 ALSA架構
    的頭像 發表于 12-10 19:19 ?884次閱讀
    <b class='flag-5'>Linux</b>應用開發【第八章】<b class='flag-5'>ALSA</b>應用開發

    高級linux聲卡架構ALSA概述及特點

    ALSA(Advanced Linux Sound Architecture )是高級 linux 聲卡架構簡稱,是目前
    發表于 10-17 10:35 ?4276次閱讀

    Sitara Linux ALSA DSP麥克風陣列語音識別

    電子發燒友網站提供《Sitara Linux ALSA DSP麥克風陣列語音識別.pdf》資料免費下載
    發表于 10-10 09:13 ?0次下載
    Sitara <b class='flag-5'>Linux</b> <b class='flag-5'>ALSA</b> DSP麥克風陣列語音識別