杰理之一拖二配对流程
原创内容来自:
杰理之一拖二播歌抢占流程log分析
场景:设备A先播歌,设备B抢占设备A播歌,设备A再次抢占设备B播歌。
以下是正常抢占的log,跟踪调试流程可以参考核对。
播歌抢占流程:
设备A先播歌:
Received AVDTP_START //收到远程命令,还未执行命令动作
BT_STATUS_AVDTP_START //远程设备地址
“(设备A)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x38 //BT_STATUS_AVDTP_START播歌
BT_STATUS_A2DP_MEDIA_START //开始执行命令动作
“(设备A)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x36 //BT_STATUS_A2DP_MEDIA_START播歌
BT_STATUS_AVRCP_VOL_CHANGE
dual_conn_btstack_event_handler:0x29 //BT_STATUS_AVRCP_VOL_CHANGE协议栈更新音量值出来
[EARPHONE]BT_STATUS_AVRCP_INCOME_OPID:68 //AVC_PLAY播歌
BT_STATUS_AVRCP_INCOME_OPID: 44
“(设备A)要播歌的远端设备地址”
dual_conn_btstack_event_handler:0x28 //收到远端设备发过来的AVRCP命令
app_msg_bt_a2dp_play
“(设备A)要播歌的远端设备地址”
conn->core.a2dp_mute=0 //有设备要播歌
(设备A)创建解码流
[handshake] : 1, 2 //等待握手ack
[handshake] : 1, 1 //握手request
[handshake] : 1, 4 //握手成功
>>>>handshake time 80 ms //握手时间???
设备B抢占设备A播歌:
Received AVDTP_START / /收到远程命令,还未执行命令动作
BT_STATUS_AVDTP_START //远程设备地址
“(设备B)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x38 //BT_STATUS_AVDTP_START播歌
BT_STATUS_A2DP_MEDIA_START //开始执行命令动作
“(设备B)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x36 //BT_STATUS_A2DP_MEDIA_START播歌
BT_STATUS_AVRCP_VOL_CHANGE
dual_conn_btstack_event_handler:0x29 //BT_STATUS_AVRCP_VOL_CHANGE协议栈更新音量值出来
CMD_A2DP_SLIENCT_DETECE //能量检测
“(设备B)要播歌的远端设备地址”
bt_start_a2dp_slience_detect
“(设备B)要播歌的远端设备地址”
bt_start_a2dp_slience_detect, 297 g_dual_detect->is_receive_avrcp_play_cmd = 0 //是否收到avrcp的播放命令
[EARPHONE]BT_STATUS_AVRCP_INCOME_OPID:68 //AVC_PLAY播歌
BT_STATUS_AVRCP_INCOME_OPID: 44
“(设备B)要播歌的远端设备地址”
dual_conn_btstack_event_handler:0x28 //收到远端设备发过来的AVRCP命令
a2dp_slience_detect, 188 g_dual_detect->is_receive_avrcp_play_cmd = 1 //是否收到avrcp的播放命令
CMD_A2DP_MUTE //抢占,把正在播歌的设备mute住
“(设备A)被抢占的设备地址”
(设备A)释放解码流
conn->core.a2dp_mute=1 //释放解码流,没设备播歌
bt_start_a2dp_slience_detect: //能量检测
“(设备A)被抢占的设备地址”
bt_start_a2dp_slience_detect, 297 g_dual_detect->is_receive_avrcp_play_cmd = 0 //是否收到avrcp的播放命令
app_msg_bt_a2dp_play
“(设备B)要播歌的远端设备地址”
conn->core.a2dp_mute=0 //有设备要播歌
(设备B)创建解码流
[handshake] : 1, 2 //等待握手ack
[handshake] : 1, 4 //握手成功
>>>>handshake time 80 ms
[EARPHONE]BT_STATUS_AVRCP_INCOME_OPID:70 //AVC_PAUSE
BT_STATUS_AVRCP_INCOME_OPID: 46
“(设备A)被抢占的设备地址”
dual_conn_btstack_event_handler:0x28 //收到远端设备发过来的AVRCP命令
BT_STATUS_AVDTP_SUSPEND //抢占,挂起被抢占的设备
“(设备A)被抢占的设备地址”
conn->core.a2dp_mute=0 //有设备播歌
dual_conn_btstack_event_handler:0x39 //BT_STATUS_AVDTP_SUSPEND
BT_STATUS_A2DP_MEDIA_STOP //暂停被抢占的设备
tws_a2dp_player_close
“(设备A)被抢占的设备地址”
bt_stop_a2dp_slience_detect
conn->core.a2dp_mute=0 //有设备播歌
设备B抢占设备A播歌:
Received AVDTP_START / /收到远程命令,还未执行命令动作
BT_STATUS_AVDTP_START //远程设备地址
“(设备A)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x38 //BT_STATUS_AVDTP_START播歌
BT_STATUS_A2DP_MEDIA_START //开始执行命令动作
“(设备A)发送命令的远端设备地址”
dual_conn_btstack_event_handler:0x36 //BT_STATUS_A2DP_MEDIA_START播歌
BT_STATUS_AVRCP_VOL_CHANGE
dual_conn_btstack_event_handler:0x29 //BT_STATUS_AVRCP_VOL_CHANGE协议栈更新音量值出来
CMD_A2DP_SLIENCT_DETECE //能量检测
“(设备A)要播歌的远端设备地址”
bt_start_a2dp_slience_detect
“(设备A)要播歌的远端设备地址”
bt_start_a2dp_slience_detect, 297 g_dual_detect->is_receive_avrcp_play_cmd = 0 //是否收到avrcp的播放命令
[EARPHONE]BT_STATUS_AVRCP_INCOME_OPID:68 //AVC_PLAY播歌
BT_STATUS_AVRCP_INCOME_OPID: 44
“(设备A)要播歌的远端设备地址”
dual_conn_btstack_event_handler:0x28 //收到远端设备发过来的AVRCP命令
a2dp_slience_detect, 188 g_dual_detect->is_receive_avrcp_play_cmd = 1 //是否收到avrcp的播放命令
CMD_A2DP_MUTE //抢占,把正在播歌的设备mute住
“(设备B)被抢占的设备地址”
(设备B)释放解码流
conn->core.a2dp_mute=1 //释放解码流,没设备播歌
bt_start_a2dp_slience_detect: //能量检测
“(设备B)被抢占的设备地址”
bt_start_a2dp_slience_detect, 297 g_dual_detect->is_receive_avrcp_play_cmd = 0 //是否收到avrcp的播放命令
app_msg_bt_a2dp_play
“(设备A)要播歌的远端设备地址”
conn->core.a2dp_mute=0 //有设备要播歌
(设备A)创建解码流
[handshake] : 1, 2 //等待握手ack
[handshake] : 1, 4 //握手成功
>>>>handshake time 80 ms
以下是log没有的(关机早了),猜测继续运行应该会有:
[EARPHONE]BT_STATUS_AVRCP_INCOME_OPID:70 //AVC_PAUSE
BT_STATUS_AVRCP_INCOME_OPID: 46
“(设备B)被抢占的设备地址”
dual_conn_btstack_event_handler:0x28 //收到远端设备发过来的AVRCP命令
BT_STATUS_AVDTP_SUSPEND //抢占,挂起被抢占的设备
“(设备B)被抢占的设备地址”
conn->core.a2dp_mute=0 //有设备播歌
dual_conn_btstack_event_handler:0x39 //BT_STATUS_AVDTP_SUSPEND
BT_STATUS_A2DP_MEDIA_STOP //暂停被抢占的设备
tws_a2dp_player_close
“(设备B)被抢占的设备地址”
bt_stop_a2dp_slience_detect
conn->core.a2dp_mute=0 //有设备播歌
tip
当有设备播歌时,conn->core.a2dp_mute=0
当没有设备播歌时,conn->core.a2dp_mute=1
当A设备被抢占时,会有 CMD_A2DP_MUTE + “被mute住的设备地址”