藍(lán)牙車(chē)載音頻流播放器的設(shè)計(jì)與實(shí)現(xiàn)
音樂(lè)狀態(tài)(包括期望狀態(tài)和實(shí)際狀態(tài))包括2個(gè)穩(wěn)定狀態(tài)(播放狀態(tài)PLAY、暫停狀態(tài)PAUSE)和2個(gè)中間狀態(tài)(快進(jìn)狀態(tài)FF和快退狀態(tài)FB)。對(duì)于PLAY和PAUSE狀態(tài),由于藍(lán)牙手機(jī)的播放鍵和暫停鍵是一個(gè)乒乓按鍵,即暫停狀態(tài)下按下會(huì)啟動(dòng)播放,播放狀態(tài)下按下會(huì)引起暫停,所以如果實(shí)際狀態(tài)和期望狀態(tài)一致時(shí)便不發(fā)送AVRCP命令,而且對(duì)于用戶在手機(jī)上進(jìn)行操作引起的實(shí)際狀態(tài)和期望狀態(tài)的不一致,也不發(fā)送任何AVRCP命令,否則會(huì)造成本該暫停卻播放或本該播放卻暫停的錯(cuò)誤。對(duì)于快進(jìn)快退,首先在快進(jìn)快退中不要判斷當(dāng)前音樂(lè)是暫停還是播放,其次因?yàn)椴糠质謾C(jī)在快進(jìn)快退結(jié)束后會(huì)先把音樂(lè)暫停一下再播放,所以不要在快進(jìn)快退剛結(jié)束時(shí)便調(diào)用播放控制狀態(tài)機(jī),需要延遲一段時(shí)間處理。
4 音頻流狀態(tài)處理及信息解析
流媒體信息包括編解碼格式及采樣率設(shè)置、音樂(lè)播放狀態(tài)、當(dāng)前播放時(shí)間、TagID3信息等。首先藍(lán)牙傳輸?shù)臄?shù)據(jù)為編碼后的音樂(lè)文件,SRC端實(shí)現(xiàn)編碼,SINK端實(shí)現(xiàn)解碼,所以首先要按照編碼格式選擇相應(yīng)的解碼器,其次還需要在本地音頻輸出端設(shè)置同樣的采樣頻率。
播放狀態(tài)對(duì)應(yīng)于播放模式,包括播放、暫停、快進(jìn)、快退4種狀態(tài),其中播放和暫停是對(duì)播放控制狀態(tài)機(jī)非常關(guān)鍵的狀態(tài)。對(duì)無(wú)法把播放和暫停狀態(tài)發(fā)送上來(lái)的藍(lán)牙手機(jī),需要設(shè)計(jì)一種方法來(lái)判斷當(dāng)前音樂(lè)處于哪種狀態(tài)。音樂(lè)在播放狀態(tài)時(shí),流媒體音樂(lè)數(shù)據(jù)通過(guò)藍(lán)牙從SRC端傳輸?shù)絊NK端,SNK端將該藍(lán)牙數(shù)據(jù)傳輸?shù)紹C5的DSP中進(jìn)行解碼,所以可以通過(guò)判斷DSP的解碼器緩存中是否有數(shù)據(jù)來(lái)判斷當(dāng)前音樂(lè)狀態(tài),如果沒(méi)有數(shù)據(jù)則音樂(lè)處于暫停狀態(tài)。
當(dāng)前播放時(shí)間、TagID3信息需要AVRCP V1.3的支持,AVRCP V1.3定義了一種獨(dú)特格式的TagID3信息,下面以邁克杰克遜的Billie Jean這首音樂(lè)為實(shí)例分析AVRCP中的TagID3格式,其Tag ID3數(shù)據(jù)為十六進(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包括標(biāo)題名、演唱者、專(zhuān)輯名稱、音軌(第幾首)、總音軌(音樂(lè)總數(shù))5個(gè)屬性,每條屬性采用“4個(gè)字節(jié)的屬性ID+2個(gè)字節(jié)的字符集信息+2個(gè)字節(jié)的屬性長(zhǎng)度+屬性數(shù)據(jù)”的格式,其中屬性ID“0 0 0 1”表示標(biāo)題名,“0 0 0 2”表示演唱者,“0 0 0 3”表示專(zhuān)輯名稱,“0 0 0 4”表示音軌,“0 0 0 5”表示總音軌,常用字符集為avrcp_char_set_ascii=0 3,avrcp_char_set_utf_8=0 6a。按照上述格式,該音樂(lè)標(biāo)題名為長(zhǎng)度為11(0 b)的“42 69 6c 6c 69 65 20 4a 65 61 6e”,即Billie Jean,演唱者為長(zhǎ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)輯名稱和總音軌(長(zhǎng)度為0),音軌為0x32,即第2首歌。
根據(jù)該格式設(shè)計(jì)屬性提取器如下:
While(mTagID3_length)
{
for (k=0;k4;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;k2;k++)
{ av_streaming[n].charset[k]=TagID3[m];
m++;
}
for (k=0;k2;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;kav_streaming[n].datalen;k++)
{ av_streaming[n].tagid3data[k]=TagID3[m];
m++;
}
av_streaming[n].tagid3data[av_streaming[n].datalen]=‘