component/bt: bug fix for hci data packet reassembler

1. bugfix for hci data packet reassembler
2. create new file btif_avk.c originated from btif_av.c to eliminate the avrc related logic
This commit is contained in:
wangmengyang 2016-11-15 14:32:22 +08:00
parent 7b659b2741
commit ea75dc7064
11 changed files with 1532 additions and 168 deletions

View File

@ -368,7 +368,7 @@ static tBTA_AV_SCB * bta_av_alloc_scb(tBTA_AV_CHNL chnl)
} }
else if(chnl != BTA_AV_CHNL_AUDIO) else if(chnl != BTA_AV_CHNL_AUDIO)
{ {
APPL_TRACE_ERROR("bad channel: %d", chnl); APPL_TRACE_ERROR("bad channel: %d\n", chnl);
sts = BTA_AV_FAIL; sts = BTA_AV_FAIL;
} }
@ -438,7 +438,7 @@ void bta_av_conn_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
else if (AVDT_CONNECT_IND_EVT == event) else if (AVDT_CONNECT_IND_EVT == event)
{ {
APPL_TRACE_DEBUG("CONN_IND is ACP:%d", p_data->hdr.err_param); APPL_TRACE_DEBUG("CONN_IND is ACP:%d\n", p_data->hdr.err_param);
} }
#endif #endif
@ -456,10 +456,10 @@ void bta_av_conn_cback(UINT8 handle, BD_ADDR bd_addr, UINT8 event, tAVDT_CTRL *p
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
if(p_scb) if(p_scb)
{ {
APPL_TRACE_DEBUG("scb hndl x%x, role x%x", p_scb->hndl, p_scb->role); APPL_TRACE_DEBUG("scb hndl x%x, role x%x\n", p_scb->hndl, p_scb->role);
} }
#endif #endif
APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x", APPL_TRACE_DEBUG("conn_cback bd_addr:%02x-%02x-%02x-%02x-%02x-%02x\n",
bd_addr[0], bd_addr[1], bd_addr[0], bd_addr[1],
bd_addr[2], bd_addr[3], bd_addr[2], bd_addr[3],
bd_addr[4], bd_addr[5]); bd_addr[4], bd_addr[5]);
@ -505,7 +505,7 @@ static void bta_av_api_sink_enable(tBTA_AV_DATA *p_data)
{ {
UINT16 activate_sink = 0; UINT16 activate_sink = 0;
activate_sink = p_data->hdr.layer_specific; activate_sink = p_data->hdr.layer_specific;
APPL_TRACE_DEBUG("bta_av_api_sink_enable %d ", activate_sink) APPL_TRACE_DEBUG("bta_av_api_sink_enable %d \n", activate_sink)
char p_service_name[BTA_SERVICE_NAME_LEN+1]; char p_service_name[BTA_SERVICE_NAME_LEN+1];
BCM_STRNCPY_S(p_service_name, sizeof(p_service_name), BCM_STRNCPY_S(p_service_name, sizeof(p_service_name),
BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN); BTIF_AVK_SERVICE_NAME, BTA_SERVICE_NAME_LEN);
@ -605,7 +605,7 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
(UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV); (UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV);
#endif #endif
bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target", NULL, bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target\n", NULL,
p_bta_av_cfg->avrc_tg_cat, BTA_ID_AV); p_bta_av_cfg->avrc_tg_cat, BTA_ID_AV);
#endif #endif
} }
@ -631,7 +631,7 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
*/ */
cs.nsc_mask = AVDT_NSC_RECONFIG | cs.nsc_mask = AVDT_NSC_RECONFIG |
((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY); ((bta_av_cb.features & BTA_AV_FEAT_PROTECT) ? 0 : AVDT_NSC_SECURITY);
APPL_TRACE_DEBUG("nsc_mask: 0x%x", cs.nsc_mask); APPL_TRACE_DEBUG("nsc_mask: 0x%x\n", cs.nsc_mask);
if (p_data->api_reg.p_service_name[0] == 0) if (p_data->api_reg.p_service_name[0] == 0)
{ {
@ -683,7 +683,7 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
cs.tsep = AVDT_TSEP_SNK; cs.tsep = AVDT_TSEP_SNK;
cs.p_data_cback = bta_av_stream_data_cback; cs.p_data_cback = bta_av_stream_data_cback;
} }
APPL_TRACE_DEBUG(" SEP Type = %d",cs.tsep); APPL_TRACE_DEBUG(" SEP Type = %d\n",cs.tsep);
#endif #endif
if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS) if(AVDT_CreateStream(&p_scb->seps[index].av_handle, &cs) == AVDT_SUCCESS)
{ {
@ -697,7 +697,7 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */ p_scb->seps[index].p_app_data_cback = NULL; /* In case of A2DP SOURCE we don't need a callback to handle media packets */
#endif #endif
APPL_TRACE_DEBUG("audio[%d] av_handle: %d codec_type: %d", APPL_TRACE_DEBUG("audio[%d] av_handle: %d codec_type: %d\n",
index, p_scb->seps[index].av_handle, p_scb->seps[index].codec_type); index, p_scb->seps[index].av_handle, p_scb->seps[index].codec_type);
index++; index++;
} }
@ -747,7 +747,7 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
} }
} }
bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi); bta_av_cb.reg_audio |= BTA_AV_HNDL_TO_MSK(p_scb->hdi);
APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio); APPL_TRACE_DEBUG("reg_audio: 0x%x\n",bta_av_cb.reg_audio);
} }
else else
{ {
@ -911,7 +911,7 @@ void bta_av_restore_switch (void)
int i; int i;
UINT8 mask; UINT8 mask;
APPL_TRACE_DEBUG("reg_audio: 0x%x",bta_av_cb.reg_audio); APPL_TRACE_DEBUG("reg_audio: 0x%x\n",bta_av_cb.reg_audio);
for(i=0; i<BTA_AV_NUM_STRS; i++) for(i=0; i<BTA_AV_NUM_STRS; i++)
{ {
mask = BTA_AV_HNDL_TO_MSK(i); mask = BTA_AV_HNDL_TO_MSK(i);
@ -944,7 +944,7 @@ static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app
UINT8 peer_idx = 0; UINT8 peer_idx = 0;
UNUSED(status); UNUSED(status);
APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d", bta_av_cb.rs_idx); APPL_TRACE_DEBUG("bta_av_sys_rs_cback: %d\n", bta_av_cb.rs_idx);
for(i=0; i<BTA_AV_NUM_STRS; i++) for(i=0; i<BTA_AV_NUM_STRS; i++)
{ {
/* loop through all the SCBs to find matching peer addresses and report the role change event */ /* loop through all the SCBs to find matching peer addresses and report the role change event */
@ -953,7 +953,7 @@ static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app
if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0) && if (p_scb && (bdcmp (peer_addr, p_scb->peer_addr) == 0) &&
(p_buf = (tBTA_AV_ROLE_RES *) GKI_getbuf(sizeof(tBTA_AV_ROLE_RES))) != NULL) (p_buf = (tBTA_AV_ROLE_RES *) GKI_getbuf(sizeof(tBTA_AV_ROLE_RES))) != NULL)
{ {
APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x", id, app_id, p_scb->hndl); APPL_TRACE_DEBUG("new_role:%d, hci_status:x%x hndl: x%x\n", id, app_id, p_scb->hndl);
/* /*
if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS)) if ((id != BTM_ROLE_MASTER) && (app_id != HCI_SUCCESS))
{ {
@ -988,7 +988,7 @@ static void bta_av_sys_rs_cback (tBTA_SYS_CONN_STATUS status,UINT8 id, UINT8 app
} }
if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN) if (p_scb && p_scb->q_tag == BTA_AV_Q_TAG_OPEN)
{ {
APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d", APPL_TRACE_DEBUG ("bta_av_sys_rs_cback: rs_idx(%d), hndl:x%x q_tag: %d\n",
bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag); bta_av_cb.rs_idx, p_scb->hndl, p_scb->q_tag);
if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id) if(HCI_SUCCESS == app_id || HCI_ERR_NO_CONNECTION == app_id)
@ -1024,7 +1024,7 @@ static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
UNUSED(app_id); UNUSED(app_id);
UNUSED(peer_addr); UNUSED(peer_addr);
APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d", id, status); APPL_TRACE_DEBUG("bta_av_sco_chg_cback:%d status:%d\n", id, status);
if(id) if(id)
{ {
bta_av_cb.sco_occupied = TRUE; bta_av_cb.sco_occupied = TRUE;
@ -1036,7 +1036,7 @@ static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE)) if( p_scb && p_scb->co_started && (p_scb->sco_suspend == FALSE))
{ {
APPL_TRACE_DEBUG("suspending scb:%d", i); APPL_TRACE_DEBUG("suspending scb:%d\n", i);
/* scb is used and started, not suspended automatically */ /* scb is used and started, not suspended automatically */
p_scb->sco_suspend = TRUE; p_scb->sco_suspend = TRUE;
stop.flush = FALSE; stop.flush = FALSE;
@ -1055,7 +1055,7 @@ static void bta_av_sco_chg_cback(tBTA_SYS_CONN_STATUS status, UINT8 id, UINT8
if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */ if( p_scb && p_scb->sco_suspend ) /* scb is used and suspended for SCO */
{ {
APPL_TRACE_DEBUG("starting scb:%d", i); APPL_TRACE_DEBUG("starting scb:%d\n", i);
bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL); bta_av_ssm_execute(p_scb, BTA_AV_AP_START_EVT, NULL);
} }
} }
@ -1128,7 +1128,7 @@ BOOLEAN bta_av_link_role_ok(tBTA_AV_SCB *p_scb, UINT8 bits)
if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS) if (BTM_GetRole(p_scb->peer_addr, &role) == BTM_SUCCESS)
{ {
LOG_INFO("%s hndl:x%x role:%d conn_audio:x%x bits:%d features:x%x", LOG_INFO("%s hndl:x%x role:%d conn_audio:x%x bits:%d features:x%x\n",
__func__, p_scb->hndl, role, bta_av_cb.conn_audio, bits, __func__, p_scb->hndl, role, bta_av_cb.conn_audio, bits,
bta_av_cb.features); bta_av_cb.features);
if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER))) if (BTM_ROLE_MASTER != role && (A2D_BitsSet(bta_av_cb.conn_audio) > bits || (bta_av_cb.features & BTA_AV_FEAT_MASTER)))
@ -1179,7 +1179,7 @@ UINT16 bta_av_chk_mtu(tBTA_AV_SCB *p_scb, UINT16 mtu)
if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) ) if((p_scb != p_scbi) && p_scbi && (p_scbi->chnl == BTA_AV_CHNL_AUDIO) )
{ {
mask = BTA_AV_HNDL_TO_MSK(i); mask = BTA_AV_HNDL_TO_MSK(i);
APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x", APPL_TRACE_DEBUG("[%d] mtu: %d, mask:0x%x\n",
i, p_scbi->stream_mtu, mask); i, p_scbi->stream_mtu, mask);
if(bta_av_cb.conn_audio & mask) if(bta_av_cb.conn_audio & mask)
{ {
@ -1189,7 +1189,7 @@ UINT16 bta_av_chk_mtu(tBTA_AV_SCB *p_scb, UINT16 mtu)
} }
} }
} }
APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d", APPL_TRACE_DEBUG("bta_av_chk_mtu audio count:%d, conn_audio:0x%x, ret:%d\n",
bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu); bta_av_cb.audio_open_cnt, bta_av_cb.conn_audio, ret_mtu);
} }
return ret_mtu; return ret_mtu;
@ -1262,10 +1262,10 @@ void bta_av_sm_execute(tBTA_AV_CB *p_cb, UINT16 event, tBTA_AV_DATA *p_data)
UINT8 action; UINT8 action;
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)", APPL_TRACE_EVENT("AV event=0x%x(%s) state=%d(%s)\n",
event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state)); event, bta_av_evt_code(event), p_cb->state, bta_av_st_code(p_cb->state));
#else #else
APPL_TRACE_EVENT("AV event=0x%x state=%d", event, p_cb->state); APPL_TRACE_EVENT("AV event=0x%x state=%d\n", event, p_cb->state);
#endif #endif
/* look up the state table for the current state */ /* look up the state table for the current state */
@ -1275,7 +1275,7 @@ void bta_av_sm_execute(tBTA_AV_CB *p_cb, UINT16 event, tBTA_AV_DATA *p_data)
/* set next state */ /* set next state */
p_cb->state = state_table[event][BTA_AV_NEXT_STATE]; p_cb->state = state_table[event][BTA_AV_NEXT_STATE];
APPL_TRACE_EVENT("next state=%d", p_cb->state); APPL_TRACE_EVENT("next state=%d\n", p_cb->state);
/* execute action functions */ /* execute action functions */
if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE) if ((action = state_table[event][BTA_AV_ACTION_COL]) != BTA_AV_IGNORE)
@ -1308,9 +1308,9 @@ BOOLEAN bta_av_hdl_event(BT_HDR *p_msg)
if(event >= first_event) if(event >= first_event)
{ {
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)", event, bta_av_evt_code(event)); APPL_TRACE_VERBOSE("AV nsm event=0x%x(%s)\n", event, bta_av_evt_code(event));
#else #else
APPL_TRACE_VERBOSE("AV nsm event=0x%x", event); APPL_TRACE_VERBOSE("AV nsm event=0x%x\n", event);
#endif #endif
/* non state machine events */ /* non state machine events */
(*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg); (*bta_av_nsm_act[event - BTA_AV_FIRST_NSM_EVT]) ((tBTA_AV_DATA *) p_msg);
@ -1318,16 +1318,16 @@ BOOLEAN bta_av_hdl_event(BT_HDR *p_msg)
else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT) else if (event >= BTA_AV_FIRST_SM_EVT && event <= BTA_AV_LAST_SM_EVT)
{ {
#if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE) #if (defined(BTA_AV_DEBUG) && BTA_AV_DEBUG == TRUE)
APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)", event, bta_av_evt_code(event)); APPL_TRACE_VERBOSE("AV sm event=0x%x(%s)\n", event, bta_av_evt_code(event));
#else #else
APPL_TRACE_VERBOSE("AV sm event=0x%x", event); APPL_TRACE_VERBOSE("AV sm event=0x%x\n", event);
#endif #endif
/* state machine events */ /* state machine events */
bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg); bta_av_sm_execute(&bta_av_cb, p_msg->event, (tBTA_AV_DATA *) p_msg);
} }
else else
{ {
APPL_TRACE_VERBOSE("handle=0x%x", p_msg->layer_specific); APPL_TRACE_VERBOSE("handle=0x%x\n", p_msg->layer_specific);
/* stream state machine events */ /* stream state machine events */
bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific), bta_av_ssm_execute( bta_av_hndl_to_scb(p_msg->layer_specific),
p_msg->event, (tBTA_AV_DATA *) p_msg); p_msg->event, (tBTA_AV_DATA *) p_msg);

