1 蓝牙和AUDIO之间的接口
蓝牙和audio之间的通信是通过socket,管理socket中的文件是UIPC,UIPC管理两条socket.
A2DP_CTRL_PATH /data/misc/bluedroid/.a2dp_ctrl
A2DP_DATA_PATH /data/misc/bluedroid/.a2dp_data
这两个socket的作用就是接收audio的控制命令和音频数据。
A2DP_CTRL_PATH在蓝牙打开的时候创建,A2DP_DATA_PATH在audio下发START命令给蓝牙的时候创建。
2 audio数据发到蓝牙
audio的数据发到蓝牙的流程如下:
out_write->start_audio_datapath->a2dp_command 下发A2DP_CTRL_CMD_START命令。
btif_a2dp_ctrl_cb->btif_a2dp_recv_ctrl_data-> UIPC_Open(UIPC_CH_ID_AV_AUDIO, btif_a2dp_data_cb)
收到start命令之后,创建A2DP_DATA_PATH通道
调用skt_write向这个socket发送消息
3 蓝牙SBC编码
打开蓝牙的时候,会创建一个A2DP的工作线程,创建A2DP的控制命令的消息队列,在消息队列里面加上btif_a2dp_source_command_ready函数,当有命令下发到蓝牙的时候,调用btif_a2dp_source_audio_tx_start_event函数,这个函数里面创建一个定时器回调函数,周期是20ms, 每隔20ms向sbc编码器发送编码的命令。a2dp_sbc_send_frames->a2dp_sbc_encode_frames
a2dp_sbc_encode_frame函数读取PCM数据,然后进行编码,编码完成后,发送到AVDTP层。
4 发送SBC数据
在AVDTP层,调用L2CA_DataWrite向下层发送数据。