/*************************************************************************** * * Copyright 2015-2019 BES. * All rights reserved. All unpublished rights reserved. * * No part of this work may be used or reproduced in any form or by any * means, or stored in a database or retrieval system, without prior written * permission of BES. * * Use of this work is governed by a license granted by BES. * This work contains confidential and proprietary information of * BES. which is protected by copyright, trade secret, * trademark and other intellectual property rights. * ****************************************************************************/ // #include "mbed.h" #include "analog.h" #include "audioflinger.h" #include "cmsis.h" #include "cmsis_os.h" #include "hal_cmu.h" #include "hal_timer.h" #include "hal_trace.h" #include "hal_uart.h" #include "lockcqueue.h" #include #include "a2dp_api.h" #include "avctp_api.h" #include "avdtp_api.h" #include "avrcp_api.h" #include "hfp_api.h" #include "me_api.h" #include "besbt.h" #include "app_audio.h" #include "app_key.h" #include "btapp.h" #include "cqueue.h" #include "app_bt.h" #include "app_bt_func.h" #include "app_bt_media_manager.h" #include "app_bt_stream.h" #include "app_hfp.h" #include "apps.h" #include "bt_if.h" #if defined(APP_LINEIN_A2DP_SOURCE) || defined(APP_I2S_A2DP_SOURCE) #include "nvrecord_env.h" #endif #include "os_api.h" extern struct BT_DEVICE_T app_bt_device; // BT_DEVICE_ID_T g_current_device_id=BT_DEVICE_NUM; //used to change sco by // one-bring-two BT_DEVICE_ID_T g_another_device_id=BT_DEVICE_NUM; //used to // change sco by one-bring-two #ifdef BTIF_HID_DEVICE #include "app_bt_hid.h" #endif #ifdef SUPPORT_SIRI extern int app_hfp_siri_report(); extern int app_hfp_siri_voice(bool en); int open_siri_flag = 0; void bt_key_handle_siri_key(enum APP_KEY_EVENT_T event) { switch (event) { case APP_KEY_EVENT_NONE: if (open_siri_flag == 1) { TRACE(0, "open siri"); app_hfp_siri_voice(true); open_siri_flag = 0; } /*else { TRACE(0,"evnet none close siri"); app_hfp_siri_voice(false); }*/ break; case APP_KEY_EVENT_LONGLONGPRESS: case APP_KEY_EVENT_UP: // TRACE(0,"long long/up/click event close siri"); // app_hfp_siri_voice(false); break; default: TRACE(1, "unregister down key event=%x", event); break; } } #endif // bool hf_mute_flag = 0; #if defined(__HSP_ENABLE__) extern XaStatus app_hs_handle_cmd(HsChannel *Chan, uint8_t cmd_type); void hsp_handle_key(uint8_t hsp_key) { HsCommand *hs_cmd_p; HsChannel *hs_channel_tmp = NULL; uint8_t ret = 0; #ifdef __BT_ONE_BRING_TWO__ enum BT_DEVICE_ID_T another_device_id = (app_bt_device.curr_hs_channel_id == BT_DEVICE_ID_1) ? BT_DEVICE_ID_2 : BT_DEVICE_ID_1; TRACE(1, "!!!hsp_handle_key curr_hf_channel=%d\n", app_bt_device.curr_hs_channel_id); hs_channel_tmp = (app_bt_device.curr_hs_channel_id == BT_DEVICE_ID_1) ? &(app_bt_device.hs_channel[BT_DEVICE_ID_1]) : &(app_bt_device.hs_channel[BT_DEVICE_ID_2]); #else hs_channel_tmp = &(app_bt_device.hs_channel[BT_DEVICE_ID_1]); #endif if (hsp_key == HSP_KEY_CKPD_CONTROL) { TRACE(0, "hsp_key = HSP_KEY_CKPD_CONTROL"); if (app_hs_handle_cmd(hs_channel_tmp, APP_CPKD_CMD) != 0) TRACE(0, "app_hs_handle_cmd err"); } else if (hsp_key == HSP_KEY_CHANGE_TO_PHONE) { TRACE(0, "hsp_key = HSP_KEY_CHANGE_TO_PHONE"); HS_DisconnectAudioLink(hs_channel_tmp); } else if (hsp_key == HSP_KEY_ADD_TO_EARPHONE) { TRACE(0, "hsp_key = HSP_KEY_ADD_TO_EARPHONE"); HS_CreateAudioLink(hs_channel_tmp); } } #endif #ifdef __BT_ONE_BRING_TWO__ uint8_t gHfcallNextSta = HFCALL_NEXT_STA_NULL; void hfcall_next_sta_handler(hf_event_t event) { TRACE(0, "!!!hfcall_next_sta_handler curr_hf_channel=%d,gHfcallNextSta %d\n", app_bt_device.curr_hf_channel_id, gHfcallNextSta); // hf_chan_handle_t hf_channel_curr = // app_bt_device.hf_channel[app_bt_device.curr_hf_channel_id]; enum BT_DEVICE_ID_T another_device_id = (app_bt_device.curr_hf_channel_id == BT_DEVICE_ID_1) ? BT_DEVICE_ID_2 : BT_DEVICE_ID_1; hf_chan_handle_t hf_channel_another = app_bt_device.hf_channel[another_device_id]; switch (gHfcallNextSta) { case HFCALL_NEXT_STA_NULL: break; case HFCALL_NEXT_STA_ANOTHER_ANSWER: if (event == BTIF_HF_EVENT_AUDIO_DISCONNECTED) { TRACE(0, "NEXT_ACTION = HFP_ANSWER_ANOTHER_CALL\n"); btif_hf_answer_call(hf_channel_another); gHfcallNextSta = HFCALL_NEXT_STA_NULL; } case HFCALL_NEXT_STA_ANOTHER_ADDTOEARPHONE: if (event == BTIF_HF_EVENT_AUDIO_DISCONNECTED) { TRACE(0, "NEXT_ACTION = HFP_ANOTHER_ADDTOEARPHONE\n"); btif_hf_create_audio_link(hf_channel_another); gHfcallNextSta = HFCALL_NEXT_STA_NULL; } break; } } #endif void hfp_handle_key(uint8_t hfp_key) { hf_chan_handle_t hf_channel_curr = app_bt_device.hf_channel[app_bt_device.curr_hf_channel_id]; #ifdef __BT_ONE_BRING_TWO__ enum BT_DEVICE_ID_T another_device_id = (app_bt_device.curr_hf_channel_id == BT_DEVICE_ID_1) ? BT_DEVICE_ID_2 : BT_DEVICE_ID_1; hf_chan_handle_t hf_channel_another = app_bt_device.hf_channel[another_device_id]; #endif switch (hfp_key) { case HFP_KEY_ANSWER_CALL: /// answer a incomming call TRACE(0, "avrcp_key = HFP_KEY_ANSWER_CALL\n"); btif_hf_answer_call(hf_channel_curr); break; case HFP_KEY_HANGUP_CALL: TRACE(0, "avrcp_key = HFP_KEY_HANGUP_CALL\n"); btif_hf_hang_up_call(hf_channel_curr); break; case HFP_KEY_REDIAL_LAST_CALL: /// redail the last call TRACE(0, "avrcp_key = HFP_KEY_REDIAL_LAST_CALL\n"); btif_hf_redial_call(hf_channel_curr); break; case HFP_KEY_CHANGE_TO_PHONE: /// remove sco and voice change to phone if (app_bt_is_hfp_audio_on()) { TRACE(0, "avrcp_key = HFP_KEY_CHANGE_TO_PHONE\n"); btif_hf_disc_audio_link(hf_channel_curr); } break; case HFP_KEY_ADD_TO_EARPHONE: /// add a sco and voice change to earphone if (!app_bt_is_hfp_audio_on()) { TRACE(0, "avrcp_key = HFP_KEY_ADD_TO_EARPHONE ver:%x\n", btif_hf_get_version(hf_channel_curr)); #if defined(HFP_1_6_ENABLE) // if (hf_channel_tmp->negotiated_codec == HF_SCO_CODEC_MSBC){ if (btif_hf_get_negotiated_codec(hf_channel_curr) == BTIF_HF_SCO_CODEC_MSBC) { TRACE(0, "at+bcc"); #ifdef __HFP_OK__ hfp_handle_add_to_earphone_1_6(hf_channel_curr); #endif TRACE(0, "CreateAudioLink"); btif_hf_create_audio_link(hf_channel_curr); } else #endif { TRACE(0, "CreateAudioLink"); btif_hf_create_audio_link(hf_channel_curr); } } break; case HFP_KEY_MUTE: TRACE(0, "avrcp_key = HFP_KEY_MUTE\n"); app_bt_device.hf_mute_flag = 1; break; case HFP_KEY_CLEAR_MUTE: TRACE(0, "avrcp_key = HFP_KEY_CLEAR_MUTE\n"); app_bt_device.hf_mute_flag = 0; break; case HFP_KEY_THREEWAY_HOLD_AND_ANSWER: TRACE(0, "avrcp_key = HFP_KEY_THREEWAY_HOLD_AND_ANSWER\n"); btif_hf_call_hold(hf_channel_curr, BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); break; case HFP_KEY_THREEWAY_HANGUP_AND_ANSWER: TRACE(0, "avrcp_key = HFP_KEY_THREEWAY_HOLD_SWAP_ANSWER\n"); btif_hf_call_hold(hf_channel_curr, BTIF_HF_HOLD_RELEASE_ACTIVE_CALLS, 0); break; case HFP_KEY_THREEWAY_HOLD_REL_INCOMING: TRACE(0, "avrcp_key = HFP_KEY_THREEWAY_HOLD_REL_INCOMING\n"); btif_hf_call_hold(hf_channel_curr, BTIF_HF_HOLD_RELEASE_HELD_CALLS, 0); break; #ifdef __BT_ONE_BRING_TWO__ case HFP_KEY_DUAL_HF_HANGUP_ANOTHER: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_HANGUP_ANOTHER\n"); btif_hf_hang_up_call(hf_channel_another); break; case HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER\n"); btif_hf_hang_up_call(hf_channel_curr); gHfcallNextSta = HFCALL_NEXT_STA_ANOTHER_ANSWER; break; case HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER\n"); #ifdef __HFP_OK__ hf_answer_call(hf_channel_another); #endif break; case HFP_KEY_DUAL_HF_CHANGETOPHONE_ANSWER_ANOTHER: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_CHANGETOPHONE_ANSWER_ANOTHER\n"); btif_hf_disc_audio_link(hf_channel_curr); gHfcallNextSta = HFCALL_NEXT_STA_ANOTHER_ANSWER; break; case HFP_KEY_DUAL_HF_CHANGETOPHONE_ANOTHER_ADDTOEARPHONE: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_CHANGETOPHONE_ANOTHER_ADDTOEARPHONE\n"); btif_hf_disc_audio_link(hf_channel_curr); gHfcallNextSta = HFCALL_NEXT_STA_ANOTHER_ADDTOEARPHONE; break; case HFP_KEY_DUAL_HF_HANGUP_ANOTHER_ADDTOEARPHONE: TRACE(0, "avrcp_key = HFP_KEY_DUAL_HF_HANGUP_ANOTHER_ADDTOEARPHONE\n"); btif_hf_hang_up_call(hf_channel_curr); gHfcallNextSta = HFCALL_NEXT_STA_ANOTHER_ADDTOEARPHONE; break; #endif default: break; } } // bool a2dp_play_pause_flag = 0; uint8_t get_avrcp_via_a2dp_id(uint8_t a2dp_id); extern void a2dp_handleKey(uint8_t a2dp_key) { btif_avrcp_channel_t *avrcp_channel_tmp = NULL; enum BT_DEVICE_ID_T avrcp_id = BT_DEVICE_NUM; if (app_bt_device.a2dp_state[app_bt_device.curr_a2dp_stream_id] == 0) return; #ifdef __BT_ONE_BRING_TWO__ TRACE(1, "!!!a2dp_handleKey curr_a2dp_stream_id=%d\n", app_bt_device.curr_a2dp_stream_id); avrcp_id = (enum BT_DEVICE_ID_T)get_avrcp_via_a2dp_id( app_bt_device.curr_a2dp_stream_id); if (avrcp_id == BT_DEVICE_NUM) avrcp_id = BT_DEVICE_ID_1; avrcp_channel_tmp = app_bt_device.avrcp_channel[avrcp_id]; #else avrcp_id = BT_DEVICE_ID_1; avrcp_channel_tmp = app_bt_device.avrcp_channel[avrcp_id]; #endif if (!btif_avrcp_is_control_channel_connected(avrcp_channel_tmp)) { TRACE(1, "avrcp_key %d the channel is not connected", a2dp_key); return; } switch (a2dp_key) { case AVRCP_KEY_STOP: TRACE(0, "avrcp_key = AVRCP_KEY_STOP"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_STOP, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_STOP, FALSE); app_bt_device.a2dp_play_pause_flag = 0; break; case AVRCP_KEY_PLAY: TRACE(0, "avrcp_key = AVRCP_KEY_PLAY"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_PLAY, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_PLAY, FALSE); app_bt_device.a2dp_play_pause_flag = 1; break; case AVRCP_KEY_PAUSE: TRACE(0, "avrcp_key = AVRCP_KEY_PAUSE"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_PAUSE, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_PAUSE, FALSE); app_bt_device.a2dp_play_pause_flag = 0; break; case AVRCP_KEY_FORWARD: TRACE(0, "avrcp_key = AVRCP_KEY_FORWARD"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_FORWARD, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_FORWARD, FALSE); app_bt_device.a2dp_play_pause_flag = 1; break; case AVRCP_KEY_BACKWARD: TRACE(0, "avrcp_key = AVRCP_KEY_BACKWARD"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_BACKWARD, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_BACKWARD, FALSE); app_bt_device.a2dp_play_pause_flag = 1; break; case AVRCP_KEY_VOLUME_UP: TRACE(0, "avrcp_key = AVRCP_KEY_VOLUME_UP"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_VOLUME_UP, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_VOLUME_UP, FALSE); break; case AVRCP_KEY_VOLUME_DOWN: TRACE(0, "avrcp_key = AVRCP_KEY_VOLUME_DOWN"); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_VOLUME_DOWN, TRUE); btif_avrcp_set_panel_key(avrcp_channel_tmp, BTIF_AVRCP_POP_VOLUME_DOWN, FALSE); break; default: break; } } // uint8_t phone_earphone_mark = 0; #if 0 // def __BT_ONE_BRING_TWO__ #define HF_CHANNEL_SWITCH_HOOK_USER APP_BT_GOLBAL_HANDLE_HOOK_USER_0 enum HF_CHANNEL_SWITCH_STATUS{ HF_CHANNEL_SWITCH_STATUS_IDLE, HF_CHANNEL_SWITCH_STATUS_ONPROCESS, }; struct HF_CHANNEL_SWITCH_ENV_T{ BT_DEVICE_ID_T old_device_id; hf_chan_handle_t hf_channel_old; BT_DEVICE_ID_T new_device_id; hf_chan_handle_t hf_channel_new; enum HF_CHANNEL_SWITCH_STATUS status; }hf_channel_switch_env; static void bt_key_hf_channel_switch_hook(const btif_event_t *Event); static void bt_key_hf_channel_switch_stop(void) { hf_channel_switch_env.status = HF_CHANNEL_SWITCH_STATUS_IDLE; hf_channel_switch_env.old_device_id = BT_DEVICE_NUM; hf_channel_switch_env.hf_channel_old = NULL; hf_channel_switch_env.new_device_id = BT_DEVICE_NUM; hf_channel_switch_env.hf_channel_new = NULL; app_bt_global_handle_hook_set(HF_CHANNEL_SWITCH_HOOK_USER, NULL); } #ifdef __HF_KEEP_ONE_ALIVE__ static void bt_key_hf_channel_switch_active(BT_DEVICE_ID_T current_id, BT_DEVICE_ID_T another_id) { TRACE(2,"switch_active %d-->%d", current_id, another_id); hf_channel_switch_env.old_device_id = current_id; hf_channel_switch_env.hf_channel_old = (app_bt_device.hf_channel[current_id]); hf_channel_switch_env.new_device_id = another_id; hf_channel_switch_env.hf_channel_new = (app_bt_device.hf_channel[another_id]); app_bt_HF_DisconnectAudioLink(hf_channel_switch_env.hf_channel_old); app_bt_HF_CreateAudioLink(hf_channel_switch_env.hf_channel_new); } #endif static void bt_key_hf_channel_switch_start(void) { uint8_t i; TRACE(2,"%s status:%d enter",__func__, hf_channel_switch_env.status ); if (hf_channel_switch_env.status == HF_CHANNEL_SWITCH_STATUS_ONPROCESS){ return; } for (i=0; i= BTIF_HF_CALL_SETUP_OUT) && current_call == BTIF_HF_CALL_NONE) { TRACE( 0, "current hfcall machine status is HFCALL_MACHINE_CURRENT_OUTGOING!!!!"); status = HFCALL_MACHINE_CURRENT_OUTGOING; } // current AG is calling. else if ((current_callSetup == BTIF_HF_CALL_SETUP_NONE) && current_call == BTIF_HF_CALL_ACTIVE && current_callheld != BTIF_HF_CALL_HELD_ACTIVE) { TRACE( 0, "current hfcall machine status is HFCALL_MACHINE_CURRENT_CALLING!!!!"); status = HFCALL_MACHINE_CURRENT_CALLING; } // current AG is 3way incomming. else if (current_callSetup == BTIF_HF_CALL_SETUP_IN && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_NONE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_3WAY_INCOMMING!!!!"); status = HFCALL_MACHINE_CURRENT_3WAY_INCOMMING; } // current AG is 3way hold calling. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_ACTIVE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING!!!!"); status = HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING; } else { TRACE(0, "current hfcall machine status is not found!!!!!!"); } #else // current AG is idle , another AG is idle. if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_NONE && current_audioState == BTIF_HF_AUDIO_DISCON && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE; } // current AG is on incomming , another AG is idle. else if (current_callSetup == BTIF_HF_CALL_SETUP_IN && current_call == BTIF_HF_CALL_NONE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE; } // current AG is on outgoing , another AG is idle. else if (current_callSetup >= BTIF_HF_CALL_SETUP_OUT && current_call == BTIF_HF_CALL_NONE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE; } // current AG is on calling , another AG is idle. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld != BTIF_HF_CALL_HELD_ACTIVE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE; } // current AG is 3way incomming , another AG is idle. else if (current_callSetup == BTIF_HF_CALL_SETUP_IN && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE; } // current AG is 3way hold calling , another AG is without connecting. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_ACTIVE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE!!!!"); status = HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE; } // current AG is incomming , another AG is incomming too. else if (current_callSetup == BTIF_HF_CALL_SETUP_IN && current_call == BTIF_HF_CALL_NONE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_IN && another_call == BTIF_HF_CALL_NONE && another_callheld == BTIF_HF_CALL_HELD_NONE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING!!!!"); status = HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_INCOMMING; } // current AG is outgoing , another AG is incomming too. else if (current_callSetup == BTIF_HF_CALL_SETUP_OUT && current_call == BTIF_HF_CALL_NONE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_IN && another_call == BTIF_HF_CALL_NONE && another_callheld == BTIF_HF_CALL_HELD_NONE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING!!!!"); status = HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING; } // current AG is calling , another AG is incomming. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_IN && another_call == BTIF_HF_CALL_NONE && another_callheld == BTIF_HF_CALL_HELD_NONE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING!!!!"); status = HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING; } // current AG is on calling , another AG calling changed to phone. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_ACTIVE && another_callheld == BTIF_HF_CALL_HELD_NONE && another_audioState == BTIF_HF_AUDIO_DISCON) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE!!!!"); status = HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE; } // current AG is on calling , another AG calling is hold. else if (current_callSetup == BTIF_HF_CALL_SETUP_NONE && current_call == BTIF_HF_CALL_ACTIVE && current_callheld == BTIF_HF_CALL_HELD_NONE && another_callSetup == BTIF_HF_CALL_SETUP_NONE && another_call == BTIF_HF_CALL_ACTIVE && another_callheld == BTIF_HF_CALL_HELD_ACTIVE) { TRACE(0, "current hfcall machine status is " "HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD!!!!"); status = HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD; } else { TRACE(0, "current hfcall machine status is not found!!!!!!"); } #endif // TRACE(0,"%s status is %d",__func__,status); return status; } void bt_key_handle_func_click(void) { TRACE(0, "%s enter", __func__); HFCALL_MACHINE_ENUM hfcall_machine = app_get_hfcall_machine(); switch (hfcall_machine) { case HFCALL_MACHINE_CURRENT_IDLE: { if (app_bt_device.a2dp_play_pause_flag == 0) { a2dp_handleKey(AVRCP_KEY_PLAY); } else { a2dp_handleKey(AVRCP_KEY_PAUSE); } } break; case HFCALL_MACHINE_CURRENT_INCOMMING: hfp_handle_key(HFP_KEY_ANSWER_CALL); break; case HFCALL_MACHINE_CURRENT_OUTGOING: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_CALLING: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING: hfp_handle_key(HFP_KEY_THREEWAY_HANGUP_AND_ANSWER); break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING: hfp_handle_key(HFP_KEY_THREEWAY_HOLD_AND_ANSWER); break; #ifdef __BT_ONE_BRING_TWO__ case HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE: { if (app_bt_device.a2dp_play_pause_flag == 0) { a2dp_handleKey(AVRCP_KEY_PLAY); } else { a2dp_handleKey(AVRCP_KEY_PAUSE); } } break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_ANSWER_CALL); break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_THREEWAY_HANGUP_AND_ANSWER); break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_THREEWAY_HOLD_AND_ANSWER); break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING: hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE: hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_ANOTHER_ADDTOEARPHONE); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD: hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER); break; #endif default: break; } #if defined(__HSP_ENABLE__) // now we know it is HSP active ! if (app_bt_device.hs_conn_flag[app_bt_device.curr_hs_channel_id] == 1) { hsp_handle_key(HSP_KEY_CKPD_CONTROL); } #endif #if HF_CUSTOM_FEATURE_SUPPORT & HF_CUSTOM_FEATURE_SIRI_REPORT open_siri_flag = 0; #endif return; } void bt_key_handle_func_doubleclick(void) { TRACE(0, "%s enter", __func__); HFCALL_MACHINE_ENUM hfcall_machine = app_get_hfcall_machine(); #ifdef SUPPORT_SIRI open_siri_flag = 0; #endif switch (hfcall_machine) { case HFCALL_MACHINE_CURRENT_IDLE: #ifdef BTIF_HID_DEVICE app_bt_hid_send_capture(app_bt_device.hid_channel[BT_DEVICE_ID_1]); #else hfp_handle_key(HFP_KEY_REDIAL_LAST_CALL); #endif break; case HFCALL_MACHINE_CURRENT_INCOMMING: break; case HFCALL_MACHINE_CURRENT_OUTGOING: break; case HFCALL_MACHINE_CURRENT_CALLING: if (app_bt_device.hf_mute_flag == 0) { hfp_handle_key(HFP_KEY_MUTE); app_bt_device.hf_mute_flag = 1; } else { hfp_handle_key(HFP_KEY_CLEAR_MUTE); app_bt_device.hf_mute_flag = 0; } break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING: hfp_handle_key(HFP_KEY_THREEWAY_HOLD_REL_INCOMING); break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING: break; #ifdef __BT_ONE_BRING_TWO__ case HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE: #ifdef BTIF_HID_DEVICE app_bt_hid_send_capture(app_bt_device.hid_channel[BT_DEVICE_ID_1]); #else hfp_handle_key(HFP_KEY_REDIAL_LAST_CALL); #endif break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE: break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE: if (app_bt_device.hf_mute_flag == 0) { hfp_handle_key(HFP_KEY_MUTE); } else { hfp_handle_key(HFP_KEY_CLEAR_MUTE); } break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_THREEWAY_HOLD_REL_INCOMING); break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE: break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING: hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_ANOTHER); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD: break; #endif default: break; } } void bt_key_handle_func_longpress(void) { TRACE(0, "%s enter", __func__); HFCALL_MACHINE_ENUM hfcall_machine = app_get_hfcall_machine(); #ifdef SUPPORT_SIRI open_siri_flag = 0; #endif app_voice_report(APP_STATUS_INDICATION_WARNING, 0); switch (hfcall_machine) { case HFCALL_MACHINE_CURRENT_IDLE: { #if HF_CUSTOM_FEATURE_SUPPORT & HF_CUSTOM_FEATURE_SIRI_REPORT if (open_siri_flag == 0) { app_voice_report(APP_STATUS_INDICATION_WARNING, 0); open_siri_flag = 1; } #endif } break; case HFCALL_MACHINE_CURRENT_INCOMMING: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_OUTGOING: break; case HFCALL_MACHINE_CURRENT_CALLING: { if (app_bt_device.phone_earphone_mark == 0) { // call is active, switch from earphone to phone hfp_handle_key(HFP_KEY_CHANGE_TO_PHONE); } else if (app_bt_device.phone_earphone_mark == 1) { // call is active, switch from phone to earphone hfp_handle_key(HFP_KEY_ADD_TO_EARPHONE); } } break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING: { app_voice_report(APP_STATUS_INDICATION_WARNING, 0); hfp_handle_key(HFP_KEY_THREEWAY_HOLD_AND_ANSWER); } break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING: hfp_handle_key(HFP_KEY_THREEWAY_HANGUP_AND_ANSWER); break; #ifdef __BT_ONE_BRING_TWO__ case HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE: #ifdef BTIF_HID_DEVICE Hid_Send_capture(&app_bt_device.hid_channel[BT_DEVICE_ID_1]); #endif break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_HANGUP_CALL); break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE: { if (app_bt_device.phone_earphone_mark == 0) { // call is active, switch from earphone to phone hfp_handle_key(HFP_KEY_CHANGE_TO_PHONE); } else if (app_bt_device.phone_earphone_mark == 1) { // call is active, switch from phone to earphone hfp_handle_key(HFP_KEY_ADD_TO_EARPHONE); } } break; case HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_THREEWAY_HOLD_AND_ANSWER); break; case HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE: hfp_handle_key(HFP_KEY_THREEWAY_HANGUP_AND_ANSWER); break; case HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING: break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING: hfp_handle_key(HFP_KEY_DUAL_HF_CHANGETOPHONE_ANSWER_ANOTHER); // hfp_handle_key(HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE: hfp_handle_key(HFP_KEY_DUAL_HF_CHANGETOPHONE_ANOTHER_ADDTOEARPHONE); break; case HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD: hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER); break; #endif default: break; } #if defined(__HSP_ENABLE__) if (hfcall_machine == HFCALL_MACHINE_NUM) { if (app_bt_device.hs_conn_flag[app_bt_device.curr_hs_channel_id] == 1) { // now we know it is HSP active ! if (app_bt_device.phone_earphone_mark == 0) { // call is active, switch from earphone to phone hsp_handle_key(HSP_KEY_CHANGE_TO_PHONE); } else if (app_bt_device.phone_earphone_mark == 1) { // call is active, switch from phone to earphone hsp_handle_key(HSP_KEY_ADD_TO_EARPHONE); } } } #endif } void bt_key_handle_func_key(enum APP_KEY_EVENT_T event) { switch (event) { case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: bt_key_handle_func_click(); break; case APP_KEY_EVENT_DOUBLECLICK: bt_key_handle_func_doubleclick(); break; case APP_KEY_EVENT_LONGPRESS: bt_key_handle_func_longpress(); break; default: TRACE(0, "unregister func key event=%x", event); break; } } #if 0 void bt_key_handle_func_key(enum APP_KEY_EVENT_T event) { #ifdef __BT_ONE_BRING_TWO__ //if(g_current_device_id == BT_DEVICE_NUM) BT_DEVICE_ID_T current_device_id; BT_DEVICE_ID_T another_device_id; current_device_id = app_bt_device.curr_hf_channel_id; another_device_id = (current_device_id == BT_DEVICE_ID_1) ? BT_DEVICE_ID_2 : BT_DEVICE_ID_1; #endif switch(event) { #ifndef __BT_ONE_BRING_TWO__ case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: bt_key_handle_func_click(); break; case APP_KEY_EVENT_DOUBLECLICK: bt_key_handle_func_doubleclick(); break; case APP_KEY_EVENT_LONGPRESS: bt_key_handle_func_longpress(); break; #else case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: TRACE(8,"!!!APP_KEY_EVENT_CLICK callsetup %d %d call %d %d held %d %d audio_state %d %d\n", app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1], app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2], app_bt_device.hfchan_call[BT_DEVICE_ID_1], app_bt_device.hfchan_call[BT_DEVICE_ID_2], app_bt_device.hf_callheld[BT_DEVICE_ID_1], app_bt_device.hf_callheld[BT_DEVICE_ID_2], app_bt_device.hf_audio_state[BT_DEVICE_ID_1], app_bt_device.hf_audio_state[BT_DEVICE_ID_2]); if((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hf_audio_state[BT_DEVICE_ID_1] == BTIF_HF_AUDIO_DISCON)&& (app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE)&&(app_bt_device.hf_audio_state[BT_DEVICE_ID_2] == BTIF_HF_AUDIO_DISCON)){ if(app_bt_device.a2dp_play_pause_flag == 0){ a2dp_handleKey(AVRCP_KEY_PLAY); }else{ a2dp_handleKey(AVRCP_KEY_PAUSE); } } if(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] != BTIF_HF_CALL_SETUP_ALERT))) { //hfp_handle_key(HFP_KEY_ANSWER_CALL); /* (A incoming && B no active) */ TRACE(0,"!!!!answer call hf_channel=0\n"); btif_hf_answer_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); } else if ((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] != BTIF_HF_CALL_SETUP_ALERT)) { //hfp_handle_key(HFP_KEY_ANSWER_CALL); /* B incoming && A no active */ TRACE(0,"!!!!answer call hf_channel=1\n"); btif_hf_answer_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); } if (((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_OUT)||(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_ALERT))&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)) { TRACE(0,"!!!!call out hangup hf_channel=0\n"); //hfp_handle_key(HFP_KEY_HANGUP_CALL); /* (A outgoing && B no active no setup */ btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); } else if (((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_OUT)||(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_ALERT))&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)) { TRACE(0,"!!!!call out hangup hf_channel=1\n"); //hfp_handle_key(HFP_KEY_HANGUP_CALL); /* B outgoing && A no active no setup */ btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); } if(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE){ if((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE) && (app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)) { if (app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN) { /* A 1-call active 1-call incoming && B on active no setup */ TRACE(0,"!!!!release active calls hf_channel=0\n"); btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_1], BTIF_HF_HOLD_RELEASE_ACTIVE_CALLS, 0); } else { /* A active && B no active no setup */ //hfp_handle_key(HFP_KEY_HANGUP_CALL); TRACE(0,"!!!!hangup call hf_channel=0\n"); if (app_bt_device.hf_callheld[BT_DEVICE_ID_1] == BTIF_HF_CALL_HELD_NO_ACTIVE) { btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_1], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); } }else if(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN){ //hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER); /* A active && B incoming */ TRACE(0,"!!!!1hangup active and answer incoming\n"); btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); btif_hf_answer_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); } }else if(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE){ if((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE) && (app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)) { if (app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN) { /* B 1-call active 1-call incoming && A on active no setup */ TRACE(0,"!!!!release active calls hf_channel=1\n"); btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_2], BTIF_HF_HOLD_RELEASE_ACTIVE_CALLS, 0); } else { /* B active && A no active no setup */ //hfp_handle_key(HFP_KEY_HANGUP_CALL); TRACE(0,"!!!!hangup call hf_channel=1\n"); if (app_bt_device.hf_callheld[BT_DEVICE_ID_2] == BTIF_HF_CALL_HELD_NO_ACTIVE) { btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_2], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); } }else if(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN){ //hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER); /* B active && A incoming */ TRACE(0,"!!!!2hangup active and answer incoming\n"); btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); btif_hf_answer_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); } } /* A active && B active */ if((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE) && (app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)){ TRACE(0,"!!!two call both active\n"); hfp_handle_key(HFP_KEY_HANGUP_CALL); } #ifdef SUPPORT_SIRI //TRACE(0,"powerkey close siri"); //app_hfp_siri_voice(false); open_siri_flag = 0; #endif break; case APP_KEY_EVENT_DOUBLECLICK: TRACE(8,"!!!APP_KEY_EVENT_DOUBLECLICK callsetup %d %d call %d %d held %d %d audio_state %d %d\n", app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1], app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2], app_bt_device.hfchan_call[BT_DEVICE_ID_1], app_bt_device.hfchan_call[BT_DEVICE_ID_2], app_bt_device.hf_callheld[BT_DEVICE_ID_1], app_bt_device.hf_callheld[BT_DEVICE_ID_2], app_bt_device.hf_audio_state[BT_DEVICE_ID_1], app_bt_device.hf_audio_state[BT_DEVICE_ID_2]); //if(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hf_channel[BT_DEVICE_ID_2].state == HF_STATE_CLOSED))|| if(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&& (btif_get_hf_chan_state(app_bt_device.hf_channel[BT_DEVICE_ID_2]) == BTIF_HF_STATE_CLOSED))|| ((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE))){ hfp_handle_key(HFP_KEY_REDIAL_LAST_CALL); } if(((app_bt_device.hf_audio_state[BT_DEVICE_ID_1] == BTIF_HF_AUDIO_CON)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE))|| ((app_bt_device.hf_audio_state[BT_DEVICE_ID_2] == BTIF_HF_AUDIO_CON)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE))){ if(app_bt_device.hf_mute_flag == 0){ hfp_handle_key(HFP_KEY_MUTE); }else{ hfp_handle_key(HFP_KEY_CLEAR_MUTE); } } if((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN)){ /* A active && B incoming */ //hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_ANOTHER); TRACE(0,"!!!!1keep active and reject incoming\n"); btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_2]); } else if ((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN)){ /* B active && A incoming */ //hfp_handle_key(HFP_KEY_DUAL_HF_HANGUP_ANOTHER); TRACE(0,"!!!!2keep active and reject incoming\n"); btif_hf_hang_up_call(app_bt_device.hf_channel[BT_DEVICE_ID_1]); } else if ((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN)) { /* A 1-call active and 1-call incoming */ TRACE(0,"!!!!release incoming call hf_channel=0\n"); btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_1], BTIF_HF_HOLD_RELEASE_HELD_CALLS, 0); } else if ((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN)) { /* B 1-call active and 1-call incoming */ TRACE(0,"!!!!release incoming call hf_channel=1\n"); btif_hf_call_hold(app_bt_device.hf_channel[BT_DEVICE_ID_2], BTIF_HF_HOLD_RELEASE_HELD_CALLS, 0); } break; case APP_KEY_EVENT_TRIPLECLICK: TRACE(5,"!!!APP_KEY_EVENT_TRIPLECLICK callsetup %d %d call %d %d,phone_earphone_mark %d\n", app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1], app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2], app_bt_device.hfchan_call[BT_DEVICE_ID_1], app_bt_device.hfchan_call[BT_DEVICE_ID_2], app_bt_device.phone_earphone_mark); if(((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE))|| ((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE))){ if(app_bt_device.phone_earphone_mark == 0){ hfp_handle_key(HFP_KEY_CHANGE_TO_PHONE); }else if(app_bt_device.phone_earphone_mark == 1){ hfp_handle_key(HFP_KEY_ADD_TO_EARPHONE); } } break; case APP_KEY_EVENT_LONGPRESS: #ifdef SUPPORT_SIRI open_siri_flag=0; #endif //one bring two: long press switch sco TRACE(8,"!!!APP_KEY_EVENT_LONGPRESS callsetup %d %d call %d %d held %d %d audio_state %d %d\n", app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1], app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2], app_bt_device.hfchan_call[BT_DEVICE_ID_1], app_bt_device.hfchan_call[BT_DEVICE_ID_2], app_bt_device.hf_callheld[BT_DEVICE_ID_1], app_bt_device.hf_callheld[BT_DEVICE_ID_2], app_bt_device.hf_audio_state[BT_DEVICE_ID_1], app_bt_device.hf_audio_state[BT_DEVICE_ID_2]); TRACE(6,"app_bt_device.curr_hf_channel_id=%d, g_curr=%d curr=%d another:%d scoHciHandle:%x/%x", app_bt_device.curr_hf_channel_id,current_device_id, current_device_id, another_device_id, //app_bt_device.hf_channel[current_device_id].cmgrHandler.scoConnect->scoHciHandle //,app_bt_device.hf_channel[another_device_id].cmgrHandler.scoConnect->scoHciHandle); btif_hf_get_sco_hcihandle(app_bt_device.hf_channel[current_device_id]), btif_hf_get_sco_hcihandle(app_bt_device.hf_channel[another_device_id])); if((app_bt_device.hfchan_call[current_device_id] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_call[another_device_id] != BTIF_HF_CALL_ACTIVE) &&(app_bt_device.hfchan_callSetup[another_device_id] == BTIF_HF_CALL_SETUP_IN)){//A is active, B is incoming call TRACE(2,"HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER: current=%d, g_current_device_id=%d",app_bt_device.curr_hf_channel_id, current_device_id); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); //hfp_handle_key(HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER); //hold and answer //app_bt_device.curr_hf_channel_id = another_device_id; btif_hf_answer_call(app_bt_device.hf_channel[another_device_id]); btif_hf_call_hold(app_bt_device.hf_channel[current_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } else if ((app_bt_device.hfchan_call[another_device_id] == BTIF_HF_CALL_ACTIVE) && (app_bt_device.hfchan_call[current_device_id] != BTIF_HF_CALL_ACTIVE) && (app_bt_device.hfchan_callSetup[current_device_id] == BTIF_HF_CALL_SETUP_IN)) { TRACE(2,"HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER: current=%d, g_current_device_id=%d",app_bt_device.curr_hf_channel_id, current_device_id); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); btif_hf_answer_call(app_bt_device.hf_channel[current_device_id]); btif_hf_call_hold(app_bt_device.hf_channel[another_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } else if (app_bt_device.hfchan_call[current_device_id] == BTIF_HF_CALL_ACTIVE && app_bt_device.hf_callheld[current_device_id] == BTIF_HF_CALL_HELD_NONE && app_bt_device.hf_callheld[another_device_id] == BTIF_HF_CALL_HELD_NO_ACTIVE) { TRACE(0,"!!!!1switch hold call and active call\n"); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); btif_hf_call_hold(app_bt_device.hf_channel[current_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); btif_hf_call_hold(app_bt_device.hf_channel[another_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } else if (app_bt_device.hfchan_call[another_device_id] == BTIF_HF_CALL_ACTIVE && app_bt_device.hf_callheld[another_device_id] == BTIF_HF_CALL_HELD_NONE && app_bt_device.hf_callheld[current_device_id] == BTIF_HF_CALL_HELD_NO_ACTIVE) { TRACE(0,"!!!!2switch hold call and active call\n"); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); btif_hf_call_hold(app_bt_device.hf_channel[another_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); btif_hf_call_hold(app_bt_device.hf_channel[current_device_id], BTIF_HF_HOLD_HOLD_ACTIVE_CALLS, 0); } else if((app_bt_device.hfchan_call[current_device_id] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_call[another_device_id] == BTIF_HF_CALL_ACTIVE) &&(app_bt_device.hfchan_callSetup[current_device_id] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_callSetup[another_device_id] == BTIF_HF_CALL_SETUP_NONE)){//A is active, B is active TRACE(2,"AB is active: current=%d, g_current_device_id=%d",app_bt_device.curr_hf_channel_id, current_device_id); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); if (bt_get_sco_number()>1){ #ifdef __HF_KEEP_ONE_ALIVE__ bt_key_hf_channel_switch_active(current_device_id, another_device_id); #else app_audio_manager_sendrequest(APP_BT_STREAM_MANAGER_SWAP_SCO,BT_STREAM_SBC, another_device_id, 0); #endif app_bt_device.hf_voice_en[current_device_id] = HF_VOICE_DISABLE; app_bt_device.hf_voice_en[another_device_id] = HF_VOICE_ENABLE; app_bt_device.curr_hf_channel_id = another_device_id; }else{ bt_key_hf_channel_switch_start(); } } else if((app_bt_device.hfchan_call[current_device_id] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_call[another_device_id] == BTIF_HF_CALL_ACTIVE) &&((app_bt_device.hfchan_callSetup[current_device_id] == BTIF_HF_CALL_SETUP_IN)||(app_bt_device.hfchan_callSetup[another_device_id] == BTIF_HF_CALL_SETUP_IN))){ TRACE(2,"AB is active and incoming call: current=%d, g_current_device_id=%d",app_bt_device.curr_hf_channel_id, current_device_id); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); if (bt_get_sco_number()>1){ #ifdef __HF_KEEP_ONE_ALIVE__ bt_key_hf_channel_switch_active(current_device_id, another_device_id); #else app_audio_manager_sendrequest(APP_BT_STREAM_MANAGER_SWAP_SCO, BT_STREAM_SBC, another_device_id, 0); #endif app_bt_device.hf_voice_en[current_device_id] = HF_VOICE_DISABLE; app_bt_device.hf_voice_en[another_device_id] = HF_VOICE_ENABLE; app_bt_device.curr_hf_channel_id = another_device_id; }else{ bt_key_hf_channel_switch_start(); } } else if(((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE))|| ((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE))){ //three call TRACE(0,"three way call"); app_voice_report(APP_STATUS_INDICATION_WARNING, 0); hfp_handle_key(HFP_KEY_THREEWAY_HOLD_AND_ANSWER); #if 0 if(app_bt_device.phone_earphone_mark == 0){ hfp_handle_key(HFP_KEY_CHANGE_TO_PHONE); }else if(app_bt_device.phone_earphone_mark == 1){ hfp_handle_key(HFP_KEY_ADD_TO_EARPHONE); } #endif } else if(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE))|| ((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE))){ hfp_handle_key(HFP_KEY_HANGUP_CALL); } #ifdef BTIF_HID_DEVICE else if(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&( btif_get_hf_chan_state(app_bt_device.hf_channel[BT_DEVICE_ID_2])== BTIF_HF_STATE_CLOSED))|| ((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE))){ Hid_Send_capture(&app_bt_device.hid_channel[BT_DEVICE_ID_1]); } #endif #ifdef SUPPORT_SIRI else if((open_siri_flag == 0) && (((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(btif_get_hf_chan_state(app_bt_device.hf_channel[BT_DEVICE_ID_2]) == BTIF_HF_STATE_CLOSED))|| //(((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hf_channel[BT_DEVICE_ID_2].state == BTIF_HF_STATE_CLOSED))|| ((app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_NONE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_NONE)&&(app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_NONE)))){ app_voice_report(APP_STATUS_INDICATION_WARNING, 0); open_siri_flag = 1; } #endif #if 0 if((app_bt_device.hfchan_call[BT_DEVICE_ID_1] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_2] == BTIF_HF_CALL_SETUP_IN)){ hfp_handle_key(HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER); }else if((app_bt_device.hfchan_call[BT_DEVICE_ID_2] == BTIF_HF_CALL_ACTIVE)&&(app_bt_device.hfchan_callSetup[BT_DEVICE_ID_1] == BTIF_HF_CALL_SETUP_IN)){ hfp_handle_key(HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER); } #endif break; #endif /* __BT_ONE_BRING_TWO__ */ default: TRACE(1,"unregister func key event=%x",event); break; } } #endif void app_bt_volumeup() { app_audio_manager_ctrl_volume(APP_AUDIO_MANAGER_VOLUME_CTRL_UP, 0); } void app_bt_volumedown() { app_audio_manager_ctrl_volume(APP_AUDIO_MANAGER_VOLUME_CTRL_DOWN, 0); } #if defined(__APP_KEY_FN_STYLE_A__) void bt_key_handle_up_key(enum APP_KEY_EVENT_T event) { #if defined(APP_LINEIN_A2DP_SOURCE) || defined(APP_I2S_A2DP_SOURCE) struct nvrecord_env_t *nvrecord_env = NULL; #endif switch (event) { case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: app_bt_volumeup(); break; case APP_KEY_EVENT_LONGPRESS: a2dp_handleKey(AVRCP_KEY_FORWARD); break; #if defined(APP_LINEIN_A2DP_SOURCE) || defined(APP_I2S_A2DP_SOURCE) case APP_KEY_EVENT_DOUBLECLICK: // debug switch src mode nv_record_env_get(&nvrecord_env); if (app_bt_device.src_or_snk == BT_DEVICE_SRC) { nvrecord_env->src_snk_flag.src_snk_mode = BT_DEVICE_SNK; } else { nvrecord_env->src_snk_flag.src_snk_mode = BT_DEVICE_SRC; } nv_record_env_set(nvrecord_env); app_reset(); break; #endif default: TRACE(1, "unregister up key event=%x", event); break; } } void bt_key_handle_down_key(enum APP_KEY_EVENT_T event) { switch (event) { case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: app_bt_volumedown(); break; case APP_KEY_EVENT_LONGPRESS: a2dp_handleKey(AVRCP_KEY_BACKWARD); break; default: TRACE(1, "unregister down key event=%x", event); break; } } #else // #elif defined(__APP_KEY_FN_STYLE_B__) void bt_key_handle_up_key(enum APP_KEY_EVENT_T event) { TRACE(1, "%s", __func__); switch (event) { case APP_KEY_EVENT_REPEAT: app_bt_volumeup(); break; case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: a2dp_handleKey(AVRCP_KEY_FORWARD); break; default: TRACE(1, "unregister up key event=%x", event); break; } } void bt_key_handle_down_key(enum APP_KEY_EVENT_T event) { switch (event) { case APP_KEY_EVENT_REPEAT: app_bt_volumedown(); break; case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: a2dp_handleKey(AVRCP_KEY_BACKWARD); break; default: TRACE(1, "unregister down key event=%x", event); break; } } #endif #if defined(APP_LINEIN_A2DP_SOURCE) || defined(APP_I2S_A2DP_SOURCE) void bt_key_handle_source_func_key(enum APP_KEY_EVENT_T event) { TRACE(2, "%s,%d", __FUNCTION__, event); static bool onaudioloop = false; switch (event) { case APP_KEY_EVENT_UP: case APP_KEY_EVENT_CLICK: app_a2dp_source_find_sink(); break; case APP_KEY_EVENT_DOUBLECLICK: if (app_bt_device.a2dp_state[0] == 1) { onaudioloop = onaudioloop ? false : true; if (onaudioloop) { app_a2dp_start_stream(); } else { app_a2dp_suspend_stream(); } } break; case APP_KEY_EVENT_TRIPLECLICK: app_a2dp_start_stream(); break; default: TRACE(1, "unregister down key event=%x", event); break; } } #endif APP_KEY_STATUS bt_key; static void bt_update_key_event(uint32_t code, uint8_t event) { TRACE(3, "%s code:%d evt:%d", __func__, code, event); bt_key.code = code; bt_key.event = event; osapi_notify_evm(); } void bt_key_send(APP_KEY_STATUS *status) { uint32_t lock = int_lock(); bool isKeyBusy = false; if (0xff != bt_key.code) { isKeyBusy = true; } int_unlock(lock); if (!isKeyBusy) { app_bt_start_custom_function_in_bt_thread((uint32_t)status->code, (uint32_t)status->event, (uint32_t)bt_update_key_event); } } void bt_key_handle(void) { osapi_lock_stack(); if (bt_key.code != 0xff) { TRACE(3, "%s code:%d evt:%d", __func__, bt_key.code, bt_key.event); switch (bt_key.code) { case BTAPP_FUNC_KEY: #if defined(APP_LINEIN_A2DP_SOURCE) || defined(APP_I2S_A2DP_SOURCE) if (app_bt_device.src_or_snk == BT_DEVICE_SRC) { bt_key_handle_source_func_key((enum APP_KEY_EVENT_T)bt_key.event); } else #endif { bt_key_handle_func_key((enum APP_KEY_EVENT_T)bt_key.event); } break; case BTAPP_VOLUME_UP_KEY: bt_key_handle_up_key((enum APP_KEY_EVENT_T)bt_key.event); break; case BTAPP_VOLUME_DOWN_KEY: bt_key_handle_down_key((enum APP_KEY_EVENT_T)bt_key.event); break; #ifdef SUPPORT_SIRI case BTAPP_RELEASE_KEY: bt_key_handle_siri_key((enum APP_KEY_EVENT_T)bt_key.event); break; #endif default: TRACE(0, "bt_key_handle undefined key"); break; } bt_key.code = 0xff; } osapi_unlock_stack(); } void bt_key_init(void) { Besbt_hook_handler_set(BESBT_HOOK_USER_2, bt_key_handle); #ifdef __BT_ONE_BRING_TWO__ // bt_key_hf_channel_switch_init(); #endif bt_key.code = 0xff; bt_key.event = 0xff; }