現在的車(chē)載信息娛樂(lè )系統中標準配置有帶CD播放功能的收音機、液晶屏,其他可選配置有GPS和藍牙免提裝置等設備。隨著(zhù)藍牙技術(shù)在音視頻傳輸中的應用,一種可以增強用戶(hù)娛樂(lè )體驗的藍牙音頻流播放功能正逐步在車(chē)載信息娛樂(lè )系統中得到應用。藍牙音頻流播放功能是指將藍牙MP3或藍牙手機上的音樂(lè )通過(guò)藍牙以流媒體的方式傳輸到遠端設備上進(jìn)行解碼后通過(guò)遠端設備的功放系統播放,同時(shí)遠端設備還帶有遠程控制功能,使得用戶(hù)可以在遠端設備上操作音樂(lè ),使其暫停、播放、快進(jìn)快退或進(jìn)行上下首切換。筆者設計實(shí)現了一款藍牙車(chē)載音頻流播放器,該播放器和收音機及液晶屏之間通過(guò)CAN總線(xiàn)進(jìn)行連接,控制操作在收音機上實(shí)現,液晶屏顯示音樂(lè )的tagID3、播放時(shí)間、音軌、總音軌等信息,控制命令和播放信息都是通過(guò)CAN總線(xiàn)進(jìn)行傳輸。從用戶(hù)的使用角度來(lái)說(shuō),該藍牙音頻流播放器是和收音機、液晶屏組成一套系統的。
1 系統結構
系統結構如圖1所示。音頻流播放器、液晶屏和收音機組成一個(gè)車(chē)載娛樂(lè )系統的CAN網(wǎng)絡(luò ),控制命令及狀態(tài)信息均通過(guò)CAN總線(xiàn)傳輸,其中收音機帶有功放,直接驅動(dòng)汽車(chē)喇叭,并統一管理包括FM、CD和音頻流播放器的音頻輸出在內的音源。音頻流播放器和藍牙手機通過(guò)藍牙進(jìn)行交互,采用A2DP(Advanced Audio Distribution Profile)完成音樂(lè )音頻流數據及相關(guān)格式信息的傳輸,通過(guò)AVRCP(Audio/Video Remote Control Profile)完成對音樂(lè )的遠程播放控制及播放信息及狀態(tài)的讀取。在A(yíng)2DP中引入了2個(gè)終端名:SRC(Source)和SNK(Sink)。在這里,數字音頻流的數據發(fā)送端藍牙手機稱(chēng)為SRC,數字音頻流的接收端藍牙音頻流播放器稱(chēng)為SNK。

2 硬件設計
藍牙音頻流播放器的硬件設計中,包括CAN通訊、藍牙子系統和音頻系統3個(gè)部分,其中藍牙子系統和音頻系統部分采用CSR的藍牙單芯片Bluecore5-MutiMedia(以下簡(jiǎn)稱(chēng)BC5)實(shí)現。該芯片集成了MCU實(shí)現藍牙協(xié)議棧及應用,集成了性能高達64MIPS的DSP實(shí)現音樂(lè )文件的編解碼,集成了CODEC、音頻ADC及DAC,實(shí)現了音頻輸入輸出功能,圖2描述了基于該芯片的硬件設計。
由圖2可見(jiàn),BC5內部集成了藍牙射頻及基帶控制、MCU、DSP和音頻CODEC,只需要很少的外圍元件便能完成電路設計。

