為了方便管理音頻資源和降低應用對音頻控制的複雜性,使用媒體播放後台
來管理對聲音的播放和音頻資源的訪問。媒體播放後台要求具有以下的功能:
1. 基於優先順序的搶佔、恢複處理。
2. 支援多個應用的同時對音頻資源的訪問,以及混合、交替式的播放。
3. 支援對發音裝置的控制。
4. 具有訊息上報機制。播放結束、播放停止、播放暫停、當前位置等。
5. 應用可以主動查詢當前的狀態。
媒體播放後台由播放對象管理器、播放服務介面兩部份組成。播放對象對應於不同的播放需求,
其包含了當前播放請求的優先順序、回複處理機制、裝置要求等資訊。播放服務介面是基於媒體播放庫
實現,為播放對象提供播放功能的。分離了媒體播放後台同實際播放庫的聯絡。
媒體播放後台採用了DBUS服務的方式為應用提供播放介面。應用通過DBUS介面向媒體播放後台
申請自己的播放對象。在播放請求時若其優先順序低於當前的播放對象,則會播放失敗。反之,則會搶佔
當前的播放對象,並在自己結束後恢複其搶佔的播放對象。採用了播放對象鏈表的方式,實現了此
功能。每一個播放對象都會有一個指向其搶佔的播放對象的指標,為恢複做準備。
只有同優先順序的播放對象,才允許混合和交替的播放方式。這裡一個比較複雜的例子就是
多路通話時,要求每路通話都有獨立的通話背景音和通話錄音。在這裡每一路通話都會為自己分別
建立一個背景音播放對象,和錄音對象。在切換通路時,播放對象也會跟著切換,並保持原有的到
暫停狀態。
耳機和藍芽耳機的連結監控也是在媒體播放後台裡實現的。耳機通過監控IO實現,藍芽耳機通過
BLUEZ-AUIDO DBUS上報訊號實現。每次有裝置更新,或者播放對象更新時,都需要重新查詢
當前播放對象的裝置要求情況和當前裝置情況來配置、更新裝置狀態。
媒體播放後態的訊息繼承了GObject的訊號機制實現。其步驟如下:
應用程式向播放器API註冊回呼函數。
播放器API向DbusProxy註冊回呼函數。
當有事件發生時:
播放器後台把事件上報給用戶端的DbusProxy。
DbusProxy把事件上報給播放器API。
播放器API把事件上報給應用程式
一些和媒體播放後台打交道的應用都是通過媒體播放用戶端來實現的。