References:
- Gaming Dongle Feature Application Note
dongle发送给headset的spp指令格式
(PS:这部分指令的的接收可以在headset的app_dongle_spp_cback函数看到,但在dongle部分的发送指令源码似乎在sdk中看不到Σ(っ °Д °;)っ)
功能实现函数
headset部分
// headset和dongle连接且dongle判断到pc/cellphone正在通话中,则dongle
// 会向headset发送打开enable mic的spp指令
// 处理enable mic的spp指令的回调函数如下
static void app_dongle_spp_cback(T_BT_EVENT event_type, void *event_buf, uint16_t buf_len)
{...case BT_EVENT_SPP_DATA_IND:{...// 此处判断Command type(Byte 3)是否为0x03,即DONGLE_CMD_REQ_OPEN_MICelse if (p_data[3] == DONGLE_CMD_REQ_OPEN_MIC){
#if F_APP_APT_SUPPORTuint8_t action = MMI_NULL;
#endif// 此处判断Byte 4 为0x01(turn on mic)或0x00(turn off mic)if (p_data[4] == 1){app_dongle_updata_mic_data_idx(true);app_transfer_queue_reset(CMD_PATH_SPP);#if F_APP_APT_SUPPORTif (app_cfg_const.normal_apt_support &&app_apt_is_apt_on_state((T_ANC_APT_STATE)app_db.current_listening_state)){action = MMI_AUDIO_APT;app_db.dongle_is_disable_apt = true;app_dongle_control_apt(action);}
#endifapp_bt_policy_qos_param_update(app_db.br_link[app_idx].bd_addr, BP_TPOLL_SPP_ENABLE);#if F_APP_24G_BT_AUDIO_SOURCE_CTRL_SUPPORTif ((app_cfg_const.enable_24g_bt_audio_source_switch&& (app_cfg_nv.allowed_source != ALLOWED_SOURCE_24G))|| (app_hfp_get_call_status() != APP_CALL_IDLE)){// not to start recording, restore recording if needed.app_db.restore_dongle_recording = true;}else
#endif{app_dongle_update_is_mic_enable(true);app_dongle_start_recording(app_db.br_link[app_idx].bd_addr);}}else{app_db.restore_dongle_recording = false;app_dongle_updata_mic_data_idx(true);app_dongle_update_is_mic_enable(false);app_dongle_stop_recording(app_db.br_link[app_idx].bd_addr);app_bt_policy_qos_param_update(app_db.br_link[app_idx].bd_addr, BP_TPOLL_SPP_DISABLE);#if F_APP_APT_SUPPORTif (app_db.dongle_is_disable_apt &&(!app_apt_is_apt_on_state((T_ANC_APT_STATE)app_db.current_listening_state))){action = MMI_AUDIO_APT;app_db.dongle_is_disable_apt = false;app_dongle_control_apt(action);}
#endif}}else if (p_data[3] == DONGLE_CMD_SET_VOL_BALANCE){if (p_data[4] == 1) // dongle to earphone{// update recordapp_db.gaming_balance = p_data[5];app_db.chat_balance = p_data[6];app_dongle_volume_balance_report(DONGLE_CMD_ACK);}}else if (p_data[3] == DONGLE_CMD_CTRL_RAW_DATA){app_dongle_rcv_ctrl_data(p_data + 4, data_len - 4);}else if (p_data[3] == DONGLE_CMD_PASS_THROUGH_DATA){if (p_data[4] == CMD_SYNC_BYTE) //AudioConnect cmd header check{uint16_t cmd_len = (p_data[6] | (p_data[7] << 8)) + 4; //sync_byte, seqn, length_low, length_highuint8_t seqn = p_data[5];APP_PRINT_TRACE2("app_dongle_cmd_pass_through: 0x%02X, 0x%02X", cmd_len, seqn);app_cmd_handler(&p_data[8], (cmd_len - 4), CMD_PATH_SPP, seqn, app_idx);}}
#endif
#if F_APP_CFU_SPP_SUPPORTelse if (p_data[3] == DONGLE_CMD_CFU_DATA){T_APP_CFU_DATA cfu_data;memcpy(cfu_data.spp_data.bd_addr, param->spp_data_ind.bd_addr, 6);if (app_cfu_spp_header_parse(payload_len - 1, p_data + 4, &cfu_data)){app_cfu_handle_report(cfu_data.spp_data.report_id, APP_CFU_REPORT_SOURCE_SPP, &cfu_data);}}
#endif
#if F_APP_CUSTOMIZED_SBC_VP_FLOW_SUPPORTelse if (p_data[3] == DONGLE_CMD_ERASE_FLASH){//Do erase & Send ackapp_dongle_receive_erase_cmd(p_data + 4);}else if (p_data[3] == DONGLE_CMD_WRITE_CUSTOMIZED_VP){//Do write & Send ackapp_dongle_receive_customized_vp_data(payload_len - 1, p_data + 4);}else if (p_data[3] == DONGLE_CMD_WRITE_VP_FINISH){//Dongle notifies write finishapp_dongle_write_vp_finish();}
#endif}}}}}break;}
连接dongle通话headset自动打开mic log
0008451 06-03#16:59:28.948 064 0044991.291 [BTM] bt_mgr_dispatch: msg 0x07040008452 06-03#16:59:28.948 065 0044991.315 [BTM] !**bt_mgr_event_post: event_type 0x30050008453 06-03#16:59:28.948 066 0044991.434 [PROFILE] !**spp_send_credit: addr[11::22::33::44::55::FE] server chann[0x11] credit[1]0008454 06-03#16:59:28.948 067 0044991.490 [RFCOMM] rfc_data_cfm: dlci 0x22, given credits 10008455 06-03#16:59:28.948 068 0044991.510 [APP] app_dongle_spp_cback: 0x01, 0x020008456 06-03#16:59:28.948 069 0044991.535 [APP] !**app_dongle_spp_cback 52, 01, 02, 03, 01, 54,0008457 06-03#16:59:28.948 070 0044991.655 [APP] !!*app_stop_timer: handle error 0, pointer 0x2c13f00008458 06-03#16:59:28.948 071 0044991.961 [APP] app_bt_policy_qos_param_update: event 18, sco 0, a2dp_idx 0, avrcp 1, stream 1, active_tpoll 0, inactive_idx 4, bau_idx 40008459 06-03#16:59:28.948 072 0044991.979 [APP] app_bt_policy_qos_param_update: enable_mic 0, gaming 10008460 06-03#16:59:28.948 073 0044992.014 [APP] app_dongle_update_is_mic_enable: 10008461 06-03#16:59:28.948 080 0044994.235 [APP] !**app_dongle_start_recording
dongle部分
该部分代码涉及到usb部分知识,因为不熟悉usb所以无能为力,但是在log部分可以看到一些通话开启时usb的状态变化
Line 8607: 0008607 06-27#16:19:18.743 160 0029084.647 [USB] !**usb_audio_driver_streaming_activate:dir:1,bit_width:16, cur_sample_rate:48000, chann_num:2, sample_rate_max_tolerance:48000
Line 8633: 0008633 06-27#16:19:18.757 188 0029091.647 [APP] !**ds_moniter_timeout_handle: set ds_streaming true
Line 19702: 0019702 06-27#16:19:33.031 132 0043350.966 [USB] !**usb_audio_driver_streaming_deactivate:1