View File

@ -161,7 +161,8 @@ static void reassemble_and_dispatch(BT_HDR *packet) {
partial_packet->len = full_length; partial_packet->len = full_length;
partial_packet->offset = packet->len; partial_packet->offset = packet->len;
memcpy(partial_packet->data, packet->data, packet->len); // org: memcpy(partial_packet->data, packet->data, packet->len);
memcpy(partial_packet->data, packet->data+packet->offset, packet->len);
// Update the ACL data size to indicate the full expected length // Update the ACL data size to indicate the full expected length
stream = partial_packet->data; stream = partial_packet->data;
@ -179,7 +180,10 @@ static void reassemble_and_dispatch(BT_HDR *packet) {
return; return;
} }
packet->offset = HCI_ACL_PREAMBLE_SIZE; // org: packet->offset = HCI_ACL_PREAMBLE_SIZE;
packet->offset += HCI_ACL_PREAMBLE_SIZE; // skip ACL preamble
packet->len -= HCI_ACL_PREAMBLE_SIZE;
projected_offset = partial_packet->offset + (packet->len - HCI_ACL_PREAMBLE_SIZE); projected_offset = partial_packet->offset + (packet->len - HCI_ACL_PREAMBLE_SIZE);
if (projected_offset > partial_packet->len) { // len stores the expected length if (projected_offset > partial_packet->len) { // len stores the expected length
LOG_WARN("%s got packet which would exceed expected length of %d. Truncating.", __func__, partial_packet->len); LOG_WARN("%s got packet which would exceed expected length of %d. Truncating.", __func__, partial_packet->len);
@ -190,7 +194,8 @@ static void reassemble_and_dispatch(BT_HDR *packet) {
memcpy( memcpy(
partial_packet->data + partial_packet->offset, partial_packet->data + partial_packet->offset,
packet->data + packet->offset, packet->data + packet->offset,
packet->len - packet->offset // org: packet->len - packet->offset
packet->len
); );
// Free the old packet buffer, since we don't need it anymore // Free the old packet buffer, since we don't need it anymore

View File

@ -573,7 +573,7 @@
/* The IO capability of the local device (for Simple Pairing) */ /* The IO capability of the local device (for Simple Pairing) */
#ifndef BTM_LOCAL_IO_CAPS #ifndef BTM_LOCAL_IO_CAPS
#define BTM_LOCAL_IO_CAPS BTM_IO_CAP_IO #define BTM_LOCAL_IO_CAPS BTM_IO_CAP_NONE
#endif #endif
#ifndef BTM_LOCAL_IO_CAPS_BLE #ifndef BTM_LOCAL_IO_CAPS_BLE
@ -1593,7 +1593,7 @@ Range: 2 octets
** **
******************************************************************************/ ******************************************************************************/
#ifndef AVRC_INCLUDED #ifndef AVRC_INCLUDED
#define AVRC_INCLUDED FALSE #define AVRC_INCLUDED TRUE
#endif #endif
#ifndef AVRC_METADATA_INCLUDED #ifndef AVRC_METADATA_INCLUDED

View File

@ -12,6 +12,7 @@
*******************************************************************************/ *******************************************************************************/
void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task) void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task)
{ {
(void) high_task;
return; return;
} }
@ -28,5 +29,6 @@ void raise_priority_a2dp(tHIGH_PRIORITY_TASK high_task)
*******************************************************************************/ *******************************************************************************/
void adjust_priority_a2dp(int start) void adjust_priority_a2dp(int start)
{ {
(void) start;
return; return;
} }

