对于Audio Flinger而言,他能够获取到a2dp的hw module,然后怎才能将数据送至蓝牙协议栈。蓝牙方面已经起了一个线程,专用于发送和接收media的数据,线程名称:btif_media_task.蓝牙与Audio的通信则采用了socket的方式,管理socket的中间文件为:UIPC。
因此UIPC主要的作用就是,接收Audio的控制命令转发给bt,接收Audio的音频数据发送给bt。因此UIPC建立了两条socket,分别为:
#define A2DP_CTRL_PATH "/data/misc/bluedroid/.a2dp_ctrl"
#define A2DP_DATA_PATH "/data/misc/bluedroid/.a2dp_data"
其中第一条control socket在btif media task启动的时候随之创建。
bool btif_a2dp_start_media_task(void)
{
...
thread_post(worker_thread, btif_media_thread_init, NULL);
APPL_TRACE_EVENT("## A2DP MEDIA THREAD STARTED ##");
return true;
...
}
static void btif_media_thread_init(UNUSED_ATTR void *context) {
memset(&btif_media_cb, 0, sizeof(btif_media_cb));
UIPC_Init(NULL);
UIPC_Open(UIPC_CH_ID_AV_CTRL , btif_a2dp_ctrl_cb);
raise_priority_a2dp(TASK_HIGH_MEDIA);
media_task_running = MEDIA_TASK_STATE_ON;
}
第二条data socket在收到audio cmd start时候创建。任何命令的处理,btif task都需要恢复ack,表明命令是否执行完成。