mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
fix a2dp source crash when connect to Bose speaker
This commit is contained in:
parent
3cec3a0026
commit
8704eb1713
@ -1285,10 +1285,10 @@ void bta_av_setconfig_rsp (tBTA_AV_SCB *p_scb, tBTA_AV_DATA *p_data)
|
|||||||
|
|
||||||
if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1) {
|
if (p_scb->codec_type == BTA_AV_CODEC_SBC || num > 1) {
|
||||||
/* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind.
|
/* if SBC is used by the SNK as INT, discover req is not sent in bta_av_config_ind.
|
||||||
* call disc_res now */
|
* call cfg_res now */
|
||||||
/* this is called in A2DP SRC path only, In case of SINK we don't need it */
|
/* this is called in A2DP SRC path only, In case of SINK we don't need it */
|
||||||
if (local_sep == AVDT_TSEP_SRC) {
|
if (local_sep == AVDT_TSEP_SRC) {
|
||||||
p_scb->p_cos->disc_res(p_scb->hndl, num, num, 0, p_scb->peer_addr,
|
p_scb->p_cos->cfg_res(p_scb->hndl, num, num, 0, p_scb->peer_addr,
|
||||||
UUID_SERVCLASS_AUDIO_SOURCE);
|
UUID_SERVCLASS_AUDIO_SOURCE);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -256,6 +256,8 @@ typedef BOOLEAN (*tBTA_AV_CO_INIT) (UINT8 *p_codec_type, UINT8 *p_codec_info,
|
|||||||
UINT8 *p_num_protect, UINT8 *p_protect_info, UINT8 tsep);
|
UINT8 *p_num_protect, UINT8 *p_protect_info, UINT8 tsep);
|
||||||
typedef void (*tBTA_AV_CO_DISC_RES) (tBTA_AV_HNDL hndl, UINT8 num_seps,
|
typedef void (*tBTA_AV_CO_DISC_RES) (tBTA_AV_HNDL hndl, UINT8 num_seps,
|
||||||
UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
|
UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
|
||||||
|
typedef void (*tBTA_AV_CO_CFG_RES) (tBTA_AV_HNDL hndl, UINT8 num_seps,
|
||||||
|
UINT8 num_snk, UINT8 num_src, BD_ADDR addr, UINT16 uuid_local);
|
||||||
typedef UINT8 (*tBTA_AV_CO_GETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
|
typedef UINT8 (*tBTA_AV_CO_GETCFG) (tBTA_AV_HNDL hndl, tBTA_AV_CODEC codec_type,
|
||||||
UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid,
|
UINT8 *p_codec_info, UINT8 *p_sep_info_idx, UINT8 seid,
|
||||||
UINT8 *p_num_protect, UINT8 *p_protect_info);
|
UINT8 *p_num_protect, UINT8 *p_protect_info);
|
||||||
@ -285,6 +287,7 @@ typedef BOOLEAN (*tBTA_AVRC_CO_RN_EVT_SUPPORTED) (UINT8 event_id);
|
|||||||
typedef struct {
|
typedef struct {
|
||||||
tBTA_AV_CO_INIT init;
|
tBTA_AV_CO_INIT init;
|
||||||
tBTA_AV_CO_DISC_RES disc_res;
|
tBTA_AV_CO_DISC_RES disc_res;
|
||||||
|
tBTA_AV_CO_CFG_RES cfg_res;
|
||||||
tBTA_AV_CO_GETCFG getcfg;
|
tBTA_AV_CO_GETCFG getcfg;
|
||||||
tBTA_AV_CO_SETCFG setcfg;
|
tBTA_AV_CO_SETCFG setcfg;
|
||||||
tBTA_AV_CO_OPEN open;
|
tBTA_AV_CO_OPEN open;
|
||||||
|
@ -312,6 +312,58 @@ void bta_av_co_audio_disc_res(tBTA_AV_HNDL hndl, UINT8 num_seps, UINT8 num_snk,
|
|||||||
} else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE) {
|
} else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE) {
|
||||||
p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK;
|
p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK;
|
||||||
}
|
}
|
||||||
|
p_peer->got_disc_res = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*******************************************************************************
|
||||||
|
**
|
||||||
|
** Function bta_av_co_audio_cfg_res
|
||||||
|
**
|
||||||
|
** Description This callout function is executed by AV to report the
|
||||||
|
** number of stream end points (SEP) were found during the
|
||||||
|
** incoming AVDT stream config request process.
|
||||||
|
**
|
||||||
|
**
|
||||||
|
** Returns void.
|
||||||
|
**
|
||||||
|
*******************************************************************************/
|
||||||
|
void bta_av_co_audio_cfg_res(tBTA_AV_HNDL hndl, UINT8 num_seps, UINT8 num_snk,
|
||||||
|
UINT8 num_src, BD_ADDR addr, UINT16 uuid_local)
|
||||||
|
{
|
||||||
|
tBTA_AV_CO_PEER *p_peer;
|
||||||
|
|
||||||
|
FUNC_TRACE();
|
||||||
|
|
||||||
|
APPL_TRACE_DEBUG("bta_av_co_audio_cfg_res h:x%x num_seps:%d num_snk:%d num_src:%d",
|
||||||
|
hndl, num_seps, num_snk, num_src);
|
||||||
|
|
||||||
|
/* Find the peer info */
|
||||||
|
p_peer = bta_av_co_get_peer(hndl);
|
||||||
|
if (p_peer == NULL) {
|
||||||
|
APPL_TRACE_ERROR("bta_av_co_audio_cfg_res could not find peer entry");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sanity check : this should never happen */
|
||||||
|
if (p_peer->opened) {
|
||||||
|
APPL_TRACE_ERROR("bta_av_co_audio_cfg_res peer already opened");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Copy the discovery results */
|
||||||
|
bdcpy(p_peer->addr, addr);
|
||||||
|
if (!p_peer->got_disc_res) {
|
||||||
|
p_peer->num_snks = num_snk;
|
||||||
|
p_peer->num_srcs = num_src;
|
||||||
|
p_peer->num_seps = num_seps;
|
||||||
|
p_peer->num_rx_snks = 0;
|
||||||
|
p_peer->num_rx_srcs = 0;
|
||||||
|
p_peer->num_sup_snks = 0;
|
||||||
|
}
|
||||||
|
if (uuid_local == UUID_SERVCLASS_AUDIO_SINK) {
|
||||||
|
p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SOURCE;
|
||||||
|
} else if (uuid_local == UUID_SERVCLASS_AUDIO_SOURCE) {
|
||||||
|
p_peer->uuid_to_connect = UUID_SERVCLASS_AUDIO_SINK;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*******************************************************************************
|
/*******************************************************************************
|
||||||
@ -1696,6 +1748,7 @@ BOOLEAN bta_av_co_get_remote_bitpool_pref(UINT8 *min, UINT8 *max)
|
|||||||
const tBTA_AV_CO_FUNCTS bta_av_a2d_cos = {
|
const tBTA_AV_CO_FUNCTS bta_av_a2d_cos = {
|
||||||
bta_av_co_audio_init,
|
bta_av_co_audio_init,
|
||||||
bta_av_co_audio_disc_res,
|
bta_av_co_audio_disc_res,
|
||||||
|
bta_av_co_audio_cfg_res,
|
||||||
bta_av_co_audio_getconfig,
|
bta_av_co_audio_getconfig,
|
||||||
bta_av_co_audio_setconfig,
|
bta_av_co_audio_setconfig,
|
||||||
bta_av_co_audio_open,
|
bta_av_co_audio_open,
|
||||||
|
@ -61,6 +61,7 @@ typedef struct {
|
|||||||
BOOLEAN opened; /* opened */
|
BOOLEAN opened; /* opened */
|
||||||
UINT16 mtu; /* maximum transmit unit size */
|
UINT16 mtu; /* maximum transmit unit size */
|
||||||
UINT16 uuid_to_connect; /* uuid of peer device */
|
UINT16 uuid_to_connect; /* uuid of peer device */
|
||||||
|
BOOLEAN got_disc_res; /* got the results of initiating discovery */
|
||||||
} tBTA_AV_CO_PEER;
|
} tBTA_AV_CO_PEER;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
Loading…
Reference in New Issue
Block a user