工程文件我已经上传到github上:https://github.com/rickie-mi/Bluetooth_Audio_real-time_Play (如果有疑问的话欢迎私信和我交流)
前段时间项目要求做蓝牙,便买来一块蓝牙开发板自己试试。蓝牙芯片是8311,串口选的是ft232(试过CH340串口发现不行,手机上根本搜索不到该蓝牙芯片)。在ubuntu系统上跑蓝牙协议栈,通过串口获得蓝牙芯片传输来的数据。
在使用A2DP协议时,手机端作为播放源,蓝牙芯片作为音乐接收端。当手机上播放音乐时,蓝牙芯片接收到音频数据并解析后通过串口传到PC上,最终将音频数据以wav格式保存在项目的工程文件夹下。这部分代码是原先蓝牙协议栈开源代码。
为了尝试手机一边放音乐,在蓝牙芯片接收到音频后能够同步在Linux上直接播放,而不是保存在本地,安装了SDL2库,安装过程详见我的上一篇博客。
修改Makefile
安装完成后需要在原先工程文件中添加相关内容,确保能够在编译链接时找到相关文件。
首先新建sdl-include和lib两个文件夹用于存放头文件和库。将SDL2安装目录下的_install文件夹中的include和lib两个文件夹内容直接拷贝过去。接着在项目工程的Makefile中添加如下内容
#include sdl
CFLAGS += -I${BTSTACK_ROOT}/sdl-include/sdl/
LKFLAGS += -lSDL2
LKFLAGS += -L${BTSTACK_ROOT}/lib
并修改a2dp_sink_demo的编译参数
a2dp_sink_demo: ${CORE_OBJ} ${COMMON_OBJ} ${CLASSIC_OBJ} ${SDP_CLIENT} ${SBC_DECODER_OBJ} ${AVDTP_OBJ} avrcp.o avrcp_controller.o avrcp_target.o btstack_resample.o a2dp_sink_demo.c
${CC} $^ ${CFLAGS} ${LKFLAGS} ${LDFLAGS} -o $@
这样程序在编译时便可以调用到SDL2头文件。同时由于SDL2的库已经被加载到了系统环境变量中,所以-lsdl2便可以在程序链接时被发现。
实时播放音频数据相关代码
SDL进行初始化,设置音频设备的接口、通道数等。设置回调函数file_audio
int SDL_config()
{
//Init
if(SDL_Init(SDL_INIT_AUDIO