王佩光+操李節(jié)
摘 要: 介紹一種移動操作系統(tǒng)音頻模塊設(shè)計(jì)實(shí)現(xiàn)方法。該音頻模塊采用開源項(xiàng)目PulseAudio作為音頻處理單元,用ALSA與底層硬件交互,由AudioManager提供API供上層應(yīng)用調(diào)用,實(shí)現(xiàn)操作系統(tǒng)的音頻通路切換與音量調(diào)節(jié)等功能。文章首先介紹音頻系統(tǒng)架構(gòu),然后從音頻控制單元AudioManager出發(fā),詳細(xì)介紹系統(tǒng)音頻分類以及AudioManager提供給上層調(diào)用的方法,最后介紹音頻通路與音量調(diào)節(jié)的實(shí)現(xiàn)。
關(guān)鍵詞: 移動操作系統(tǒng); 音頻模塊; AudioManager; 通路切換; 音量調(diào)節(jié)
中圖分類號:TP316 文獻(xiàn)標(biāo)志碼:A 文章編號:1006-8228(2017)02-01-04
0 引言
音頻系統(tǒng)是移動操作系統(tǒng)不可或缺的子系統(tǒng)之一,它負(fù)責(zé)處理所有與聲音相關(guān)的信息,隨著移動操作系統(tǒng)功能設(shè)計(jì)的越來越全面和人性化,對音頻的精準(zhǔn)控制提出了更高的要求,例如不同情況下不同的輸出方式以及不同模式下的音量調(diào)節(jié)互不影響。這就對音頻系統(tǒng)的功能提出了更高的要求。android系統(tǒng)的音頻子系統(tǒng)是一款成熟的音頻系統(tǒng)[1-3],谷歌公司為它的音頻系統(tǒng)設(shè)計(jì)了一套全局音頻管理器——AudioFinger,并精簡了ALSA來與硬件交互。本文所涉及的移動操作系統(tǒng)采用開源項(xiàng)目pulseaudio作為音頻處理單元,并采用ALSA與硬件交互[4-5]。
PulseAudio[6]是一個(gè)跨平臺的,可通過網(wǎng)絡(luò)工作的聲音服務(wù),它的主要特點(diǎn)包括[7]:
⑴ 可對每一個(gè)應(yīng)用程序進(jìn)行音量控制;
⑵ 可擴(kuò)展的插件與支持可裝載模塊架構(gòu);
⑶ 兼容性許多流行的音頻應(yīng)用程序;
⑷ 支持多重音源和多重輸出;
⑸ 低延時(shí)操作和支持延遲測量;
⑹ 一個(gè)對處理器資源效率零拷貝內(nèi)存架構(gòu);
⑺ 能夠發(fā)現(xiàn)本地網(wǎng)絡(luò)上使用PulseAudio的其他計(jì)算機(jī)并通過其揚(yáng)聲器直接播放聲音;
⑻ 能夠改變一個(gè)應(yīng)用程序的聲音輸出設(shè)備,就算這個(gè)應(yīng)用程序在播放聲音(程序不需要支持這個(gè)特性,而事實(shí)上,程序甚至沒有意識到改變);
⑼ 帶有腳本功能的命令行界面;
⑽ 一個(gè)功能完善且?guī)в忻钚兄匦屡渲霉δ艿氖刈o(hù)進(jìn)程;
⑾ 內(nèi)置采樣轉(zhuǎn)換和重采樣功能;
⑿ 能夠合并多塊聲卡成一個(gè)聲卡;
⒀ 能夠同步播放多個(gè)音頻流;
⒁ 動態(tài)檢測藍(lán)牙音頻設(shè)備;
⒂ 使全系統(tǒng)均衡的能力。
1 系統(tǒng)架構(gòu)
安卓音頻系統(tǒng)架構(gòu)從上到下可以分為5層,從上到下分別:Application、Framework、Libraries、HAL、Linux Kernel。Application為運(yùn)行在最上層的各種應(yīng)用,F(xiàn)ramework是對Libraries的封裝,為上層Application的開發(fā)提供標(biāo)準(zhǔn)接口,Libraries是整個(gè)系統(tǒng)的核心,負(fù)責(zé)完成音頻的控制與處理。本文涉及的音頻系統(tǒng)在層級上與android系統(tǒng)大同小異,同樣分為Application、Framework、Libraries、HAL、Linux Kernel這幾層,但在Framework、Libraries擁有不同的實(shí)現(xiàn)方式,具體架構(gòu)見圖1。
⑴ Framework
Framework層提供兩個(gè)模塊,分別為AudioManager模塊與Ngfd模塊。
AudioManager模塊的設(shè)計(jì)思想源于android系統(tǒng)的AudioManager類,本系統(tǒng)的AudioManager模塊提供了一系列與音量控制相關(guān)的方法供上層應(yīng)用調(diào)用,以方便應(yīng)用程序控制音量。AudioManager又分為三個(gè)模塊:Volume、Route、Profile,這三個(gè)模塊分別負(fù)責(zé)音量調(diào)節(jié)、通路以及策略。AudioManager模塊最終都是通過調(diào)用PulseAudio接口來實(shí)現(xiàn)對音量的控制。Ngfd模塊提供與振動相關(guān)的接口供上層應(yīng)用調(diào)用。
⑵ Libraries
Libraries層提供兩個(gè)模塊,分別為PulseAudio和Profiled,其中PulseAudio為開源項(xiàng)目,提供音頻控制相關(guān)方法,PulseAudio具體實(shí)現(xiàn)方式本文不做探究,Profiled負(fù)責(zé)提供音頻策略。
2 AndroidManager方法說明
移動操作系統(tǒng)一般具有多種不同類型的音頻,例如:鈴聲、通知、鬧鐘、短消息等等,所以這需求音頻系統(tǒng)能夠?qū)Σ煌愋偷囊纛l分別進(jìn)行設(shè)置,為此,本文將音頻分為如下7種類型(role),放在一個(gè)枚舉類型中:
AudioManager控制整個(gè)音頻系統(tǒng)由一系列的方法來完成,每種方法具有自己獨(dú)特的功能,在本文所設(shè)計(jì)的音頻系統(tǒng)中,將方法歸結(jié)為16種,每種方法的介紹與實(shí)現(xiàn)如下。
⑴ Audio Role
AM_ROLE_TYPE getActiveRole()——返回當(dāng)前活動的Role,其取值是AM_ROLE_TYPE枚舉類型。
⑵ 音量控制
int getVolume(AM_ROLE_TYPE role)——返回指定Role的當(dāng)前音量,其取值范圍為0~100。輸入?yún)?shù)為Role,其取值A(chǔ)M_ROLE_TYPE枚舉類型。
void setVolume(AM_ROLE_TYPE role, int volume)——設(shè)置指定Role的當(dāng)前音量,其取值范圍為0~100。
⑶ 音量調(diào)節(jié)
void adjustVolume(AM_ROLE_TYPE role, AM_ADJUST_DIRECTION direction)——側(cè)鍵設(shè)置音量的接口,其輸入?yún)?shù)除了Role外,還有一個(gè)用于指導(dǎo)操作的參數(shù)direction,其取值為ADJUST_LOWER,ADJUST_RAISE和ADJUST_SAME三者之一。目前系統(tǒng)的步長音量分為12級。
本文所述音頻系統(tǒng)借鑒android系統(tǒng)的分層架構(gòu),采用PulseAudio作為音頻處理單元,完成了音頻策略制定、情景模式切換以及音量調(diào)節(jié)功能,并提供API供上層開發(fā)人員調(diào)用。本音頻系統(tǒng)劃分了多種音頻類型,并制定了多種音頻通路,能滿足操作系統(tǒng)多樣化的音頻調(diào)節(jié)功能需求,但由于有時(shí)需要快速地在靜音、振動與正常三種模式之間切換,所以本音頻系統(tǒng)加入了情景模式切換功能,用戶能更便捷的在這三種模式中切換。
參考文獻(xiàn)(References):
[1] 楊豐盛.Android應(yīng)用開發(fā)揭秘[M].機(jī)械工業(yè)出版社,2010.
[2] 王波濤.移動多媒體技術(shù)介紹[M].機(jī)械工業(yè)出版社,2011.
[3] 韓超,梁泉.Android系統(tǒng)級深入開發(fā)——移植與調(diào)試[M].電
子工業(yè)出版社,2010.
[4] 姚昱旻,劉衛(wèi)國.Android的架構(gòu)與應(yīng)用開發(fā)研究[J].計(jì)算機(jī)系
統(tǒng)應(yīng)用,2008.11:24,110-112
[5] 李楊,馮剛,李亮,羅擁華.基于Android的多媒體應(yīng)用開發(fā)與
研究[J].計(jì)算機(jī)與現(xiàn)代化,2011.4:149-152
[6] https://wiki.archlinux.org/index.php/PulseAudio,archlinux
[7] http://www.oschina.net/p/pulseaudio,開源中國,2009.