王佩光+操李節

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