pinebuds/services/bt_app/btapp.h

424 lines
14 KiB
C

/***************************************************************************
*
* 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.
*
****************************************************************************/
#ifndef __BTAPP_H__
#define __BTAPP_H__
#include "app_key.h"
#include "hfp_api.h"
#include "a2dp_api.h"
#include "app_a2dp_codecs.h"
#ifdef BTIF_HID_DEVICE
#include "app_bt_hid.h"
#endif
#if defined(__BTMAP_ENABLE__)
#include "map_api.h"
#endif
//#define __EARPHONE_STAY_BOTH_SCAN__
/* bt config */
#ifdef _SCO_BTPCM_CHANNEL_
#define SYNC_CONFIG_PATH (0<<8|1<<4|1<<0) /* all links use hci */
#else
#define SYNC_CONFIG_PATH (0<<8|0<<4|0<<0) /* all links use hci */
#endif
#define SYNC_CONFIG_MAX_BUFFER (0) /* (e)sco use Packet size */
#ifdef CVSD_BYPASS
#define SYNC_CONFIG_CVSD_BYPASS (1) /* use pcm over hci */
#else
#define SYNC_CONFIG_CVSD_BYPASS (0) /* use pcm over hci */
#endif
#define INQ_EXT_RSP_LEN 240
///a2dp app include
/* a2dp */
/* Default SBC codec configuration */
/* data type for the SBC Codec Information Element*/
/*****************************************************************************
** Constants
*****************************************************************************/
/* the length of the SBC Media Payload header. */
#define A2D_SBC_MPL_HDR_LEN 1
/* the LOSC of SBC media codec capabilitiy */
#define A2D_SBC_INFO_LEN 6
/* for Codec Specific Information Element */
#if defined(A2DP_SCALABLE_ON)
#define A2D_SCALABLE_IE_SAMP_FREQ_MSK 0xFF /* b7-b0 sampling frequency */
#endif
#if defined(A2DP_LHDC_ON)
#define A2D_LHDC__IE_SAMP_FREQ_MSK 0xFF /* b7-b0 sampling frequency */
#endif
#define A2D_STREAM_SAMP_FREQ_MSK 0xFF /* b7-b4 sampling frequency */
#define A2D_SBC_IE_SAMP_FREQ_MSK 0xF0 /* b7-b4 sampling frequency */
#define A2D_SBC_IE_SAMP_FREQ_16 0x80 /* b7:16 kHz */
#define A2D_SBC_IE_SAMP_FREQ_32 0x40 /* b6:32 kHz */
#define A2D_SBC_IE_SAMP_FREQ_44 0x20 /* b5:44.1kHz */
#define A2D_SBC_IE_SAMP_FREQ_48 0x10 /* b4:48 kHz */
#ifdef A2DP_SCALABLE_ON
#define A2D_SBC_IE_SAMP_FREQ_96 0x08 /* b4:96 kHz */
#endif
#ifdef A2DP_LHDC_ON
#ifndef A2D_SBC_IE_SAMP_FREQ_96
#define A2D_SBC_IE_SAMP_FREQ_96 0x08 /* b4:96 kHz */
#endif
#endif
#ifdef A2DP_LDAC_ON
#ifndef A2DP_LDAC_OCTET_NUMBER
#define A2DP_LDAC_OCTET_NUMBER (8)
#endif
#ifndef A2D_SBC_IE_SAMP_FREQ_96
#define A2D_SBC_IE_SAMP_FREQ_96 0x08 /* b4:96 kHz */
#endif
#ifndef A2D_SBC_IE_SAMP_FREQ_88
#define A2D_SBC_IE_SAMP_FREQ_88 0x04 /* b4:88.2 kHz */
#endif
#endif
#define A2D_SBC_IE_BIT_NUM_16 0x16
#define A2D_SBC_IE_BIT_NUM_24 0x24
#define A2D_SBC_IE_CH_MD_MSK 0x0F /* b3-b0 channel mode */
#define A2D_SBC_IE_CH_MD_MONO 0x08 /* b3: mono */
#define A2D_SBC_IE_CH_MD_DUAL 0x04 /* b2: dual */
#define A2D_SBC_IE_CH_MD_STEREO 0x02 /* b1: stereo */
#define A2D_SBC_IE_CH_MD_JOINT 0x01 /* b0: joint stereo */
#define A2D_SBC_IE_BLOCKS_MSK 0xF0 /* b7-b4 number of blocks */
#define A2D_SBC_IE_BLOCKS_4 0x80 /* 4 blocks */
#define A2D_SBC_IE_BLOCKS_8 0x40 /* 8 blocks */
#define A2D_SBC_IE_BLOCKS_12 0x20 /* 12blocks */
#define A2D_SBC_IE_BLOCKS_16 0x10 /* 16blocks */
#define A2D_SBC_IE_SUBBAND_MSK 0x0C /* b3-b2 number of subbands */
#define A2D_SBC_IE_SUBBAND_4 0x08 /* b3: 4 */
#define A2D_SBC_IE_SUBBAND_8 0x04 /* b2: 8 */
#define A2D_SBC_IE_ALLOC_MD_MSK 0x03 /* b1-b0 allocation mode */
#define A2D_SBC_IE_ALLOC_MD_S 0x02 /* b1: SNR */
#define A2D_SBC_IE_ALLOC_MD_L 0x01 /* b0: loundess */
#define A2D_SBC_IE_MIN_BITPOOL 2
#define A2D_SBC_IE_MAX_BITPOOL 250
#ifdef __cplusplus
extern "C" {
#endif
//extern A2dpStream a2dp_stream;
//extern btif_avdtp_codec_t a2dp_avdtpcodec;
extern const unsigned char a2dp_codec_elements[];
//extern enum AUD_SAMPRATE_T a2dp_sample_rate;
//#define AVRCP_TRACK_CHANGED
#define AVRCP_KEY_NULL 0
#define AVRCP_KEY_STOP 1
#define AVRCP_KEY_PLAY 2
#define AVRCP_KEY_PAUSE 3
#define AVRCP_KEY_FORWARD 4
#define AVRCP_KEY_BACKWARD 5
#define AVRCP_KEY_VOLUME_UP 6
#define AVRCP_KEY_VOLUME_DOWN 7
#define HFP_KEY_ANSWER_CALL 8
#define HFP_KEY_HANGUP_CALL 9
#define HFP_KEY_REDIAL_LAST_CALL 10
#define HFP_KEY_CHANGE_TO_PHONE 11
#define HFP_KEY_ADD_TO_EARPHONE 12
#define HFP_KEY_MUTE 13
#define HFP_KEY_CLEAR_MUTE 14
//3way calls oper
#define HFP_KEY_THREEWAY_HOLD_AND_ANSWER 15
#define HFP_KEY_THREEWAY_HANGUP_AND_ANSWER 16
#define HFP_KEY_THREEWAY_HOLD_REL_INCOMING 17
#define HFP_KEY_THREEWAY_HOLD_ADD_HELD_CALL 18
#ifdef __BT_ONE_BRING_TWO__
#define HFP_KEY_DUAL_HF_HANGUP_ANOTHER 19
#define HFP_KEY_DUAL_HF_HANGUP_CURR_ANSWER_ANOTHER 20
#define HFP_KEY_DUAL_HF_HOLD_CURR_ANSWER_ANOTHER 21
#define HFP_KEY_DUAL_HF_CHANGETOPHONE_ANSWER_ANOTHER 22
#define HFP_KEY_DUAL_HF_CHANGETOPHONE_ANOTHER_ADDTOEARPHONE 23
#define HFP_KEY_DUAL_HF_HANGUP_ANOTHER_ADDTOEARPHONE 24
#endif
//hsp
#define HSP_KEY_CKPD_CONTROL 21
#define HSP_KEY_ADD_TO_EARPHONE 22
#define HSP_KEY_CHANGE_TO_PHONE 23
typedef enum
{
HFCALL_MACHINE_CURRENT_IDLE = 0, //0
HFCALL_MACHINE_CURRENT_INCOMMING, //1
HFCALL_MACHINE_CURRENT_OUTGOING, //2
HFCALL_MACHINE_CURRENT_CALLING, //3
HFCALL_MACHINE_CURRENT_3WAY_INCOMMING, //4
HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING, //5
HFCALL_MACHINE_CURRENT_IDLE_ANOTHER_IDLE, //6
HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_IDLE, //7
HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_IDLE, //8
HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_IDLE, //9
HFCALL_MACHINE_CURRENT_3WAY_INCOMMING_ANOTHER_IDLE, //10
HFCALL_MACHINE_CURRENT_3WAY_HOLD_CALLING_ANOTHER_IDLE, //11
HFCALL_MACHINE_CURRENT_INCOMMING_ANOTHER_INCOMMING, //12
HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_INCOMMING, //13
HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_CHANGETOPHONE, //14
HFCALL_MACHINE_CURRENT_OUTGOING_ANOTHER_INCOMMING, //15
HFCALL_MACHINE_CURRENT_CALLING_ANOTHER_HOLD, //16
HFCALL_MACHINE_NUM
} HFCALL_MACHINE_ENUM;
typedef enum
{
HFCALL_NEXT_STA_NULL = 0, //0
HFCALL_NEXT_STA_ANOTHER_ANSWER, //1
HFCALL_NEXT_STA_ANOTHER_ADDTOEARPHONE, //2
HFCALL_NEXT_STA_NUM
} HFCALL_NEXT_STA_ENUM;
#if defined (__HSP_ENABLE__)
void hsp_callback(HsChannel *Chan, HsCallbackParms *Info);
#endif
#define APP_REPORT_SPEAKER_VOL_CMD 0x01
#define APP_CPKD_CMD 0x02
#define SPP_MAX_TX_PACKET_NUM 5
#define AVRCP_PDU_PARAM_MAX_LEN 40
enum BT_DEVICE_ID_T{
BT_DEVICE_ID_1 = 0,
#ifdef __BT_ONE_BRING_TWO__
BT_DEVICE_ID_2,
#endif
BT_DEVICE_NUM
};
#if defined(APP_LINEIN_A2DP_SOURCE)||defined(APP_I2S_A2DP_SOURCE)
enum BT_DEVICE_SRC_SNK_T{
BT_DEVICE_SNK=0,
BT_DEVICE_SRC
};
#if defined(APP_LINEIN_A2DP_SOURCE)||defined(APP_I2S_A2DP_SOURCE)
#define APP_BD_ADDR_SIZE 6
typedef struct APP_BT_BD_ADDR {
U8 addr[APP_BD_ADDR_SIZE];
} APP_BT_BD_ADDR;
#endif
#endif
struct BT_DEVICE_T{
btif_a2dp_stream_t* a2dp_stream[BT_DEVICE_NUM];
uint8_t avdtp_cp[BT_DEVICE_NUM];
btif_a2dp_stream_t* a2dp_lhdc_stream[BT_DEVICE_NUM];
uint8_t a2dp_lhdc_llc[BT_DEVICE_NUM];
btif_a2dp_stream_t* a2dp_ldac_stream[BT_DEVICE_NUM];
int channel_mode;
btif_a2dp_stream_t* a2dp_aac_stream[BT_DEVICE_NUM];
btif_a2dp_stream_t* a2dp_scalable_stream[BT_DEVICE_NUM];
#if defined(APP_LINEIN_A2DP_SOURCE)||defined(APP_I2S_A2DP_SOURCE)
uint8_t src_or_snk;//src or snk fkag
uint8_t input_onoff;
APP_BT_BD_ADDR inquried_snk_bdAddr; /* Device Address */
//BT_BD_ADDR rmt_bdAddr; /* Device Address */
#endif
a2dp_stream_t * a2dp_connected_stream[BT_DEVICE_NUM];
a2dp_stream_t * a2dp_outconfiged_stream[BT_DEVICE_NUM];
btif_remote_device_t * a2dp_outconfiged_rem[BT_DEVICE_NUM];
enum BT_DEVICE_ID_T curr_a2dp_stream_id;
uint16_t current_a2dp_conhdl;
uint8_t a2dp_state[BT_DEVICE_NUM];
uint8_t a2dp_streamming[BT_DEVICE_NUM];
uint8_t a2dp_play_pause_flag;
uint8_t avrcpPendingKey;
uint8_t latestPausedDevId;
uint8_t avrcpPressedKey;
uint8_t avrcpVolumeSync;
btif_avdtp_codec_type_t codec_type[BT_DEVICE_NUM];
uint8_t sample_rate[BT_DEVICE_NUM];
uint8_t sample_bit[BT_DEVICE_NUM];
uint8_t avrcp_state[BT_DEVICE_NUM];
btif_avrcp_channel_t* avrcp_channel[BT_DEVICE_NUM];
hf_chan_handle_t hf_channel[BT_DEVICE_NUM];
#if defined (__HSP_ENABLE__)
HsChannel hs_channel[BT_DEVICE_NUM];
#endif
#if defined (__BTMAP_ENABLE__)
btif_map_session_handle_t map_session_handle[BT_DEVICE_NUM];
#endif
enum BT_DEVICE_ID_T curr_hf_channel_id;
btif_hf_call_setup_t hfchan_callSetup[BT_DEVICE_NUM];
btif_hf_call_active_t hfchan_call[BT_DEVICE_NUM];
btif_audio_state_t hf_audio_state[BT_DEVICE_NUM];
btif_hf_call_held_state hf_callheld[BT_DEVICE_NUM];
uint32_t hf_callsetup_time[BT_DEVICE_NUM];
#if defined (__HSP_ENABLE__)
enum BT_DEVICE_ID_T curr_hs_channel_id;
HsCallActiveState hschan_call[BT_DEVICE_NUM];
HsAudioConnectState hs_audio_state[BT_DEVICE_NUM];
#endif
#ifdef BTIF_AVRCP_ADVANCED_CONTROLLER
uint32_t avrcp_advancedPdu_size;
void *avrcp_cmd1[BT_DEVICE_NUM];
void *avrcp_cmd2[BT_DEVICE_NUM];
void *avrcp_get_capabilities_rsp[BT_DEVICE_NUM];
void *avrcp_control_rsp[BT_DEVICE_NUM];
void *avrcp_notify_rsp[BT_DEVICE_NUM];
uint8_t volume_report[BT_DEVICE_NUM];
void *avrcp_volume_cmd[BT_DEVICE_NUM];
void *avrcp_custom_cmd[BT_DEVICE_NUM];
#ifdef AVRCP_TRACK_CHANGED
uint8_t track_changed[BT_DEVICE_NUM];
#endif
#endif
uint8_t hf_conn_flag[BT_DEVICE_NUM];
uint8_t hf_voice_en[BT_DEVICE_NUM];
uint8_t hf_endcall_dis[BT_DEVICE_NUM];
uint8_t hf_mute_flag;
uint8_t phone_earphone_mark;
#if defined (__HSP_ENABLE__)
uint8_t hs_conn_flag[BT_DEVICE_NUM];
uint8_t hs_voice_en[BT_DEVICE_NUM];
uint8_t hs_mute_flag;
#endif
#ifdef BTIF_HID_DEVICE
hid_channel_t hid_channel[BT_DEVICE_NUM];
#endif
uint8_t callSetupBitRec;
};
struct BT_DEVICE_ID_DIFF{
enum BT_DEVICE_ID_T id;
#ifdef __BT_ONE_BRING_TWO__
enum BT_DEVICE_ID_T id_other;
#endif
};
/////app key handle include
void a2dp_handleKey(uint8_t a2dp_key);
void hfp_handle_key(uint8_t hfp_key);
void hsp_handle_key(uint8_t hsp_key);
void btapp_a2dp_report_speak_gain(void);
#ifdef __POWERKEY_CTRL_ONOFF_ONLY__
#define BTAPP_FUNC_KEY APP_KEY_CODE_FN1
#define BTAPP_VOLUME_UP_KEY APP_KEY_CODE_FN2
#define BTAPP_VOLUME_DOWN_KEY APP_KEY_CODE_FN3
#ifdef SUPPORT_SIRI
#define BTAPP_RELEASE_KEY APP_KEY_CODE_NONE
#endif
#else
#define BTAPP_FUNC_KEY APP_KEY_CODE_PWR
#define BTAPP_VOLUME_UP_KEY APP_KEY_CODE_FN1
#define BTAPP_VOLUME_DOWN_KEY APP_KEY_CODE_FN2
#ifdef SUPPORT_SIRI
#define BTAPP_RELEASE_KEY APP_KEY_CODE_NONE
#endif
#endif
void bt_key_init(void);
void bt_key_send(APP_KEY_STATUS *status);
void bt_key_handle(void);
void a2dp_callback(a2dp_stream_t *Stream, const a2dp_callback_parms_t *Info);
void avrcp_init(void);
//void avrcp_callback(AvrcpChannel *chnl, const AvrcpCallbackParms *Parms);
void avrcp_callback_CT(btif_avrcp_chnl_handle_t chnl, const avrcp_callback_parms_t *Parms);
void avrcp_callback_TG(btif_avrcp_chnl_handle_t chnl, const avrcp_callback_parms_t *Parms);
int a2dp_volume_get(enum BT_DEVICE_ID_T id);
int a2dp_volume_get_tws(void);
bool avrcp_get_tg_play_status_play_pause(void);
#if defined(APP_LINEIN_A2DP_SOURCE)||defined(APP_I2S_A2DP_SOURCE) || defined(__APP_A2DP_SOURCE__)
#ifdef __TWS__
//void avrcp_set_slave_volume(uint8_t transid,int8_t volume);
#endif
//#define AVRCP_TRACK_CHANGED
void a2dp_set_config_codec(btif_avdtp_codec_t *config_codec,const btif_a2dp_callback_parms_t *Info);
void a2dp_callback_source(a2dp_stream_t *Stream, const a2dp_callback_parms_t *Info);
void app_a2dp_source_init(void);
void app_source_init(void);
void app_a2dp_source_find_sink(void);
void avrcp_source_callback_TG(btif_avrcp_chnl_handle_t chnl, const avrcp_callback_parms_t *Parms);
void app_a2dp_start_stream(void);
void app_a2dp_suspend_stream(void);
#endif
/**
* Convert BES BD_ADDR to virtual
* BES Device ID
*/
bool a2dp_id_from_bdaddr(bt_bdaddr_t *bd_addr, uint8_t *id);
void bt_key_handle_func_click();
void bt_key_handle_func_doubleclick();
void bt_key_handle_func_longpress();
void bt_sbc_player_set_codec_type(uint8_t type);
uint8_t bt_sbc_player_get_codec_type(void);
uint8_t bt_sbc_player_get_sample_bit(void);
#if defined(A2DP_LDAC_ON)
int bt_ldac_player_get_channelmode(void);
int bt_get_ladc_sample_rate(void);
#endif
uint8_t app_bt_avrcp_get_notify_trans_id(void);
void app_bt_avrcp_set_notify_trans_id(uint8_t trans_id);
uint8_t app_bt_avrcp_get_ctl_trans_id(void);
void app_bt_avrcp_set_ctl_trans_id(uint8_t trans_id);
#if defined(IBRT)
#if defined(ENHANCED_STACK)
uint32_t app_avrcp_save_ctxs(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
uint32_t app_avrcp_restore_ctxs(btif_remote_device_t *rem_dev, uint8_t *buf, uint32_t buf_len);
#endif /* ENHANCED_STACK */
#endif
#ifdef __cplusplus
}
#endif
#endif /* __BTAPP_H__ */