为了让CSR867x的开发更容易,现与思度科技联合推出CSR867x学习板【淘宝链接:思度科技CSR开发板】。
技术交流QQ群号:743434463
开发板会员QQ群号:725398389(凭订单号入群,赠PPT、项目源码、视频教程)
——————————正文分割线———————————–
1. 引言
最近刚完成一个蓝牙一拖二发射器的项目。这个项目的软件需求来自一款竞品——Bluetooth Multipoint Transmitter - Priva III。
2. 主要功能
系统框图如下:
BlueAg是一款中高端的蓝牙发射器。主要规格如下:
序号 | 规格 | 参数 |
---|---|---|
1 | 蓝牙版本 | BT4.2 |
2 | 蓝牙profile | A2DP,AVRCP,HFP |
3 | 支持解码格式 | SBC,FastStream,aptX,aptX-LL,aptx-HD |
4 | 工作距离 | Class 2,空旷地域30英尺或10米 |
5 | 一拖二功能 | 能同时给两台耳机提供音乐,数据包交替发给两台耳机,但是APTX-HD、APTX-LL、APTX解码时不能支持两路,此时自动使用Faststream或SBC解码 |
6 | USB音频和AUX_in | 只要有USB音源信号,就发送USB音源信号;没有USB音源信号,有AUX_in信号,则播放AUX_in信号;如两路音源信号都没有,则进入低功耗待机状态 |
7 | 保存配对信息 | 最多8个 |
状态指示如下:
序号 | 功能 | LED指示 | 备注 |
---|---|---|---|
1 | 开机 | 蓝灯常亮1s | 开机能回连之前配对过的设备,1MIN回连不上进入搜索状态。如果开机时没有连接过任何设备,直接进入搜索状态 |
2 | 关机 | 红灯常亮1s | 设备进入省电模式 |
3 | 待机未连接 | 红蓝灯交替闪烁 | 搜索时间5分钟,5分钟内没和耳机,音箱或者其他接收器连接上,进入待机状态 |
4 | 配对成功 | 蓝灯5s闪1次 | 默认SBC解码模式 |
5 | 非连接待机状态 | 蓝灯2s闪1次 | |
6 | 连接待机状态(SBC) | 蓝灯5s闪1次 | |
7 | 连接待机状态(FastStream) | 蓝灯5s闪2次 | |
8 | 连接待机状态(aptX) | 绿灯5s闪1次 | |
9 | 连接待机状态(aptX-LL) | 绿灯5s闪2次 | |
10 | 连接待机状态(aptX-HD) | 绿灯5s闪3次 | |
11 | 清除配对列表 | 蓝灯常亮2s | 清除配对列表后进入搜索状态 |
12 | 耳机回连 | 蓝灯5s闪1次 | 断开连接后两分钟内在有效距离内会自动回连,如不回连,则短按MFB(GPIO 0)键连接 |
13 | aux-in音乐发射器 | 使用aux-in线连接手机或者其他媒体播放器,可以通过发射器把音频传输到耳机,音箱或者其他接收端。aux-in优先级低于USB | |
14 | USB音乐发射器 | 使用USB连接线连接到PC或laptop上,打开发射器和耳机,并配好对;右键点击屏幕右下角的喇叭图标;选择播放设备时将此产品作为默认设备;此时产品将可作为USB无线耳机使用,可听到电脑端播放的音乐,并可作为PC端的即时通讯设备使用(Skype或QQ) | |
15 | 一拖二 | 1、如果发射器连接过A,B两个设备,A,B设备在正常的范围,开机能直接回连A,B这两个设备。2、如果发射器连接上A或者B设备(只连一个设备),MFB按键进入配对,可搜索连接新的设备,不会断开之前连接上的设备。3、如果发射器连接上A和B两个设备,MFB按键进入配对,断开早期连接的设备A,并进入搜索,可以连接新的设备。 |
3. 项目难点
3.1. 支持FastStream
FastStream是aptX的上一代音频编码格式,其已经包含在DSP工程sbc_encoder中,VM的代码中也能看到相关代码。修改source config tool的选项即可使能FastStream。
3.2. USB和AUX切源
ADK默认可支持USB或AUX源,如何实现在程序运行过程中的切源呢?在source_app_msg_handler.c的app_msg_handler中添加如下代码:
case APP_ANALOG_AUDIO_ACTIVE:
{APP_MSG_DEBUG(("APP_ANALOG_AUDIO_ACTIVE\n")); theSource->ps_config->usb_config.usb_speaker_interface = 0;theSource->ps_config->usb_config.usb_mic_interface = 0;theSource->ps_config->features.input_source = A2dpEncoderInputDeviceAnalogue;theSource->audio_data.audio_a2dp_connect_params.input_device_type = theSource->ps_config->features.input_source;app_usb_audio_active();
}
return;case APP_ANALOG_AUDIO_INACTIVE:
{APP_MSG_DEBUG(("APP_ANALOG_AUDIO_INACTIVE\n")); theSource->ps_config->usb_config.usb_speaker_interface = 1;theSource->ps_config->usb_config.usb_mic_interface = 1;theSource->ps_config->features.input_source = A2dpEncoderInputDeviceUsb;theSource->audio_data.audio_a2dp_connect_params.input_device_type = theSource->ps_config->features.input_source;app_usb_audio_active();
}
return;
当需要切换到analog源时,发送APP_ANALOG_AUDIO_ACTIVE消息;当需要切换到USB源时,发送APP_ANALOG_AUDIO_INACTIVE消息。
4. 总结
此项目已经成功量产。在此项目的基础上,可以继续丰富产品的功能,如增加SPDIF输入源、I2S输入源,或是增加蓝牙接收功能以支持蓝牙收发一体。