笔者设计实现了一款蓝牙车载音频流播放器,该播放器和收音机及液晶屏之间通过can总线进行连接,控制操作在收音机上实现,液晶屏显示音乐的tagid3、播放时间、音轨、总音轨等信息,控制命令和播放信息都是通过can总线进行传输。从用户的使用角度来说,该蓝牙音频流播放器是和收音机、液晶屏组成一套系统的。
1 系统结构
系统结构如图1所示。音频流播放器、液晶屏和收音机组成一个车载娱乐系统的can网络,控制命令及状态信息均通过can总线传输,其中收音机带有功放,直接驱动汽车喇叭,并统一管理包括fm、cd和音频流播放器的音频输出在内的音源。音频流播放器和蓝牙手机通过蓝牙进行交互,采用a2dp(advanced audio distribution profile)完成音乐音频流数据及相关格式信息的传输,通过avrcp(audio/video remote control profile)完成对音乐的远程播放控制及播放信息及状态的读取。在a2dp中引入了2个终端名:src(source)和snk(sink)。在这里,数字音频流的数据发送端蓝牙手机称为src,数字音频流的接收端蓝牙音频流播放器称为snk。
2 硬件设计
蓝牙音频流播放器的硬件设计中,包括can通讯、蓝牙子系统和音频系统3个部分,其中蓝牙子系统和音频系统部分采用csr的蓝牙单芯片bluecore5-mutimedia(以下简称bc5)实现。该芯片集成了mcu实现蓝牙协议栈及应用,集成了性能高达64mips的dsp实现音乐文件的编解码,集成了codec、音频adc及dac,实现了音频输入输出功能,图2描述了基于该芯片的硬件设计。
由图2可见,bc5内部集成了蓝牙射频及基带控制、mcu、dsp和音频codec,只需要很少的外围元件便能完成电路设计。
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;k5))
{ 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]=‘
何小鹏回应:智能汽车生态的核心来自硬件体系和软件生态的运营
PCB设计之如何去耦
2019OPPO开发者大会企业合作论坛暨企业业务高峰论坛在京举办
专为5G和AI设计的低功耗DDR5 DRAM
工控交换机和工业交换机的区别
蓝牙车载音频流播放器的设计
在线研讨会预告 | 多说话人语音融合——NVIDIA NeMo 代码解析
特斯拉Model S识别失准撞了!!!
兼容NSR20F30NXT5G的小体积肖特基二极管
关于人机交互最佳解决方案——AIUI的分析和应用
物联网和大数据的连接谁将受益?
华为通知将下修 Mate40 出货 砍单幅度达 30%
广汽本田首款纯电动轿车EA6重磅亮相广州车展
艾迈斯半导体发布业内首个安卓系统后置3D dToF解决方案
动力电池行业集中度的提高,掀起了一场席卷产业链的多骨诺米牌效应
Linux驱动技术之一:访问I/O内存
现代汽车与软银集团正式收购波士顿动力
50000台哪吒汽车被百家城市合伙人签约
如何提高太阳能发电的供电效率
科友提前布局:SiC行业下半场是8吋时代