openKylin系統(tǒng)音頻大體框架介紹
在桌面操作系統(tǒng)中,音頻是至關(guān)重要的一環(huán),音頻的穩(wěn)定支持直接決定了用戶的聽感以及使用體驗(yàn),今天我們就給大家介紹openKylin桌面操作系統(tǒng)背后關(guān)于音頻的那些故事。
先看一張框架圖,這張圖大致介紹了openKylin操作系統(tǒng)音頻的框架組成,層次從下往上依次遞增:
01框架各層次關(guān)系
在UKUI桌面環(huán)境中,聲音(ukui-media)主要用來控制系統(tǒng)的輸入輸出音量。ukui-media使用pulseaudio-lib 和 alsa-lib庫來獲取一系列的輸入輸出設(shè)備,以及控制相應(yīng)輸入輸出設(shè)備的音量。
openKylin系統(tǒng)使用pulseaudio聲音服務(wù)器來作為操作系統(tǒng)和alsa的通信媒介,pulseaudio聲音服務(wù)器介于應(yīng)用程序和聲卡驅(qū)動之間。當(dāng)不同的應(yīng)用調(diào)用聲音服務(wù)器的API來播放聲音時,它們把音頻數(shù)據(jù)送到服務(wù)器, 服務(wù)器將一個以上的播放請求混音后,再發(fā)送給底層的聲卡驅(qū)動(ALSA或OSS)。由ALSA或OSS來驅(qū)動聲卡播放混音后的數(shù)據(jù)。
02各層次詳細(xì)介紹
1、ukui-media
ukui-media的界面如下圖所示,其可以對系統(tǒng)聲音進(jìn)行圖形化控制。
聲音托盤中會顯示可用的輸出設(shè)備,點(diǎn)開“聲音設(shè)置”字樣,我們會進(jìn)入更全面的聲音設(shè)置界面。
其功能有:
1、可以選擇可用的輸入輸出設(shè)備
2、改變可用的輸入輸出設(shè)備音量
3、輸出設(shè)備聲道平衡功能
4、輸入設(shè)備降噪功能
5、設(shè)置對應(yīng)系統(tǒng)功能的提示音音效
關(guān)于以上功能的實(shí)現(xiàn),其中的底層邏輯就涉及到接下來要講的 pulseaudio 層。
2、PulseAudio層
ukui-media 的實(shí)現(xiàn),其主要是調(diào)用了 pulseaudio-lib 庫。PulseAudio是一個聲音服務(wù)器,也是一個后臺進(jìn)程,其從一個或多個音源(進(jìn)程或輸入設(shè)備)接受聲音輸入,然后重定向到一個或多個槽(聲卡,網(wǎng)絡(luò)音頻支持,或其他進(jìn)程)。
其主要功能有:
1、可對每一個應(yīng)用程序進(jìn)行音量控制
2、可擴(kuò)展的插件與支持可裝載模塊架構(gòu)
3、兼容性許多流行的音頻應(yīng)用程序
4、支持多重音源和多重輸出
5、低延時操作和支持延遲測量
6、一個對處理器資源效率零拷貝內(nèi)存架構(gòu)
7、能夠發(fā)現(xiàn)本地網(wǎng)絡(luò)上使用PulseAudio的其他計(jì)算機(jī)并通過其揚(yáng)聲器直接播放聲音
8、能夠改變一個應(yīng)用程序的聲音輸出設(shè)備,就算這個應(yīng)用程序在播放聲音(程序不需要支持這特性,而事實(shí)上,程序甚至沒有意識到改變)
9、帶有腳本功能的命令行界面
10、一個功能完善且?guī)в忻钚兄匦屡渲霉δ艿氖刈o(hù)進(jìn)程
11、內(nèi)置采樣轉(zhuǎn)換和重采樣功能
12、能夠合并多塊聲卡成一個聲卡
13、能夠同步播放多個音頻流
14、動態(tài)檢測藍(lán)牙音頻設(shè)備
15、使全系統(tǒng)均衡的能力
在前文有提到,pulseaudio聲音服務(wù)器介于應(yīng)用程序和聲卡驅(qū)動之間,意思是pulseaudio并不是最底層的實(shí)現(xiàn),他是在調(diào)用alsa-lib的基礎(chǔ)上添加了更豐富的功能,但是其底層實(shí)現(xiàn)還是離不開 alsa-lib。
3、ALSA層
從前文可知,真正驅(qū)動底層硬件的是ALSA,ALSA是目前Linux主流的音頻體系架構(gòu),全稱(Advanced Linux Sound Architecture, 高級linux音頻架構(gòu))。如果說PulseAudio是用戶級的混音器(mixer),它直接管理你的聲卡,那么ALSA就是內(nèi)核級混音器。在運(yùn)行時,PulseAudio使用ALSA提供的驅(qū)動,管理各種混合、設(shè)備、網(wǎng)絡(luò)音頻支持等涉及音頻的服務(wù)。
說到ALSA,我們就不得不先提到OSS(Open Sound System),這是unix平臺上一個統(tǒng)一的音頻接口。此前,每個Unix廠商都會提供一個自己專有的API,用來處理音頻。這就意味著為一種Unix平臺編寫的音頻處理應(yīng)用程序,在移植到另外一種Unix平臺上時,必須要重寫。
不僅如此,在一種平臺上具備的功能,可能在另外一個平臺上無法實(shí)現(xiàn)。但是,OSS出現(xiàn)以后情況就大不一樣了,只要音頻處理應(yīng)用程序按照OSS的API來編寫,那么在移植到另外一個平臺時,只需要重新編譯即可。因此,OSS提供了源代碼級的可移植性。
ALSA可以看成是OSS的繼任者,但是ALSA卻沒有完全擺脫OSS的影子,ALSA的兼容層是包含OSS的,ALSA支持舊版本的OSS API 接口,能為大多數(shù)的OSS應(yīng)用程序提供兼容,ALSA也因?yàn)槠渫该餍?、高效性、靈活性,以及了兼容性,使之成為了Linux音頻系統(tǒng)的標(biāo)準(zhǔn),也成為了幾乎其他所有的音頻架構(gòu)和硬件通信的橋梁。
03框架實(shí)現(xiàn)方案
結(jié)合以上,openKylin桌面系統(tǒng)關(guān)于聲音的框架方案就清晰了:
用戶層,使用ukui-media給用戶提供方便的可視化圖形控制界面
功能層:使用pulseaudio來實(shí)現(xiàn)豐富的功能
驅(qū)動層:調(diào)用alsa-lib 來高效實(shí)現(xiàn)底層驅(qū)動
如下圖所示:
舉個例子,針對于一個完整的調(diào)節(jié)音量過程大致是這樣,用戶使用面板上的音量調(diào)節(jié)工具調(diào)節(jié)音量時,實(shí)際上調(diào)節(jié)的是個虛擬設(shè)備,用戶調(diào)節(jié)PulseAudio的虛擬設(shè)備,PulseAudio調(diào)節(jié)ALSA,ALSA調(diào)節(jié)完底層硬件后,反饋給PulseAudio,PulseAudio再反饋給虛擬設(shè)備,按原路返回。大致流程如下圖所示:
04具體功能實(shí)現(xiàn)舉例
1、可用端口搜尋
可用端口的實(shí)現(xiàn),首先需要將所有聲卡中能進(jìn)行輸出的端口列出來,然后對所有的端口進(jìn)行識別判斷其可用性。實(shí)現(xiàn)可用端口的好處:能夠?qū)⒙暱ㄖ凶R別到所有的可用端口都顯示出來,有的聲卡有多個可用的輸出端口,只是在不同的profile中,這樣用戶能更簡潔到看到聲卡支持的輸入輸出設(shè)備,如下圖所示:
2、默認(rèn)輸入輸出設(shè)備邏輯
每當(dāng)系統(tǒng)的輸入輸出端口改變時,則有可能會更改默認(rèn)的輸入/輸出設(shè)備,如右圖所示設(shè)置默認(rèn)的輸出設(shè)備如下圖所示:
因此,我們設(shè)置了一個不同設(shè)備的優(yōu)先級,即如果有多個可選擇設(shè)備存在的情況,我們會優(yōu)先選擇優(yōu)先級高的設(shè)備作為默認(rèn)設(shè)備,大致實(shí)現(xiàn)流程如下:
今天的講解到這就結(jié)束啦~通過前面的講解,大致介紹了openKylin系統(tǒng)關(guān)于聲音這一部分的主要框架邏輯,其使用了ukui-media給用戶提供了圖形化界面,結(jié)合pulseaudio對于各功能的實(shí)現(xiàn),附加上alsa對底層硬件的高效率處理,其體驗(yàn)效果能使音頻完美呈現(xiàn)且穩(wěn)定運(yùn)行,后期我們也會進(jìn)一步完善其功能,歡迎感興趣的小伙伴來與我們進(jìn)行更深入的探討~