View File

@ -31,6 +31,7 @@ COMPONENT_ADD_INCLUDEDIRS := bluedroid/bta/include \
bluedroid/stack/avdt/include \ bluedroid/stack/avdt/include \
bluedroid/stack/a2dp/include \ bluedroid/stack/a2dp/include \
bluedroid/stack/include \ bluedroid/stack/include \
bluedroid/utils/include \
bluedroid/api/include \ bluedroid/api/include \
bluedroid/include \ bluedroid/include \
include include
@ -86,6 +87,7 @@ COMPONENT_SRCDIRS := bluedroid/bta/dm \
bluedroid/stack/avdt \ bluedroid/stack/avdt \
bluedroid/stack/a2dp \ bluedroid/stack/a2dp \
bluedroid/stack \ bluedroid/stack \
bluedroid/utils \
bluedroid/api \ bluedroid/api \
bluedroid \ bluedroid \
. .

View File

@ -11,15 +11,17 @@
#include "btif_stack_manager.h" #include "btif_stack_manager.h"
#include "btif_sdp.h" #include "btif_sdp.h"
#include "esp_gap_api.h" #include "esp_gap_api.h"
#include "bta_api.h" #include "bta_api.h"
#include "bt_av.h"
/* utl_set_device_class() */
#include "utl.h"
#include "alarm.h" #include "alarm.h"
typedef enum { typedef enum {
BT_APP_EVT_STACK_ON, BT_APP_EVT_STACK_ON,
BT_APP_EVT_STACK_OFF, BT_APP_EVT_STACK_OFF,
BT_APP_EVT_ADD_SDP_RECORD_TO, BT_APP_EVT_AV_OPEN_TO,
BT_APP_EVT_SDP_SEARCH_START_TO,
BT_APP_EVT BT_APP_EVT
} tBT_APP_EVT; } tBT_APP_EVT;
@ -27,49 +29,61 @@ typedef union {
uint32_t dummy; uint32_t dummy;
} tBT_APP_EVT_DATA; } tBT_APP_EVT_DATA;
extern const btav_interface_t *btif_av_get_sink_interface(void);
static void bt_stack_evt(tBT_APP_EVT event, tBT_APP_EVT_DATA *p_data); static void bt_stack_evt(tBT_APP_EVT event, tBT_APP_EVT_DATA *p_data);
static void bt_stack_state_changed(bt_state_t state); static void bt_stack_state_changed(bt_state_t state);
static int bt_sdp_add_record(void);
static void bt_sdp_search_complete(bt_status_t status, bt_bdaddr_t *bd_addr, uint8_t* uuid, int num_records, bluetooth_sdp_record *records);
// static bt_bdaddr_t peer_bd_addr = {{0x00, 0x1b, 0xdc, 0x08, 0x0f, 0xe7}}; static bt_bdaddr_t peer_bd_addr = {{0x00, 0x1b, 0xdc, 0x08, 0x0f, 0xe7}};
static bt_bdaddr_t peer_bd_addr = {{0xfc, 0x3f, 0x7c, 0xf1, 0x2c, 0x78}}; // static bt_bdaddr_t peer_bd_addr = {{0xfc, 0x3f, 0x7c, 0xf1, 0x2c, 0x78}};
/* root browse
static const uint8_t target_uuid[16] = { 0x00, 0x00, 0x10, 0x02, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB };
*/
/* UUID_MAP_MAS */
static const uint8_t target_uuid[] = {0x00, 0x00, 0x11, 0x32, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
/* UUID AUDIO Source */
/*
static const uint8_t target_uuid[] = {0x00, 0x00, 0x11, 0x0A, 0x00, 0x00, 0x10, 0x00,
0x80, 0x00, 0x00, 0x80, 0x5F, 0x9B, 0x34, 0xFB};
*/
static bt_callbacks_t bt_callbacks = { static bt_callbacks_t bt_callbacks = {
bt_stack_state_changed bt_stack_state_changed
}; };
static btsdp_callbacks_t btsdp_callbacks = {
bt_sdp_search_complete
};
osi_alarm_t *app_alarm = NULL; osi_alarm_t *app_alarm = NULL;
static void bt_sdp_add_record_to(void *context) static void btav_conn_state_cb(btav_connection_state_t state,
bt_bdaddr_t *bd_addr)
{ {
(void)(context); LOG_ERROR("===btav_conn_state_cb %d ===\n", state);
bt_stack_evt(BT_APP_EVT_ADD_SDP_RECORD_TO, NULL); (void) bd_addr;
} }
static void bt_sdp_search_start_to(void *context) static void btav_audio_state_cb(btav_audio_state_t state, bt_bdaddr_t *bd_addr)
{
LOG_ERROR("===btav_audio_state_cb %d ===\n", state);
(void) bd_addr;
}
static void btav_audio_cfg_cb(bt_bdaddr_t *bd_addr, uint32_t sample_rate, uint8_t channel_count)
{
LOG_ERROR("===btav_audio_cfg_cb %d %d===\n", sample_rate, channel_count);
(void) bd_addr;
}
static btav_callbacks_t btav_cbs = {
sizeof (btav_callbacks_t),
btav_conn_state_cb,
btav_audio_state_cb,
btav_audio_cfg_cb
};
static void btav_open_to(void *context)
{ {
(void)(context); (void)(context);
bt_stack_evt(BT_APP_EVT_SDP_SEARCH_START_TO, NULL); bt_stack_evt(BT_APP_EVT_AV_OPEN_TO, NULL);
}
static void btav_set_device_class(void)
{
tBTA_UTL_COD cod;
memset(&cod, 0, sizeof(tBTA_UTL_COD));
cod.major = BTM_COD_MAJOR_AUDIO;
cod.minor = BTM_COD_MINOR_LOUDSPEAKER;
cod.service = BTM_COD_SERVICE_CAPTURING | BTM_COD_SERVICE_AUDIO;
utl_set_device_class(&cod, BTA_UTL_SET_COD_ALL);
LOG_ERROR("set class of device: major 0x%x, minor 0x%x, service 0x%x\n",
cod.major, cod.minor, cod.service);
} }
static void bt_app_stack_evt(UINT16 event, char *p_param) static void bt_app_stack_evt(UINT16 event, char *p_param)
@ -78,27 +92,21 @@ static void bt_app_stack_evt(UINT16 event, char *p_param)
case BT_APP_EVT_STACK_ON: { case BT_APP_EVT_STACK_ON: {
char *dev_name = "SDP_SERVER_CLIENT"; char *dev_name = "SDP_SERVER_CLIENT";
BTM_SetTraceLevel(BT_TRACE_LEVEL_DEBUG); BTM_SetTraceLevel(BT_TRACE_LEVEL_DEBUG);
btav_set_device_class();
BTA_DmSetDeviceName(dev_name); BTA_DmSetDeviceName(dev_name);
esp_bt_gap_set_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE); esp_bt_gap_set_scan_mode(BT_SCAN_MODE_CONNECTABLE_DISCOVERABLE);
BTIF_SdpInit(&btsdp_callbacks); btif_av_get_sink_interface()->init(&btav_cbs);
app_alarm = osi_alarm_new("app_alarm", bt_sdp_add_record_to, NULL, 1000, false); // app_alarm = osi_alarm_new("app_alarm", bt_sdp_add_record_to, NULL, 1000, false);
app_alarm = osi_alarm_new("app_alarm", btav_open_to, NULL, 1000, false);
osi_alarm_set(app_alarm, 1000); osi_alarm_set(app_alarm, 1000);
} }
break; break;
case BT_APP_EVT_ADD_SDP_RECORD_TO: { case BT_APP_EVT_AV_OPEN_TO: {
bt_sdp_add_record(); LOG_ERROR("**BT_APP_EVT_AV_OPEN_TO\n");
// btif_av_get_sink_interface()->connect(&peer_bd_addr);
osi_alarm_free(app_alarm); osi_alarm_free(app_alarm);
app_alarm = NULL; app_alarm = NULL;
app_alarm = osi_alarm_new("app_alarm", bt_sdp_search_start_to, NULL, 20000, false);
osi_alarm_set(app_alarm, 20000);
}
break;
case BT_APP_EVT_SDP_SEARCH_START_TO: {
osi_alarm_free(app_alarm);
app_alarm = NULL;
BTIF_SdpSearch(&peer_bd_addr, target_uuid);
} }
break; break;
default: default:
@ -120,44 +128,6 @@ static void bt_stack_state_changed(bt_state_t state)
} }
} }
static int bt_sdp_add_record(void)
{
int handle;
bluetooth_sdp_sap_record sap_svr;
memset (&sap_svr, 0, sizeof(bluetooth_sdp_sap_record));
sap_svr.hdr.type = SDP_TYPE_SAP_SERVER;
sap_svr.hdr.rfcomm_channel_number = 2;
sap_svr.hdr.service_name = "SIM ACCESS";
sap_svr.hdr.service_name_length = 10;
sap_svr.hdr.profile_version = 0x0100;
BTIF_SdpCreateRecord((bluetooth_sdp_record *)(&sap_svr), &handle);
return handle;
}
static void bt_sdp_search_complete(bt_status_t status, bt_bdaddr_t *bd_addr, uint8_t* uuid, int num_records, bluetooth_sdp_record *records)
{
uint8_t *addr = bd_addr->address;
bluetooth_sdp_hdr_overlay *p = &records->mas.hdr;
LOG_ERROR("sdp search cmpl: st %d, bd_addr: %02x:%02x:%02x:%02x:%02x:%02x, records %d\n",
status, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], num_records);
if (p->service_name_length > 0) {
LOG_ERROR("service name: %s\n", p->service_name);
}
LOG_ERROR("rfc_chl_num %d, l2cap_psm %d, version %02x\n",
p->rfcomm_channel_number, p->l2cap_psm, p->profile_version);
#if 0
uint8_t *addr = bd_addr->address;
bluetooth_sdp_hdr_overlay *p = &records->hdr;
LOG_ERROR("sdp search cmpl: st %d, bd_addr: %02x:%02x:%02x:%02x:%02x:%02x, records %d, len:%d\n",
status, addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], num_records, p->user1_ptr_len);
if (p->service_name_length > 0) {
LOG_ERROR("service name: %s\n", p->service_name);
}
#endif
}
void app_main_entry(void) void app_main_entry(void)
{ {
bt_status_t stat; bt_status_t stat;

View File

@ -110,12 +110,12 @@ static TIMER_LIST_ENT tle_av_open_on_rc;
#define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \ #define CHECK_BTAV_INIT() if (((bt_av_src_callbacks == NULL) &&(bt_av_sink_callbacks == NULL)) \
|| (btif_av_cb.sm_handle == NULL))\ || (btif_av_cb.sm_handle == NULL))\
{\ {\
BTIF_TRACE_WARNING("%s: BTAV not initialized", __FUNCTION__);\ BTIF_TRACE_WARNING("%s: BTAV not initialized\n", __FUNCTION__);\
return BT_STATUS_NOT_READY;\ return BT_STATUS_NOT_READY;\
}\ }\
else\ else\
{\ {\
BTIF_TRACE_EVENT("%s", __FUNCTION__);\ BTIF_TRACE_EVENT("%s\n", __FUNCTION__);\
} }
/* Helper macro to avoid code duplication in the state machine handlers */ /* Helper macro to avoid code duplication in the state machine handlers */
@ -232,7 +232,7 @@ static void btif_initiate_av_open_tmr_hdlr(TIMER_LIST_ENT *tle)
UNUSED(tle); UNUSED(tle);
/* is there at least one RC connection - There should be */ /* is there at least one RC connection - There should be */
if (btif_rc_get_connected_peer(peer_addr)) { if (btif_rc_get_connected_peer(peer_addr)) {
BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer", __FUNCTION__); BTIF_TRACE_DEBUG("%s Issuing connect to the remote RC peer\n", __FUNCTION__);
/* In case of AVRCP connection request, we will initiate SRC connection */ /* In case of AVRCP connection request, we will initiate SRC connection */
connect_req.target_bda = (bt_bdaddr_t*)&peer_addr; connect_req.target_bda = (bt_bdaddr_t*)&peer_addr;
connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE; connect_req.uuid = UUID_SERVCLASS_AUDIO_SOURCE;
@ -240,7 +240,7 @@ static void btif_initiate_av_open_tmr_hdlr(TIMER_LIST_ENT *tle)
} }
else else
{ {
BTIF_TRACE_ERROR("%s No connected RC peers", __FUNCTION__); BTIF_TRACE_ERROR("%s No connected RC peers\n", __FUNCTION__);
} }
} }
@ -278,7 +278,7 @@ static void btif_report_audio_state(btav_audio_state_t state, bt_bdaddr_t *bd_ad
static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data) static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
{ {
BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, BTIF_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags); dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event) switch (event)
@ -331,7 +331,7 @@ static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
* TODO: We may need to do this only on an AVRCP Play. FixMe * TODO: We may need to do this only on an AVRCP Play. FixMe
*/ */
BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV"); BTIF_TRACE_DEBUG("BTA_AV_RC_OPEN_EVT received w/o AV\n");
memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc)); memset(&tle_av_open_on_rc, 0, sizeof(tle_av_open_on_rc));
tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr; tle_av_open_on_rc.param = (UINT32)btif_initiate_av_open_tmr_hdlr;
btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC, btu_start_timer(&tle_av_open_on_rc, BTU_TTYPE_USER_FUNC,
@ -349,14 +349,14 @@ static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
case BTA_AV_RC_CLOSE_EVT: case BTA_AV_RC_CLOSE_EVT:
if (tle_av_open_on_rc.in_use) { if (tle_av_open_on_rc.in_use) {
BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer."); BTIF_TRACE_DEBUG("BTA_AV_RC_CLOSE_EVT: Stopping AV timer.\n");
btu_stop_timer(&tle_av_open_on_rc); btu_stop_timer(&tle_av_open_on_rc);
} }
btif_rc_handler(event, p_data); btif_rc_handler(event, p_data);
break; break;
default: default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, BTIF_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
dump_av_sm_event_name(event)); dump_av_sm_event_name(event));
return FALSE; return FALSE;
@ -377,7 +377,7 @@ static BOOLEAN btif_av_state_idle_handler(btif_sm_event_t event, void *p_data)
static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data) static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data)
{ {
BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, BTIF_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags); dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event) switch (event)
@ -391,7 +391,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
break; break;
case BTA_AV_REJECT_EVT: case BTA_AV_REJECT_EVT:
BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT "); BTIF_TRACE_DEBUG(" Received BTA_AV_REJECT_EVT \n");
btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda)); btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, &(btif_av_cb.peer_bda));
btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE); btif_sm_change_state(btif_av_cb.sm_handle, BTIF_AV_STATE_IDLE);
break; break;
@ -401,7 +401,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
tBTA_AV *p_bta_data = (tBTA_AV*)p_data; tBTA_AV *p_bta_data = (tBTA_AV*)p_data;
btav_connection_state_t state; btav_connection_state_t state;
btif_sm_state_t av_state; btif_sm_state_t av_state;
BTIF_TRACE_DEBUG("status:%d, edr 0x%x",p_bta_data->open.status, BTIF_TRACE_DEBUG("status:%d, edr 0x%x\n",p_bta_data->open.status,
p_bta_data->open.edr); p_bta_data->open.edr);
if (p_bta_data->open.status == BTA_AV_SUCCESS) if (p_bta_data->open.status == BTA_AV_SUCCESS)
@ -415,7 +415,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
} }
else else
{ {
BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d", BTIF_TRACE_WARNING("BTA_AV_OPEN_EVT::FAILED status: %d\n",
p_bta_data->open.status ); p_bta_data->open.status );
state = BTAV_CONNECTION_STATE_DISCONNECTED; state = BTAV_CONNECTION_STATE_DISCONNECTED;
av_state = BTIF_AV_STATE_IDLE; av_state = BTIF_AV_STATE_IDLE;
@ -447,7 +447,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
// copy to avoid alignment problems // copy to avoid alignment problems
memcpy(&req, p_data, sizeof(req)); memcpy(&req, p_data, sizeof(req));
BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d", req.sample_rate, BTIF_TRACE_WARNING("BTIF_AV_SINK_CONFIG_REQ_EVT %d %d\n", req.sample_rate,
req.channel_count); req.channel_count);
if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) { if (btif_av_cb.peer_sep == AVDT_TSEP_SRC && bt_av_sink_callbacks != NULL) {
HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda), HAL_CBACK(bt_av_sink_callbacks, audio_config_cb, &(btif_av_cb.peer_bda),
@ -460,13 +460,13 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda), if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda),
sizeof(btif_av_cb.peer_bda)) == 0) sizeof(btif_av_cb.peer_bda)) == 0)
{ {
BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Connect Req", __func__); BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Connect Req\n", __func__);
btif_queue_advance(); btif_queue_advance();
break; break;
} }
else else
{ {
BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request", __func__); BTIF_TRACE_DEBUG("%s: Moved from idle by Incoming Connection request\n", __func__);
btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t*)p_data); btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, (bt_bdaddr_t*)p_data);
btif_queue_advance(); btif_queue_advance();
break; break;
@ -477,12 +477,12 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
if (memcmp (((tBTA_AV*)p_data)->pend.bd_addr, &(btif_av_cb.peer_bda), if (memcmp (((tBTA_AV*)p_data)->pend.bd_addr, &(btif_av_cb.peer_bda),
sizeof(btif_av_cb.peer_bda)) == 0) sizeof(btif_av_cb.peer_bda)) == 0)
{ {
BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Pending Req", __func__); BTIF_TRACE_DEBUG("%s: Same device moved to Opening state,ignore Pending Req\n", __func__);
break; break;
} }
else else
{ {
BTIF_TRACE_DEBUG("%s: Moved from idle by outgoing Connection request", __func__); BTIF_TRACE_DEBUG("%s: Moved from idle by outgoing Connection request\n", __func__);
BTA_AvDisconnect(((tBTA_AV*)p_data)->pend.bd_addr); BTA_AvDisconnect(((tBTA_AV*)p_data)->pend.bd_addr);
break; break;
} }
@ -490,7 +490,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
CHECK_RC_EVENT(event, p_data); CHECK_RC_EVENT(event, p_data);
default: default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, BTIF_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
dump_av_sm_event_name(event)); dump_av_sm_event_name(event));
return FALSE; return FALSE;
@ -512,7 +512,7 @@ static BOOLEAN btif_av_state_opening_handler(btif_sm_event_t event, void *p_data
static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data) static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data)
{ {
BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, BTIF_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags); dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event) switch (event)
@ -562,7 +562,7 @@ static BOOLEAN btif_av_state_closing_handler(btif_sm_event_t event, void *p_data
break; break;
default: default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, BTIF_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
dump_av_sm_event_name(event)); dump_av_sm_event_name(event));
return FALSE; return FALSE;
} }
@ -584,13 +584,13 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
{ {
tBTA_AV *p_av = (tBTA_AV*)p_data; tBTA_AV *p_av = (tBTA_AV*)p_data;
BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, BTIF_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags); dump_av_sm_event_name(event), btif_av_cb.flags);
if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) && if ( (event == BTA_AV_REMOTE_CMD_EVT) && (btif_av_cb.flags & BTIF_AV_FLAG_REMOTE_SUSPEND) &&
(p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) ) (p_av->remote_cmd.rc_id == BTA_AV_RC_PLAY) )
{ {
BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY", __FUNCTION__); BTIF_TRACE_EVENT("%s: Resetting remote suspend flag on RC PLAY\n", __FUNCTION__);
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
} }
@ -614,7 +614,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
case BTA_AV_START_EVT: case BTA_AV_START_EVT:
{ {
BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d", BTIF_TRACE_EVENT("BTA_AV_START_EVT status %d, suspending %d, init %d\n",
p_av->start.status, p_av->start.suspending, p_av->start.initiator); p_av->start.status, p_av->start.suspending, p_av->start.initiator);
if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE)) if ((p_av->start.status == BTA_SUCCESS) && (p_av->start.suspending == TRUE))
@ -628,7 +628,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
{ {
if (btif_av_cb.peer_sep == AVDT_TSEP_SNK) if (btif_av_cb.peer_sep == AVDT_TSEP_SNK)
{ {
BTIF_TRACE_EVENT("%s: trigger suspend as remote initiated!!", __FUNCTION__); BTIF_TRACE_EVENT("%s: trigger suspend as remote initiated!!\n", __FUNCTION__);
btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0); btif_dispatch_sm_event(BTIF_AV_SUSPEND_STREAM_REQ_EVT, NULL, 0);
} }
} }
@ -692,7 +692,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) && if((btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) &&
(p_av->reconfig.status == BTA_AV_SUCCESS)) (p_av->reconfig.status == BTA_AV_SUCCESS))
{ {
APPL_TRACE_WARNING("reconfig done BTA_AVstart()"); APPL_TRACE_WARNING("reconfig done BTA_AVstart()\n");
BTA_AvStart(); BTA_AvStart();
} }
else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START) else if(btif_av_cb.flags & BTIF_AV_FLAG_PENDING_START)
@ -706,11 +706,11 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda), if (memcmp ((bt_bdaddr_t*)p_data, &(btif_av_cb.peer_bda),
sizeof(btif_av_cb.peer_bda)) == 0) sizeof(btif_av_cb.peer_bda)) == 0)
{ {
BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device", __func__); BTIF_TRACE_DEBUG("%s: Ignore BTIF_AV_CONNECT_REQ_EVT for same device\n", __func__);
} }
else else
{ {
BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req", __func__); BTIF_TRACE_DEBUG("%s: Moved to opened by Other Incoming Conn req\n", __func__);
btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED, btif_report_connection_state(BTAV_CONNECTION_STATE_DISCONNECTED,
(bt_bdaddr_t*)p_data); (bt_bdaddr_t*)p_data);
} }
@ -720,7 +720,7 @@ static BOOLEAN btif_av_state_opened_handler(btif_sm_event_t event, void *p_data)
CHECK_RC_EVENT(event, p_data); CHECK_RC_EVENT(event, p_data);
default: default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, BTIF_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
dump_av_sm_event_name(event)); dump_av_sm_event_name(event));
return FALSE; return FALSE;
@ -742,7 +742,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
{ {
tBTA_AV *p_av = (tBTA_AV*)p_data; tBTA_AV *p_av = (tBTA_AV*)p_data;
BTIF_TRACE_DEBUG("%s event:%s flags %x", __FUNCTION__, BTIF_TRACE_DEBUG("%s event:%s flags %x\n", __FUNCTION__,
dump_av_sm_event_name(event), btif_av_cb.flags); dump_av_sm_event_name(event), btif_av_cb.flags);
switch (event) switch (event)
@ -815,7 +815,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
case BTA_AV_SUSPEND_EVT: case BTA_AV_SUSPEND_EVT:
BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d", BTIF_TRACE_EVENT("BTA_AV_SUSPEND_EVT status %d, init %d\n",
p_av->suspend.status, p_av->suspend.initiator); p_av->suspend.status, p_av->suspend.initiator);
/* a2dp suspended, stop media task until resumed */ /* a2dp suspended, stop media task until resumed */
@ -886,7 +886,7 @@ static BOOLEAN btif_av_state_started_handler(btif_sm_event_t event, void *p_data
CHECK_RC_EVENT(event, p_data); CHECK_RC_EVENT(event, p_data);
default: default:
BTIF_TRACE_WARNING("%s : unhandled event:%s", __FUNCTION__, BTIF_TRACE_WARNING("%s : unhandled event:%s\n", __FUNCTION__,
dump_av_sm_event_name(event)); dump_av_sm_event_name(event));
return FALSE; return FALSE;
@ -991,7 +991,7 @@ static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
(state == BTIF_AV_STATE_OPENED) ) (state == BTIF_AV_STATE_OPENED) )
{ {
que_len = btif_media_sink_enque_buf((BT_HDR *)p_data); que_len = btif_media_sink_enque_buf((BT_HDR *)p_data);
BTIF_TRACE_DEBUG(" Packets in Que %d",que_len); BTIF_TRACE_DEBUG(" Packets in Que %d\n",que_len);
} }
else else
return; return;
@ -1009,7 +1009,7 @@ static void bte_av_media_callback(tBTA_AV_EVT event, tBTA_AV_MEDIA *p_data)
btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT, btif_transfer_context(btif_av_handle_event, BTIF_AV_SINK_CONFIG_REQ_EVT,
(char*)&config_req, sizeof(config_req), NULL); (char*)&config_req, sizeof(config_req), NULL);
} else { } else {
APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d", a2d_status); APPL_TRACE_ERROR("ERROR dump_codec_info A2D_ParsSbcInfo fail:%d\n", a2d_status);
} }
} }
} }
@ -1057,7 +1057,7 @@ bt_status_t btif_av_init()
static bt_status_t init_src(btav_callbacks_t* callbacks) static bt_status_t init_src(btav_callbacks_t* callbacks)
{ {
BTIF_TRACE_EVENT("%s()", __func__); BTIF_TRACE_EVENT("%s()\n", __func__);
bt_status_t status = btif_av_init(); bt_status_t status = btif_av_init();
if (status == BT_STATUS_SUCCESS) if (status == BT_STATUS_SUCCESS)
@ -1078,7 +1078,7 @@ static bt_status_t init_src(btav_callbacks_t* callbacks)
static bt_status_t init_sink(btav_callbacks_t* callbacks) static bt_status_t init_sink(btav_callbacks_t* callbacks)
{ {
BTIF_TRACE_EVENT("%s()", __func__); BTIF_TRACE_EVENT("%s()\n", __func__);
bt_status_t status = btif_av_init(); bt_status_t status = btif_av_init();
if (status == BT_STATUS_SUCCESS) if (status == BT_STATUS_SUCCESS)
@ -1102,7 +1102,7 @@ static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
btif_av_connect_req_t connect_req; btif_av_connect_req_t connect_req;
connect_req.target_bda = bd_addr; connect_req.target_bda = bd_addr;
connect_req.uuid = uuid; connect_req.uuid = uuid;
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req); btif_sm_dispatch(btif_av_cb.sm_handle, BTIF_AV_CONNECT_REQ_EVT, (char*)&connect_req);
@ -1111,7 +1111,7 @@ static bt_status_t connect_int(bt_bdaddr_t *bd_addr, uint16_t uuid)
static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr) static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
CHECK_BTAV_INIT(); CHECK_BTAV_INIT();
return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int); return btif_queue_connect(UUID_SERVCLASS_AUDIO_SOURCE, bd_addr, connect_int);
@ -1119,7 +1119,7 @@ static bt_status_t src_connect_sink(bt_bdaddr_t *bd_addr)
static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr) static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
CHECK_BTAV_INIT(); CHECK_BTAV_INIT();
return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int); return btif_queue_connect(UUID_SERVCLASS_AUDIO_SINK, bd_addr, connect_int);
@ -1136,7 +1136,7 @@ static bt_status_t sink_connect_src(bt_bdaddr_t *bd_addr)
*******************************************************************************/ *******************************************************************************/
static bt_status_t disconnect(bt_bdaddr_t *bd_addr) static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
CHECK_BTAV_INIT(); CHECK_BTAV_INIT();
@ -1156,7 +1156,7 @@ static bt_status_t disconnect(bt_bdaddr_t *bd_addr)
*******************************************************************************/ *******************************************************************************/
static void cleanup(void) static void cleanup(void)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
btif_a2dp_stop_media_task(); btif_a2dp_stop_media_task();
@ -1171,7 +1171,7 @@ static void cleanup(void)
} }
static void cleanup_src(void) { static void cleanup_src(void) {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
if (bt_av_src_callbacks) if (bt_av_src_callbacks)
{ {
@ -1182,7 +1182,7 @@ static void cleanup_src(void) {
} }
static void cleanup_sink(void) { static void cleanup_sink(void) {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
if (bt_av_sink_callbacks) if (bt_av_sink_callbacks)
{ {
@ -1237,7 +1237,7 @@ BOOLEAN btif_av_stream_ready(void)
{ {
btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x", BTIF_TRACE_DEBUG("btif_av_stream_ready : sm hdl %d, state %d, flags %x\n",
btif_av_cb.sm_handle, state, btif_av_cb.flags); btif_av_cb.sm_handle, state, btif_av_cb.flags);
/* also make sure main adapter is enabled */ /* also make sure main adapter is enabled */
@ -1268,7 +1268,7 @@ BOOLEAN btif_av_stream_started_ready(void)
{ {
btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle); btif_sm_state_t state = btif_sm_get_state(btif_av_cb.sm_handle);
BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x", BTIF_TRACE_DEBUG("btif_av_stream_started : sm hdl %d, state %d, flags %x\n",
btif_av_cb.sm_handle, state, btif_av_cb.flags); btif_av_cb.sm_handle, state, btif_av_cb.flags);
/* disallow media task to start if we have pending actions */ /* disallow media task to start if we have pending actions */
@ -1366,7 +1366,7 @@ bt_status_t btif_av_sink_execute_service(BOOLEAN b_enable)
*******************************************************************************/ *******************************************************************************/
const btav_interface_t *btif_av_get_src_interface(void) const btav_interface_t *btif_av_get_src_interface(void)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
return &bt_av_src_interface; return &bt_av_src_interface;
} }
@ -1381,7 +1381,7 @@ const btav_interface_t *btif_av_get_src_interface(void)
*******************************************************************************/ *******************************************************************************/
const btav_interface_t *btif_av_get_sink_interface(void) const btav_interface_t *btif_av_get_sink_interface(void)
{ {
BTIF_TRACE_EVENT("%s", __FUNCTION__); BTIF_TRACE_EVENT("%s\n", __FUNCTION__);
return &bt_av_sink_interface; return &bt_av_sink_interface;
} }
@ -1414,7 +1414,7 @@ BOOLEAN btif_av_is_connected(void)
*******************************************************************************/ *******************************************************************************/
BOOLEAN btif_av_is_peer_edr(void) BOOLEAN btif_av_is_peer_edr(void)
{ {
ASSERTC(btif_av_is_connected(), "No active a2dp connection", 0); ASSERTC(btif_av_is_connected(), "No active a2dp connection\n", 0);
if (btif_av_cb.edr) if (btif_av_cb.edr)
return TRUE; return TRUE;
@ -1432,6 +1432,6 @@ BOOLEAN btif_av_is_peer_edr(void)
******************************************************************************/ ******************************************************************************/
void btif_av_clear_remote_suspend_flag(void) void btif_av_clear_remote_suspend_flag(void)
{ {
BTIF_TRACE_DEBUG("%s: flag :%x",__func__, btif_av_cb.flags); BTIF_TRACE_DEBUG("%s: flag :%x\n",__func__, btif_av_cb.flags);
btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND; btif_av_cb.flags &= ~BTIF_AV_FLAG_REMOTE_SUSPEND;
} }

File diff suppressed because it is too large Load Diff

View File

@ -334,6 +334,14 @@ static fixed_queue_t *btif_media_cmd_msg_queue = NULL;
static xTaskHandle xBtifMediaTaskHandle = NULL; static xTaskHandle xBtifMediaTaskHandle = NULL;
static QueueHandle_t xBtifMediaQueue = NULL; static QueueHandle_t xBtifMediaQueue = NULL;
/*****************************************************************************
** temporary hacked functions. TODO: port these functions or remove them?
*****************************************************************************/
BOOLEAN btif_hf_is_call_idle(void)
{
return FALSE;
}
/***************************************************************************** /*****************************************************************************
** Misc helper functions ** Misc helper functions
*****************************************************************************/ *****************************************************************************/

View File

@ -31,6 +31,7 @@
#include "bta_api.h" #include "bta_api.h"
#include "bta_av_api.h" #include "bta_av_api.h"
#include "avrc_defs.h" #include "avrc_defs.h"
#include "avrc_api.h"
#include "gki.h" #include "gki.h"
#define LOG_TAG "bt_btif_avrc" #define LOG_TAG "bt_btif_avrc"
@ -206,11 +207,23 @@ static btrc_ctrl_callbacks_t *bt_rc_ctrl_callbacks = NULL;
extern BOOLEAN btif_hf_call_terminated_recently(); extern BOOLEAN btif_hf_call_terminated_recently();
extern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod); extern BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod);
/***************************************************************************** /*****************************************************************************
** Functions ** Functions
******************************************************************************/ ******************************************************************************/
/*****************************************************************************
** temporarily hacked functions. TODO: remove or port these functions
*****************************************************************************/
BOOLEAN btif_hf_call_terminated_recently(void)
{
return FALSE;
}
BOOLEAN check_cod(const bt_bdaddr_t *remote_bdaddr, uint32_t cod)
{
return FALSE;
}
/***************************************************************************** /*****************************************************************************
** Local uinput helper functions ** Local uinput helper functions
******************************************************************************/ ******************************************************************************/

View File

@ -19,8 +19,8 @@ COMPONENT_SRCDIRS := \
app_core \ app_core \
app_project \ app_project \
udrv/ulinux \ udrv/ulinux \
embdrv/sbc/encoder \ embdrv/sbc/encoder/srce \
embdrv/sbc/decoder \ embdrv/sbc/decoder/srce \
btif/co \ btif/co \
btif btif