方寧生13馮瀟翔13
(1.江蘇省物聯(lián)網(wǎng)應(yīng)用技術(shù)重點建設(shè)實驗室,無錫 214064; 2.無錫太湖學(xué)院 物聯(lián)網(wǎng)工程學(xué)院,無錫 214064;3.東南大學(xué) 計算機(jī)科學(xué)與工程學(xué)院,南京 210018)
隨著全球汽車工業(yè)的飛速發(fā)展,車載多媒體成為人們開車和娛樂的必要設(shè)備。絕大多數(shù)汽車的音響系統(tǒng)收音功能部分設(shè)有FM和AM頻道,但由于它們的信號會受到方向和距離的限制,信號差時對音質(zhì)音量影響頗大[1]。同時,地面廣播系統(tǒng)無法實現(xiàn)全面覆蓋,但是在全國范圍內(nèi)建立了單頻廣播網(wǎng),所以在汽車行駛過程中無法連續(xù)收聽同一個節(jié)目內(nèi)容[2-3]?,F(xiàn)在北美洲采用SiriusXM(天狼星)的衛(wèi)星廣播系統(tǒng),它可以打破收音信號在方向和距離上的限制,克服上面所述的信號缺陷,能夠為高速行駛中的汽車提供高質(zhì)量的廣播,讓用戶駕車行駛在任意一條公路上時,都可以隨時、無間斷地收聽自己喜愛的廣播頻道。與此同時,SiriusXM系統(tǒng)相比于傳統(tǒng)收音系統(tǒng)擁有更多的頻道和功能。
本文設(shè)計并實現(xiàn)與SiriusXM SDK交互的通信協(xié)議,通過及時并準(zhǔn)確的協(xié)議處理,保證數(shù)據(jù)響應(yīng)的實時性。在軟件的用戶界面和邏輯中間件,為用戶提供迅速的案件響應(yīng)和界面數(shù)據(jù)顯示,保證系統(tǒng)消息處理的穩(wěn)定性和數(shù)據(jù)格式的規(guī)范性。在用戶界面和邏輯中間完成的基礎(chǔ)之上,實現(xiàn)該軟件的功能需求,包括基本音頻服務(wù)和高級音頻服務(wù)。最后,利用專業(yè)測試軟件,完成并通過SiriusXM認(rèn)證測試。
基于SiriusXM系統(tǒng)的音頻播放軟件在功能結(jié)構(gòu)上可劃分為基本音頻服務(wù)、高級音頻服務(wù)、系統(tǒng)廣播信息處理三大部分。如圖1所示。
圖1 音頻播放軟件總體架構(gòu)
(1)基本音頻服務(wù),主要包括:基礎(chǔ)頻道調(diào)節(jié)、瀏覽功能,為用戶提供快速的頻道選擇手段;用戶界面信息提示功能,及時為用戶展現(xiàn)當(dāng)前應(yīng)用程序的服務(wù)狀態(tài)。
(2)高級音頻服務(wù),主要提供SiriusXM系統(tǒng)服務(wù)的特色功能,包括節(jié)目的即時重放、搜索,曲目標(biāo)記,頻道混合等,這些功能是本文所設(shè)計實現(xiàn)的播放軟件的核心功能。
(3)系統(tǒng)廣播消息處理,在應(yīng)用程序正常使用過程中,會經(jīng)常出現(xiàn)被系統(tǒng)其它應(yīng)用中斷的情況,例如:藍(lán)牙電話接聽、倒車模式開啟等。當(dāng)這些事件發(fā)生時,系統(tǒng)會廣播這個事件消息,應(yīng)用程序需要及時響應(yīng)并處理。一般來說,會自動隱藏自身程序界面,展示中斷事件發(fā)起者的程序界面。
這里的軟件在整個系統(tǒng)中為軟件中間件,就是本系統(tǒng)所設(shè)計實現(xiàn)的播放軟件的動態(tài)鏈接庫(SiriusXM.dll)。中間件在整個軟件架構(gòu)中實現(xiàn)承上啟下的核心作用,將用戶的操作控制請求傳遞給下面的SXM SDK,同時將SXM SDK封裝好的數(shù)據(jù)解析并處理,最后交付到用戶界面。整個軟件的操作時序和流程控制,命令響應(yīng)回復(fù)時間控制,都對中間件的設(shè)計提出了高性能的要求。
中間件(SiriusXM.dll)在設(shè)計上總共分為三個部分,分別是:提供給用戶界面的操作接口類(SiriusXMRunTime.cpp)、命令操作控制類(SiriusXMControl.cpp)以及提供給底層SDK的消息回調(diào)類(SiriusXMResp.cpp),如圖2所示。
圖2 中間件結(jié)構(gòu)
提供給用戶界面的操作接口類是一個全局的單例接口,在動態(tài)鏈接庫加載時被實例化,可被用戶界面直接調(diào)用,從而告知中間件當(dāng)前界面的狀態(tài)和用戶的操作。
命令操作控制類負(fù)責(zé)所有用戶操作和控制命令的解析和處理,是中間件中最核心的部分。在它的初始化過程中,首先需要通知操作系統(tǒng)打開預(yù)先設(shè)置好的GPIO端口,給SiriusXM芯片上電,并通知SDK進(jìn)行初始化并打開與SiriusXM系統(tǒng)服務(wù)進(jìn)行通信的串口。隨后讀取在車機(jī)中保存的應(yīng)用程序LastMemory備份文件,將文件中的數(shù)據(jù)參數(shù)發(fā)送到SDK,從而轉(zhuǎn)交給SiriusXM系統(tǒng)服務(wù)。在這之后,一直處于監(jiān)聽狀態(tài),等待SDK和用戶界面的操作指令。
提供給底層SDK的消息回調(diào)類,根據(jù)SDK回調(diào)函數(shù)的注冊頭文件包說明,在SDK中注冊了目前所有中間件需要的消息信息回調(diào)函數(shù),以接收SDK隨時發(fā)送過來的數(shù)據(jù)。這些函數(shù)絕大部分都是傳遞了SDK轉(zhuǎn)發(fā)的系統(tǒng)服務(wù)的指示類命令數(shù)據(jù),在接收到這些命令數(shù)據(jù)后,中間件根據(jù)解析后的數(shù)據(jù)進(jìn)行相對應(yīng)的操作。每一類指示均是由單獨對應(yīng)的回調(diào)函數(shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā),回調(diào)函數(shù)不對數(shù)據(jù)進(jìn)行處理和解析,僅僅是將數(shù)據(jù)原封不動地全部交付給操作控制類。由于SiriusXM系統(tǒng)服務(wù)使用的是握手協(xié)議,所以在這其中,還有一個消息確認(rèn)回調(diào)函數(shù),由SDK返回系統(tǒng)服務(wù)的確認(rèn)消息幀[12-13]。
本論文主要是在車載設(shè)備上實現(xiàn)SiriusXM衛(wèi)星廣播收音功能,根據(jù)SiriusXM公司的要求,SiriusXM衛(wèi)星廣播系統(tǒng)在服務(wù)內(nèi)容上可以分為基本音頻服務(wù)和高級音頻服務(wù)。其中,基本音頻服務(wù)與傳統(tǒng)地面廣播系統(tǒng)類似,支持頻道切換,瀏覽以及一般的界面提示信息,為用戶提供了最基本的音頻播放功能。
軟件應(yīng)用程序為用戶提供了2種頻道向?qū)Чδ?,頻道調(diào)節(jié)和頻道瀏覽。用戶可以根據(jù)自己的意愿隨意更換當(dāng)前正在播放的頻道。同時,所有可以被用戶收聽的頻道也羅列在用戶界面上,用戶可以隨時查看目前所有可收聽的頻道和頻道類型。
3.1.1 頻道調(diào)節(jié)
頻道調(diào)節(jié)包括直接調(diào)頻和快速連續(xù)調(diào)頻。用戶可以選擇特定的頻道進(jìn)行播放,也可以類似掃描功能一樣,連續(xù)快速地向上或向下切換頻道。軟件應(yīng)用程序在這個過程中,需要切換當(dāng)前正在播放的頻道,處理切換后頻道的數(shù)據(jù)信息并顯示在用戶界面上,同時從揚聲器輸出該頻道的音頻。
按照SiriusXM的消息機(jī)制,在頻道調(diào)節(jié)時,需要進(jìn)行兩次握手。軟件應(yīng)用程序向SiriusXM系統(tǒng)服務(wù)發(fā)送頻道調(diào)節(jié)命令(ChanSelectCmd)并等待系統(tǒng)服務(wù)的應(yīng)答(ChanSelectResp)。應(yīng)用程序接收到應(yīng)答后,繼續(xù)等待系統(tǒng)服務(wù)的頻道調(diào)節(jié)成功指示(ChanSelectInd),此時說明系統(tǒng)服務(wù)已經(jīng)調(diào)頻成功,應(yīng)用程序回復(fù)確認(rèn)(ChanSelectCfm)并更新用戶界面顯示信息。
圖3是頻道調(diào)節(jié)流程圖。首先應(yīng)用程序會對當(dāng)前選擇的頻道進(jìn)行合法性判斷,也就是頻道號和服務(wù)號是否在給定范圍之內(nèi)。接下來向系統(tǒng)服務(wù)發(fā)送頻道調(diào)節(jié)命令,根據(jù)系統(tǒng)服務(wù)的消息類型進(jìn)行顯示操作,如果是指示類消息,則說明頻道調(diào)節(jié)成功,如果是顯示類消息,則是失敗,需要更新用戶界面對用戶進(jìn)行相關(guān)提示。
在頻道調(diào)節(jié)過程中,因為在接收到系統(tǒng)服務(wù)的頻道調(diào)節(jié)應(yīng)答后,軟件仍然處于播放當(dāng)前頻道的狀態(tài)中,如果此時立即切換到新的頻道,可能產(chǎn)生瞬間噪音。為了避免這種情況,應(yīng)在這個過程中增加了聲音的控制處理。當(dāng)應(yīng)用程序發(fā)送了頻道調(diào)節(jié)命令并接收到了系統(tǒng)服務(wù)的應(yīng)答消息后,應(yīng)用程序強(qiáng)制關(guān)閉揚聲器的聲音輸出,并在接收到調(diào)節(jié)成功的指示消息后,再打開聲音輸出,這樣可有效地避免瞬間噪聲。
圖3 頻道調(diào)節(jié)
快速調(diào)頻功能的實現(xiàn)是在頻道調(diào)節(jié)的基礎(chǔ)之上,定時去檢查是否有新的請求。接收到新的調(diào)頻請求時,順序增加或減少頻道服務(wù)號并重新進(jìn)入頻道調(diào)節(jié)流程。如圖4所示。
圖4 快速調(diào)頻
3.1.2 頻道瀏覽
用戶在進(jìn)行頻道瀏覽的同時,當(dāng)前頻道繼續(xù)保持播放狀態(tài),在瀏覽列表中,可顯示出每個頻道當(dāng)前正在播放的內(nèi)容信息。
類似于頻道調(diào)節(jié)流程,軟件應(yīng)用程序向SiriusXM系統(tǒng)服務(wù)發(fā)送頻道瀏覽命令(ChanBrowseCmd),并等待系統(tǒng)服務(wù)的應(yīng)答消息(ChanBrowseResp)。接收到應(yīng)答消息后,繼續(xù)等待指示消息(ChanBrowseInd),指示消息中會包含所有頻道的數(shù)據(jù)信息,成功接收后返回確認(rèn)(ChanBrowseCfm)。
當(dāng)前可瀏覽的所有頻道都保存在一個結(jié)構(gòu)體數(shù)組SXMChanListInfo[384]中,最多可支持384個頻道。每個頻道的結(jié)構(gòu)體定義如下:
struct SXMChanInfo{
WORD channel_id; //頻道號
WORD service_id; //該頻道的唯一服務(wù)號
UINT8 channel_attr; //頻道屬性
UINT8 category_id; //最多可以屬于4種類型,category_number[0]是它的主類型
UCHAR channel_name[17]; //該頻道的名字
UCHAR category_name[17]; //該頻道類型的名字
UCHAR artist [17]; //藝術(shù)家名字
UCHAR song [17]; //曲目標(biāo)題
UCHAR content [37]; //其他內(nèi)容信息
};
所有的頻道信息都由這個結(jié)構(gòu)體數(shù)組來維護(hù),當(dāng)有頻道信息更新時,對該結(jié)構(gòu)體數(shù)組重新賦值。從結(jié)構(gòu)體中可以看出,當(dāng)用戶在瀏覽其他頻道時,不需要真正播放該頻道,就可以查看到這個頻道當(dāng)前正在播放的內(nèi)容。
每個頻道都有一個種類屬性,標(biāo)記頻道類別,軟件應(yīng)用程序根據(jù)不同的類別對所有頻道進(jìn)行分類。在用戶界面,用戶可以查看同一類別的不同頻道。
SiriusXM系統(tǒng)服務(wù)不僅僅提供類似地面廣播的基本音頻服務(wù),同時也提供了很多功能強(qiáng)大的高級音頻服務(wù),這也是SiriusXM產(chǎn)品的核心功能,大大增強(qiáng)了用戶的駕車體驗。高級音頻服務(wù)有:即時重放、藝術(shù)家/曲目搜索、體育賽事、歌曲標(biāo)記、Tune start和頻道混合等。
3.2.1 即時重放
即時重播功能可以讓用戶隨時暫停當(dāng)前頻道或回放頻道內(nèi)容。調(diào)諧器會對收藏列表中的所有頻道(最大支持18個),以及當(dāng)前正在播放頻道進(jìn)行數(shù)據(jù)緩存。通常調(diào)諧器會對每個頻道緩存30分鐘的直播數(shù)據(jù)。當(dāng)數(shù)據(jù)超過30分鐘時,自動刪除最早的數(shù)據(jù),始終保證距離直播點30分鐘。
如果當(dāng)前頻道正在直播狀態(tài),用戶選擇暫停頻道,此時調(diào)諧器將自動緩存頻道從暫停點開始的所有直播數(shù)據(jù),并在界面上顯示當(dāng)前點距離直播的時間。在用戶選擇播放后,依然從暫停點開始繼續(xù)播放。同時,可在緩存范圍內(nèi)進(jìn)行快進(jìn)退操作。
這些緩存內(nèi)容會在整機(jī)重啟或斷開調(diào)諧器連接后自動清除。同時,若是非收藏頻道,在用戶執(zhí)行切換頻道時,該頻道的緩存也會被清除。
3.2.2 即時重放功能配置
在軟件應(yīng)用程序初始化成功,并從底層SDK獲取到SiriusXM系統(tǒng)服務(wù)與車載設(shè)備CPU連接成功的消息之后,會主動向系統(tǒng)服務(wù)發(fā)送服務(wù)的配置命令(SxiModuleCfgCmd)。其中就包含了即時重放功能的三個重要參數(shù):IRControl,IRDeleteOnTune,IRMarkNewTrack。見表1所示。
表1 即時重放參數(shù)配置
在軟件的需求中明確要求了該功能的配置是切換頻道后刪除緩存并且需要記錄節(jié)目ID,所以在發(fā)送配置命令時,這三個參數(shù)的值都等于1。
3.2.3 即時重放界面顯示
當(dāng)應(yīng)用程序進(jìn)入即時重放功能后,用戶界面需要對當(dāng)前播放的進(jìn)度給予用戶最直觀的展示。這包括當(dāng)前緩存占用率和當(dāng)前播放節(jié)目的進(jìn)度。應(yīng)用程序可以通過IRRecordInfoInd和IRPlaybackInfoInd來獲取當(dāng)前實時數(shù)據(jù)。其中,IRRecordInfoInd提供了當(dāng)前該頻道已經(jīng)緩存的內(nèi)容占用率,IRPlaybackInfoInd提供了當(dāng)前播放節(jié)目的時間和位置信息。
中間件將獲取到的實時數(shù)據(jù)信息保存在播放信息結(jié)構(gòu)體中,其定義如下:
struct SXI_IR_PLAYBACK_INFO_IND_STRUCT
{
UINT8 PlaybackState; //當(dāng)前播放狀態(tài)
UINT8 PlaybackPosition; //當(dāng)前播放位置占已緩存內(nèi)容的百分比
UINT8 DurationOfTrack; //當(dāng)前節(jié)目的總時長
UINT8 TimeFromStartOfTrack; //當(dāng)前節(jié)目已播放時長
UINT8 TracksRemaining; //當(dāng)前節(jié)目剩余時長
UINT8 TimeRemaining; //緩存剩余時間
UINT8 TimeBefore; //緩存已播時間
……
};
中間件需要將這個結(jié)構(gòu)體的數(shù)據(jù)通過回調(diào)函數(shù)實時地傳遞給用戶界面,并通過用戶界面的進(jìn)度條控件清晰的顯示出來,如圖5所示。SiriusXM系統(tǒng)服務(wù)為每個頻道所提供的緩存空間為30分鐘,它類似一個先進(jìn)先出的緩存隊列,當(dāng)緩存空間滿載后,最老的數(shù)據(jù)將會自動刪除,從而放入新的緩存數(shù)據(jù)。當(dāng)前播放時間和緩存剩余時間的總和對整個緩存空間總時長的占比可計算出當(dāng)前緩存占用率。
如果當(dāng)前為暫停狀態(tài),那么當(dāng)前播放時間不變,緩存剩余時間會逐秒遞增,新的緩存數(shù)據(jù)會添加到緩存區(qū),當(dāng)前播放位置占比會逐漸減少,當(dāng)前播放點也會逐漸向左移動。直到當(dāng)前播放位置占比減少為0,當(dāng)前播放點移動到最左端時,說明緩存空間已經(jīng)滿載。
如果當(dāng)前為播放狀態(tài),當(dāng)前播放時間逐秒增加,緩存剩余時間不變,當(dāng)前播放位置占比會逐漸增加,當(dāng)前播放點逐漸向右移動,但始終不會達(dá)到最右端。
圖5 即時重放界面顯示
藝術(shù)家、曲目搜索功能可以記錄用戶喜歡的藝術(shù)家或某一首曲目,并在其他頻道播放該類節(jié)目時,在用戶界面提示用戶,用戶可以隨時切換到目標(biāo)頻道進(jìn)行收聽。
該功能的實現(xiàn)步驟分為以下四步:(1)用戶在收聽到某一藝術(shù)家的節(jié)目或某一首具體曲目時,可以收藏該藝術(shù)家或曲目。應(yīng)用軟件需要在收藏列表文件中保存該藝術(shù)家或曲目的唯一標(biāo)識ID;(2)如果收藏列表文件不為空,那么應(yīng)用軟件將在啟動后,對所有在播頻道進(jìn)行檢索,查看是否有與列表文件中的ID號匹配的內(nèi)容正在播放;(3)一旦匹配成功,將拋出提示信息到用戶界面;(4)用戶根據(jù)自己的意愿選擇是否切換到目標(biāo)頻道。
SiriusXM系統(tǒng)服務(wù)為其產(chǎn)品提供了2種實現(xiàn)該功能的途徑:(1)系統(tǒng)服務(wù)為應(yīng)用程序提供功能接口,軟件應(yīng)用程序可以將所有收藏列表文件中的ID通過SeekMonCmd命令發(fā)送給系統(tǒng)服務(wù),由系統(tǒng)服務(wù)進(jìn)行匹配查詢,一旦匹配成功,使用SeekInd消息返回給軟件應(yīng)用程序;(2)軟件應(yīng)用程序通過獲取LAMetadataInd消息返回的當(dāng)前所有頻道正在播放的藝術(shù)家或曲目ID,自己進(jìn)行匹配操作。
相對于軟件應(yīng)用程序自身進(jìn)行匹配操作,利用系統(tǒng)服務(wù)的接口可以更加簡單。但是,利用系統(tǒng)服務(wù)有個缺點是,最多支持120個ID同時匹配,這并不能滿足設(shè)計需要。同時,我們的車載設(shè)備完全可負(fù)荷這個量級的匹配任務(wù),所以,我們的軟件選擇了自身進(jìn)行匹配操作。
收藏列表文件包括藝術(shù)家列表和曲目列表2種,格式如表2所示。其中,曲目列表中的曲目記錄還同時包含了所屬的藝術(shù)家名。
表2 收藏列表文件格式
該功能與藝術(shù)家、曲目搜索功能類似,用戶收藏自己喜歡的體育賽事或者某一個具體的運動隊伍,當(dāng)所有音頻頻道中有相關(guān)體育賽事播放時,會及時提示用戶。
同樣地,應(yīng)用程序需要將運動賽事或運動隊的唯一標(biāo)識ID保存與收藏列表文件中,在所有播放的頻道中進(jìn)行ID匹配,一旦匹配成功,通知用戶界面。
SiriusXM公司與蘋果公司合作,同時存在于SiriusXM的音頻數(shù)據(jù)庫和iTunes Store中的歌曲,SiriusXM公司都會將該歌曲的iTunes曲目唯一ID號保存于音頻數(shù)據(jù)庫中。當(dāng)SiriusXM正在播放的曲目擁有iTunes唯一ID時,用戶可以保存此ID號。在之后如果車載設(shè)備有蘋果設(shè)備接入,會將這個ID號發(fā)送給該設(shè)備。
當(dāng)播放新的音頻時,軟件應(yīng)用程序需要立即檢測該音頻的數(shù)據(jù)信息,查看是否存在iTunes唯一ID號。系統(tǒng)服務(wù)默認(rèn)狀態(tài)是不會在ChanSelectInd(頻道切換指示)或者M(jìn)etadataInd(當(dāng)前播放信息)消息中包含iTunes唯一ID號信息的,需要在配置系統(tǒng)服務(wù)時發(fā)送ExtMetadataMonCmd命令開啟歌曲標(biāo)簽功能。
由于SiriusXM系統(tǒng)服務(wù)的自身原因,在切換頻道或切換曲目后的短暫時間內(nèi),系統(tǒng)服務(wù)可能獲取不到當(dāng)前曲目的iTunes唯一ID號,這種情況還可能發(fā)生在設(shè)備剛啟動或者短暫的信號丟失后恢復(fù)的瞬間。根據(jù)SiriusXM公司的設(shè)計要求,歌曲是否可以標(biāo)記的提示可在當(dāng)前曲目播放后3秒之內(nèi)在界面顯示,所以,軟件在設(shè)計過程中,預(yù)留了3秒的檢測時間。
在切換頻道或者切換曲目后,并不立即根據(jù)接收到的ChanSelectInd或MetadataInd中是否包含了iTunes唯一ID號來判斷該曲目是否可以被標(biāo)記,而是在播放后的3秒內(nèi)持續(xù)檢測。若在這之間檢測到ID號,會立即在用戶界面顯示。
一旦用戶確認(rèn)標(biāo)記后,軟件應(yīng)用程序會將該曲目的信息保存在本地配置文件中。保存數(shù)據(jù)內(nèi)容如表3所示。
所謂的“Tune Start”功能,是指用戶在切換到其他收藏的音頻頻道時,由于收藏頻道有自動緩存功能,系統(tǒng)服務(wù)不會從該頻道曲目的當(dāng)前位置播放,而是從曲目的開頭播放,這樣用戶可以收聽完整的一首歌曲。該功能是由系統(tǒng)服務(wù)完成,應(yīng)用軟件需要提供該功能是否開啟的配置選項。在設(shè)備啟動和用戶修改配置時,使用ChanSelectCfgCmd命令來配置該功能[14]。
在這個功能實現(xiàn)上,應(yīng)用軟件需要處理的內(nèi)容是:當(dāng)用戶進(jìn)入一個收藏的音頻頻道后,如果該頻道有播放緩存,系統(tǒng)服務(wù)會自動進(jìn)入緩存播放。這時,系統(tǒng)服務(wù)會發(fā)送IRPlaybackInfoInd指示信息,應(yīng)用軟件需要及時將自身狀態(tài)切換到及時重放功能中,并在用戶界面中顯示緩存進(jìn)度。
同時,是否配置該功能也需要根據(jù)當(dāng)前接入的SiriusXM調(diào)諧器版本來確定。版本號為SXV100的調(diào)諧器不支持該功能,在開機(jī)后接收到的ModuleCfgInd中可獲取調(diào)諧器版本信息。
每一個收藏列表各自擁有自己的頻道緩存內(nèi)容,應(yīng)用軟件提供將符合一定條件的頻道進(jìn)行混合的功能,用戶可以收聽混合后的所有內(nèi)容。
進(jìn)入頻道混合功能,需要配置頻道信息。本論文所設(shè)計的應(yīng)用軟件一共擁有3個收藏列表,每個列表最多包含6個收藏頻道。每次頻道混合功能,應(yīng)用軟件設(shè)計為最多混合一個收藏列表,即最多6個頻道。同時,可以被混合的頻道屬性必須滿足是可獲取的、已訂閱的、未被鎖定的、特定內(nèi)容形式的音頻頻道,且至少有2個滿足條件的頻道[15]。
在軟件設(shè)計中,混合后的頻道視為一個可播頻道,其服務(wù)號區(qū)別于其他頻道,定義從4096開始,該軟件共支持3個混合頻道,即4096、4097、4098。
音頻頻道的內(nèi)容形式可以分為6種類型,如表3所示。滿足頻道混合的音頻內(nèi)容形式必須是以節(jié)目ID劃分的音樂類頻道,該頻道信息從Extended Metadata中獲取。
表3 音頻頻道內(nèi)容形式
首先,應(yīng)用程序?qū)崟r檢測當(dāng)前收藏列表的頻道,是否滿足可混合條件。一旦滿足,用戶可以選擇頻道混合功能。然后,通過ChanAttribListCmd命令,配置當(dāng)前混合頻道服務(wù)號和混合頻道數(shù)目以及混合頻道各自的服務(wù)號。最后,通知系統(tǒng)服務(wù)進(jìn)入頻道混合功能。其流程如圖6所示。
圖6 頻道混合流程
由于本文所設(shè)計的播放軟件是運行在車載電子設(shè)備中,在車輛運行過程中,經(jīng)常會有中斷當(dāng)前進(jìn)程的其他高優(yōu)先級的應(yīng)用被啟動,從而搶占主界面和音頻輸入通道,比如:藍(lán)牙電話來去電,倒車影像展示等。用戶在正常使用本文所設(shè)計的音頻軟件時,如果突然藍(lán)牙電話接收到某人的來電,或者用戶主動撥打電話,那么此時音頻軟件將自動隱藏自身界面,同時對播放狀態(tài)進(jìn)行暫停處理,直到用戶通話完畢,重新顯示自身界面,然后重新進(jìn)入播放狀態(tài)。車輛倒車時,與藍(lán)牙電話處理完全相同。
該功能在實現(xiàn)上,主要依托于車載設(shè)備的主系統(tǒng)模塊(簡稱“main”)的廣播消息。應(yīng)用程序在啟動時,會主動向main模塊注冊系統(tǒng)消息回調(diào)函數(shù)onSystemMessageCallback,任何系統(tǒng)級的消息都會通過該回調(diào)通知到應(yīng)用程序。
當(dāng)接收到BT_CALL_ON(開始藍(lán)牙通話) 或REVERSE_ON(開始倒車)消息后,應(yīng)用程序?qū)⒘⒓凑{(diào)用pause方法進(jìn)行暫停,然后調(diào)用hideWindow方法隱藏自身界面,同時告知main模塊已經(jīng)完成相關(guān)操作,可以喚起藍(lán)牙或倒車畫面。通常在這個過程中,為了防止可能突然暫??赡艹霈F(xiàn)的爆破音,會在調(diào)用pause方法之前,進(jìn)行慢靜音操作(200 ms內(nèi)將音量逐漸降為0)。
當(dāng)接收到BT_CALL_OFF(結(jié)束藍(lán)牙通話)或REVERSE_OFF(結(jié)束倒車)消息后,整個操作流程與上述流程相反。首先調(diào)用showWindow顯示應(yīng)用程序主界面,然后調(diào)用play方法開始播放。同樣地,為防止音量突然恢復(fù)造成爆破音,將在200ms內(nèi)恢復(fù)到音量。
本論文詳細(xì)闡述了所設(shè)計的應(yīng)用軟件的主要功能,分別從基本音頻服務(wù)、高級音頻服務(wù)、系統(tǒng)廣播消息處理三個部分來進(jìn)行說明,闡述了各個服務(wù)的功能實現(xiàn)流程?;疽纛l服務(wù)類似于地面廣播所提供的收音功能。高級音頻服務(wù)是SiriusXM公司產(chǎn)品的核心內(nèi)容,有著豐富的視聽功能。