3 播放控制狀態(tài)機的設計
藍牙音頻流的遠程播放控制使得用戶(hù)可以使用車(chē)載收音機上控制CD音樂(lè )的按鍵來(lái)控制藍牙手機上的音樂(lè ),控制操作包括播放、暫停、上一首、下一首、快進(jìn)和快退,通過(guò)AVRCP(音視頻遠程控制剖面)命令實(shí)現?紤]到用戶(hù)操作隨機性很強及藍牙手機的音頻流支持特性不同的問(wèn)題,需要設計一個(gè)完善的遠程播放控制狀態(tài)機來(lái)保證良好的操作體驗。
遠程播放控制狀態(tài)機是個(gè)組合式狀態(tài)機,包括2個(gè)小的狀態(tài)機:(1)狀態(tài)為藍牙手機音樂(lè )狀態(tài),輸入為人機接口操作,在人機接口操作的處理中判斷當前音樂(lè )狀態(tài),決定輸出的AVRCP命令;(2)狀態(tài)為人機接口操作或者說(shuō)“期望狀態(tài)”,輸入為藍牙手機音樂(lè )當前狀態(tài)的更新,在音樂(lè )狀態(tài)更新的處理中根據期望狀態(tài)決定輸出的AVRCP命令。把人機接口操作稱(chēng)為“期望狀態(tài)”,把當前音樂(lè )狀態(tài)稱(chēng)為“實(shí)際狀態(tài)”,這兩個(gè)狀態(tài)機的原理便是當期望狀態(tài)和實(shí)際狀態(tài)不一致時(shí),發(fā)送可以達到期望狀態(tài)的AVRCP命令。下面詳細介紹下?tīng)顟B(tài)機的設計要點(diǎn)。
首先每個(gè)人機操作的控制命令在A(yíng)VRCP上都對應2個(gè)命令,對于播放、暫停、上一首、下一首操作,命令是連續執行的,比如暫停操作便是在A(yíng)VRCP上連續執行PAUSE_PRESS和PAUSE_RELEASE命令;而對于快進(jìn)命令,則是先執行FF_PRESS命令,在快進(jìn)按鍵松開(kāi)時(shí)再執行FF_RELEASE命令。
音樂(lè )狀態(tài)(包括期望狀態(tài)和實(shí)際狀態(tài))包括2個(gè)穩定狀態(tài)(播放狀態(tài)PLAY、暫停狀態(tài)PAUSE)和2個(gè)中間狀態(tài)(快進(jìn)狀態(tài)FF和快退狀態(tài)FB)。對于PLAY和PAUSE狀態(tài),由于藍牙手機的播放鍵和暫停鍵是一個(gè)乒乓按鍵,即暫停狀態(tài)下按下會(huì )啟動(dòng)播放,播放狀態(tài)下按下會(huì )引起暫停,所以如果實(shí)際狀態(tài)和期望狀態(tài)一致時(shí)便不發(fā)送AVRCP命令,而且對于用戶(hù)在手機上進(jìn)行操作引起的實(shí)際狀態(tài)和期望狀態(tài)的不一致,也不發(fā)送任何AVRCP命令,否則會(huì )造成本該暫停卻播放或本該播放卻暫停的錯誤。對于快進(jìn)快退,首先在快進(jìn)快退中不要判斷當前音樂(lè )是暫停還是播放,其次因為部分手機在快進(jìn)快退結束后會(huì )先把音樂(lè )暫停一下再播放,所以不要在快進(jìn)快退剛結束時(shí)便調用播放控制狀態(tài)機,需要延遲一段時(shí)間處理。
4 音頻流狀態(tài)處理及信息解析
流媒體信息包括編解碼格式及采樣率設置、音樂(lè )播放狀態(tài)、當前播放時(shí)間、TagID3信息等。首先藍牙傳輸的數據為編碼后的音樂(lè )文件,SRC端實(shí)現編碼,SINK端實(shí)現解碼,所以首先要按照編碼格式選擇相應的解碼器,其次還需要在本地音頻輸出端設置同樣的采樣頻率。
播放狀態(tài)對應于播放模式,包括播放、暫停、快進(jìn)、快退4種狀態(tài),其中播放和暫停是對播放控制狀態(tài)機非常關(guān)鍵的狀態(tài)。對無(wú)法把播放和暫停狀態(tài)發(fā)送上來(lái)的藍牙手機,需要設計一種方法來(lái)判斷當前音樂(lè )處于哪種狀態(tài)。音樂(lè )在播放狀態(tài)時(shí),流媒體音樂(lè )數據通過(guò)藍牙從SRC端傳輸到SNK端,SNK端將該藍牙數據傳輸到BC5的DSP中進(jìn)行解碼,所以可以通過(guò)判斷DSP的解碼器緩存中是否有數據來(lái)判斷當前音樂(lè )狀態(tài),如果沒(méi)有數據則音樂(lè )處于暫停狀態(tài)。
當前播放時(shí)間、TagID3信息需要AVRCP V1.3的支持,AVRCP V1.3定義了一種獨特格式的TagID3信息,下面以邁克杰克遜的Billie Jean這首音樂(lè )為實(shí)例分析AVRCP中的TagID3格式,其Tag ID3數據為十六進(jìn)制形式的“0 0 0 1 0 6a 0 b 42 69 6c 6c 69 65 20 4a 65 61 6e 0 0 0 2 0 6a 0 f 4d 69 63 68 61 65 6c 20 4a 61 63 6b 73 6f 6e 0 0 0 3 0 6a 0 0 0 0 0 4 0 6a 0 1 32”。TagID3包括標題名、演唱者、專(zhuān)輯名稱(chēng)、音軌(第幾首)、總音軌(音樂(lè )總數)5個(gè)屬性,每條屬性采用“4個(gè)字節的屬性ID+2個(gè)字節的字符集信息+2個(gè)字節的屬性長(cháng)度+屬性數據”的格式,其中屬性ID“0 0 0 1”表示標題名,“0 0 0 2”表示演唱者,“0 0 0 3”表示專(zhuān)輯名稱(chēng),“0 0 0 4”表示音軌,“0 0 0 5”表示總音軌,常用字符集為avrcp_char_set_ascii=0 3,avrcp_char_set_utf_8=0 6a。按照上述格式,該音樂(lè )標題名為長(cháng)度為11(0 b)的“42 69 6c 6c 69 65 20 4a 65 61 6e”,即Billie Jean,演唱者為長(cháng)度為15(0 f)的“4d 69 63 68 61 65 6c 20 4a 61 63 6b 73 6f 6e”,即Michael Jachson,沒(méi)有專(zhuān)輯名稱(chēng)和總音軌(長(cháng)度為0),音軌為0x32,即第2首歌。
根據該格式設計屬性提取器如下:
While(m
{
for (k=0;k<4;k++)
{ av_streaming[n].attri[k]=TagID3[m];
m++;
}
if((av_streaming[n].attri[0]!=0)‖(av_streaming[n].attri[1]!=0)‖(av_streaming[n].attri[2]!=0)‖(av_streaming[n].attri[3]>5))
{ errorflag=1;
}
if(errorflag==0)
{ for(k=0;k<2;k++)
{ av_streaming[n].charset[k]=TagID3[m];
m++;
}
for (k=0;k<2;k++)
{ av_streaming[n].datalength[k]=TagID3[m];
m++;
}
av_streaming[n].datalen=av_streaming[n].datalength[1]|(av_streaming[n].datalength[0]<<8);
for (k=0;k
{ av_streaming[n].tagid3data[k]=TagID3[m];
m++;
}
av_streaming[n].tagid3data[av_streaming[n].datalen]=‘’;
n++;
}
else
{ errorflag=0;
}
}
經(jīng)上述代碼的解析,屬性ID在av_streaming[n].attri中,屬性數據在長(cháng)度為av_streaming[n].datalen的數據av_streaming[n].tagid3data中。
本文設計了一款藍牙車(chē)載音頻流播放器。該播放器運行穩定可靠,兼容性好,大大方便了用戶(hù)的使用,有很好的實(shí)用價(jià)值。 |