简单来说就是两条本地socket通道,分别使用文件:
#define A2DP_CTRL_PATH "/data/misc/bluedroid/.a2dp_ctrl"
#define A2DP_DATA_PATH "/data/misc/bluedroid/.a2dp_data"
A2DP_CTRL_PATH是控制通道,A2DP_DATA_PATH是数据通道。
1、首先需要关注一个文件uipc.cc,里面的函数UIPC_Init
初始化一些uipc的变量,然后启动主线程uipc_read_task
这里面的实现不太需要关注。
2、UIPC_Open(UIPC_CH_ID_AV_CTRL, btif_a2dp_ctrl_cb);启动控制通道。注册回调btif_a2dp_ctrl_cb
3、btif_a2dp_recv_ctrl_data这个函数就是处理收到的控制指令,例如get configure,set configure、stream start、stream suspend等。
4、当收到stream start的时候就会启动数据通道
5、启动数据通道后,会通过回调btif_a2dp_data_cb通知,进行一些必要的操作后(具体参考原生代码btif_a2dp_data_cb的实现),就可以使用UIPC_Read(UIPC_CH_ID_AV_AUDIO, &event, p_buf, len);读取到数据了。这里如果要使用自己的蓝牙可以建立线程读取数据,当stream stop或者stream suspend时cancel掉线程即可
6、注意:如果静音模式audio manager不会向控制发送stream start,所以如果其他指令都收到了没有收到stream start可以调节下声音试试。