3 播放控制狀態機的設計
藍牙音頻流的遠程播放控制使得用戶可以使用車載收音機上控制CD音樂的按鍵來控制藍牙手機上的音樂,控制操作包括播放、暫停、上一首、下一首、快進和快退,通過AVRCP(音視頻遠程控制剖面)命令實現。考慮到用戶操作隨機性很強及藍牙手機的音頻流支持特性不同的問題,需要設計一個完善的遠程播放控制狀態機來保證良好的操作體驗。
遠程播放控制狀態機是個組合式狀態機,包括2個小的狀態機:(1)狀態為藍牙手機音樂狀態,輸入為人機接口操作,在人機接口操作的處理中判斷當前音樂狀態,決定輸出的AVRCP命令;(2)狀態為人機接口操作或者說“期望狀態”,輸入為藍牙手機音樂當前狀態的更新,在音樂狀態更新的處理中根據期望狀態決定輸出的AVRCP命令。把人機接口操作稱為“期望狀態”,把當前音樂狀態稱為“實際狀態”,這兩個狀態機的原理便是當期望狀態和實際狀態不一致時,發送可以達到期望狀態的AVRCP命令。下面詳細介紹下狀態機的設計要點。
首先每個人機操作的控制命令在AVRCP上都對應2個命令,對于播放、暫停、上一首、下一首操作,命令是連續執行的,比如暫停操作便是在AVRCP上連續執行PAUSE_PRESS和PAUSE_RELEASE命令;而對于快進命令,則是先執行FF_PRESS命令,在快進按鍵松開時再執行FF_RELEASE命令。
音樂狀態(包括期望狀態和實際狀態)包括2個穩定狀態(播放狀態PLAY、暫停狀態PAUSE)和2個中間狀態(快進狀態FF和快退狀態FB)。對于PLAY和PAUSE狀態,由于藍牙手機的播放鍵和暫停鍵是一個乒乓按鍵,即暫停狀態下按下會啟動播放,播放狀態下按下會引起暫停,所以如果實際狀態和期望狀態一致時便不發送AVRCP命令,而且對于用戶在手機上進行操作引起的實際狀態和期望狀態的不一致,也不發送任何AVRCP命令,否則會造成本該暫停卻播放或本該播放卻暫停的錯誤。對于快進快退,首先在快進快退中不要判斷當前音樂是暫停還是播放,其次因為部分手機在快進快退結束后會先把音樂暫停一下再播放,所以不要在快進快退剛結束時便調用播放控制狀態機,需要延遲一段時間處理。
4 音頻流狀態處理及信息解析
流媒體信息包括編解碼格式及采樣率設置、音樂播放狀態、當前播放時間、TagID3信息等。首先藍牙傳輸的數據為編碼后的音樂文件,SRC端實現編碼,SINK端實現解碼,所以首先要按照編碼格式選擇相應的解碼器,其次還需要在本地音頻輸出端設置同樣的采樣頻率。
播放狀態對應于播放模式,包括播放、暫停、快進、快退4種狀態,其中播放和暫停是對播放控制狀態機非常關鍵的狀態。對無法把播放和暫停狀態發送上來的藍牙手機,需要設計一種方法來判斷當前音樂處于哪種狀態。音樂在播放狀態時,流媒體音樂數據通過藍牙從SRC端傳輸到SNK端,SNK端將該藍牙數據傳輸到BC5的DSP中進行解碼,所以可以通過判斷DSP的解碼器緩存中是否有數據來判斷當前音樂狀態,如果沒有數據則音樂處于暫停狀態。
當前播放時間、TagID3信息需要AVRCP V1.3的支持,AVRCP V1.3定義了一種獨特格式的TagID3信息,下面以邁克杰克遜的Billie Jean這首音樂為實例分析AVRCP中的TagID3格式,其Tag ID3數據為十六進制形式的“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包括標題名、演唱者、專輯名稱、音軌(第幾首)、總音軌(音樂總數)5個屬性,每條屬性采用“4個字節的屬性ID+2個字節的字符集信息+2個字節的屬性長度+屬性數據”的格式,其中屬性ID“0 0 0 1”表示標題名,“0 0 0 2”表示演唱者,“0 0 0 3”表示專輯名稱,“0 0 0 4”表示音軌,“0 0 0 5”表示總音軌,常用字符集為avrcp_char_set_ascii=0 3,avrcp_char_set_utf_8=0 6a。按照上述格式,該音樂標題名為長度為11(0 b)的“42 69 6c 6c 69 65 20 4a 65 61 6e”,即Billie Jean,演唱者為長度為15(0 f)的“4d 69 63 68 61 65 6c 20 4a 61 63 6b 73 6f 6e”,即Michael Jachson,沒有專輯名稱和總音軌(長度為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]=‘
藍牙音頻流的遠程播放控制使得用戶可以使用車載收音機上控制CD音樂的按鍵來控制藍牙手機上的音樂,控制操作包括播放、暫停、上一首、下一首、快進和快退,通過AVRCP(音視頻遠程控制剖面)命令實現。考慮到用戶操作隨機性很強及藍牙手機的音頻流支持特性不同的問題,需要設計一個完善的遠程播放控制狀態機來保證良好的操作體驗。
遠程播放控制狀態機是個組合式狀態機,包括2個小的狀態機:(1)狀態為藍牙手機音樂狀態,輸入為人機接口操作,在人機接口操作的處理中判斷當前音樂狀態,決定輸出的AVRCP命令;(2)狀態為人機接口操作或者說“期望狀態”,輸入為藍牙手機音樂當前狀態的更新,在音樂狀態更新的處理中根據期望狀態決定輸出的AVRCP命令。把人機接口操作稱為“期望狀態”,把當前音樂狀態稱為“實際狀態”,這兩個狀態機的原理便是當期望狀態和實際狀態不一致時,發送可以達到期望狀態的AVRCP命令。下面詳細介紹下狀態機的設計要點。
首先每個人機操作的控制命令在AVRCP上都對應2個命令,對于播放、暫停、上一首、下一首操作,命令是連續執行的,比如暫停操作便是在AVRCP上連續執行PAUSE_PRESS和PAUSE_RELEASE命令;而對于快進命令,則是先執行FF_PRESS命令,在快進按鍵松開時再執行FF_RELEASE命令。
音樂狀態(包括期望狀態和實際狀態)包括2個穩定狀態(播放狀態PLAY、暫停狀態PAUSE)和2個中間狀態(快進狀態FF和快退狀態FB)。對于PLAY和PAUSE狀態,由于藍牙手機的播放鍵和暫停鍵是一個乒乓按鍵,即暫停狀態下按下會啟動播放,播放狀態下按下會引起暫停,所以如果實際狀態和期望狀態一致時便不發送AVRCP命令,而且對于用戶在手機上進行操作引起的實際狀態和期望狀態的不一致,也不發送任何AVRCP命令,否則會造成本該暫停卻播放或本該播放卻暫停的錯誤。對于快進快退,首先在快進快退中不要判斷當前音樂是暫停還是播放,其次因為部分手機在快進快退結束后會先把音樂暫停一下再播放,所以不要在快進快退剛結束時便調用播放控制狀態機,需要延遲一段時間處理。
4 音頻流狀態處理及信息解析
流媒體信息包括編解碼格式及采樣率設置、音樂播放狀態、當前播放時間、TagID3信息等。首先藍牙傳輸的數據為編碼后的音樂文件,SRC端實現編碼,SINK端實現解碼,所以首先要按照編碼格式選擇相應的解碼器,其次還需要在本地音頻輸出端設置同樣的采樣頻率。
播放狀態對應于播放模式,包括播放、暫停、快進、快退4種狀態,其中播放和暫停是對播放控制狀態機非常關鍵的狀態。對無法把播放和暫停狀態發送上來的藍牙手機,需要設計一種方法來判斷當前音樂處于哪種狀態。音樂在播放狀態時,流媒體音樂數據通過藍牙從SRC端傳輸到SNK端,SNK端將該藍牙數據傳輸到BC5的DSP中進行解碼,所以可以通過判斷DSP的解碼器緩存中是否有數據來判斷當前音樂狀態,如果沒有數據則音樂處于暫停狀態。
當前播放時間、TagID3信息需要AVRCP V1.3的支持,AVRCP V1.3定義了一種獨特格式的TagID3信息,下面以邁克杰克遜的Billie Jean這首音樂為實例分析AVRCP中的TagID3格式,其Tag ID3數據為十六進制形式的“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包括標題名、演唱者、專輯名稱、音軌(第幾首)、總音軌(音樂總數)5個屬性,每條屬性采用“4個字節的屬性ID+2個字節的字符集信息+2個字節的屬性長度+屬性數據”的格式,其中屬性ID“0 0 0 1”表示標題名,“0 0 0 2”表示演唱者,“0 0 0 3”表示專輯名稱,“0 0 0 4”表示音軌,“0 0 0 5”表示總音軌,常用字符集為avrcp_char_set_ascii=0 3,avrcp_char_set_utf_8=0 6a。按照上述格式,該音樂標題名為長度為11(0 b)的“42 69 6c 6c 69 65 20 4a 65 61 6e”,即Billie Jean,演唱者為長度為15(0 f)的“4d 69 63 68 61 65 6c 20 4a 61 63 6b 73 6f 6e”,即Michael Jachson,沒有專輯名稱和總音軌(長度為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]=‘
評論