Skip to content

Commit

Permalink
Merge branch 'feature/update_avrcp_v1.5_v5.1' into 'release/v5.1'
Browse files Browse the repository at this point in the history
change(bt/Bluedroid): Update AVRCP version to 1.5 (v5.1)

See merge request espressif/esp-idf!24582
  • Loading branch information
jack0c committed Jul 5, 2023
2 parents 4474b0a + 015555c commit 425b660
Show file tree
Hide file tree
Showing 8 changed files with 56 additions and 33 deletions.
6 changes: 3 additions & 3 deletions components/bt/host/bluedroid/bta/ar/bta_ar.c
Expand Up @@ -232,7 +232,7 @@ void bta_ar_dereg_avct(tBTA_SYS_ID sys_id)
**
******************************************************************************/
void bta_ar_reg_avrc(UINT16 service_uuid, char *service_name, char *provider_name,
UINT16 categories, tBTA_SYS_ID sys_id)
UINT16 categories, tBTA_SYS_ID sys_id, BOOLEAN browsing_en)
{
UINT8 mask = bta_ar_id (sys_id);
UINT8 temp[8], *p;
Expand All @@ -245,7 +245,7 @@ void bta_ar_reg_avrc(UINT16 service_uuid, char *service_name, char *provider_nam
if (bta_ar_cb.sdp_tg_handle == 0) {
bta_ar_cb.tg_registered = mask;
bta_ar_cb.sdp_tg_handle = SDP_CreateRecord();
AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_tg_handle);
AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_tg_handle, browsing_en);
bta_sys_add_uuid(service_uuid);
}
/* only one TG is allowed (first-come, first-served).
Expand All @@ -255,7 +255,7 @@ void bta_ar_reg_avrc(UINT16 service_uuid, char *service_name, char *provider_nam
categories = bta_ar_cb.ct_categories[0] | bta_ar_cb.ct_categories[1];
if (bta_ar_cb.sdp_ct_handle == 0) {
bta_ar_cb.sdp_ct_handle = SDP_CreateRecord();
AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_ct_handle);
AVRC_AddRecord(service_uuid, service_name, provider_name, categories, bta_ar_cb.sdp_ct_handle, browsing_en);
bta_sys_add_uuid(service_uuid);
} else {
/* multiple CTs are allowed.
Expand Down
3 changes: 2 additions & 1 deletion components/bt/host/bluedroid/bta/av/bta_av_cfg.c
Expand Up @@ -94,7 +94,8 @@ const tBTA_AV_CFG bta_av_cfg = {
6, /* AVDTP audio channel max data queue size */
BTA_AV_MAX_VDP_MTU, /* AVDTP video transport channel MTU at L2CAP */
600, /* AVDTP video transport channel flush timeout */
FALSE, /* TRUE, to accept AVRC 1.3 group nevigation command */
FALSE, /* TRUE, to accept AVRC 1.3 group nevigation command */
FALSE, /* FALSE, does not support browsing channel */
2, /* company id count in p_meta_co_ids */
BTA_AV_RC_PASS_RSP_CODE,/* the default response code for pass through commands */
bta_av_meta_caps_co_ids,/* the metadata Get Capabilities response for company id */
Expand Down
8 changes: 4 additions & 4 deletions components/bt/host/bluedroid/bta/av/bta_av_main.c
Expand Up @@ -585,10 +585,10 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
(UINT8)(bta_av_cb.sec_mask & (~BTA_SEC_AUTHORIZE)), BTA_ID_AV);
if (p_data->api_reg.tsep == AVDT_TSEP_SRC) {
bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target\n", NULL,
p_bta_av_cfg->avrc_src_tg_cat, BTA_ID_AV);
p_bta_av_cfg->avrc_src_tg_cat, BTA_ID_AV, p_bta_av_cfg->avrc_br);
} else {
bta_ar_reg_avrc(UUID_SERVCLASS_AV_REM_CTRL_TARGET, "AV Remote Control Target\n", NULL,
p_bta_av_cfg->avrc_snk_tg_cat, BTA_ID_AV);
p_bta_av_cfg->avrc_snk_tg_cat, BTA_ID_AV, p_bta_av_cfg->avrc_br);
}
#endif
}
Expand Down Expand Up @@ -721,10 +721,10 @@ static void bta_av_api_register(tBTA_AV_DATA *p_data)
/* create an SDP record as AVRC CT. */
if (p_data->api_reg.tsep == AVDT_TSEP_SRC) {
bta_ar_reg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, "AV Remote Control Controller\n", NULL,
p_bta_av_cfg->avrc_src_ct_cat, BTA_ID_AV);
p_bta_av_cfg->avrc_src_ct_cat, BTA_ID_AV, p_bta_av_cfg->avrc_br);
} else {
bta_ar_reg_avrc(UUID_SERVCLASS_AV_REMOTE_CONTROL, "AV Remote Control Controller\n", NULL,
p_bta_av_cfg->avrc_snk_ct_cat, BTA_ID_AV);
p_bta_av_cfg->avrc_snk_ct_cat, BTA_ID_AV, p_bta_av_cfg->avrc_br);
}
#endif
}
Expand Down
4 changes: 2 additions & 2 deletions components/bt/host/bluedroid/bta/include/bta/bta_ar_api.h
Expand Up @@ -120,8 +120,8 @@ extern void bta_ar_dereg_avct(tBTA_SYS_ID sys_id);
** Returns void
**
******************************************************************************/
extern void bta_ar_reg_avrc(UINT16 service_uuid, char *p_service_name,
char *p_provider_name, UINT16 categories, tBTA_SYS_ID sys_id);
extern void bta_ar_reg_avrc(UINT16 service_uuid, char *p_service_name, char *p_provider_name,
UINT16 categories, tBTA_SYS_ID sys_id, BOOLEAN browsing_en);

/******************************************************************************
**
Expand Down
1 change: 1 addition & 0 deletions components/bt/host/bluedroid/bta/include/bta/bta_av_api.h
Expand Up @@ -556,6 +556,7 @@ typedef struct {
UINT16 video_mtu; /* AVDTP video transport channel MTU at L2CAP */
UINT16 video_flush_to; /* AVDTP video transport channel flush timeout */
BOOLEAN avrc_group; /* TRUE, to accept AVRC 1.3 group nevigation command */
BOOLEAN avrc_br; /* FALSE, does not support browsing channel */
UINT8 num_co_ids; /* company id count in p_meta_co_ids */
tBTA_AV_CODE rc_pass_rsp; /* the default response code for pass through commands */
const UINT32 *p_meta_co_ids;/* the metadata Get Capabilities response for company id */
Expand Down
60 changes: 39 additions & 21 deletions components/bt/host/bluedroid/stack/avrc/avrc_sdp.c
Expand Up @@ -29,8 +29,8 @@

#if (defined(AVRC_INCLUDED) && AVRC_INCLUDED == TRUE)

#ifndef SDP_AVRCP_1_4
#define SDP_AVRCP_1_4 TRUE
#ifndef SDP_AVRCP_1_5
#define SDP_AVRCP_1_5 TRUE
#endif

#ifndef SDP_AVCTP_1_4
Expand All @@ -52,7 +52,7 @@ const tSDP_PROTOCOL_ELEM avrc_proto_list [] = {
#if SDP_AVCTP_1_4 == TRUE
{UUID_PROTOCOL_AVCTP, 1, {AVCT_REV_1_4, 0} }
#else
#if SDP_AVRCP_1_4 == TRUE
#if (SDP_AVRCP_1_4 == TRUE || SDP_AVRCP_1_5 == TRUE)
{UUID_PROTOCOL_AVCTP, 1, {AVCT_REV_1_3, 0} }
#else
#if AVRC_METADATA_INCLUDED == TRUE
Expand All @@ -64,13 +64,17 @@ const tSDP_PROTOCOL_ELEM avrc_proto_list [] = {
#endif
};

#if SDP_AVRCP_1_4 == TRUE
#if SDP_AVRCP_1_5 == TRUE
const tSDP_PROTO_LIST_ELEM avrc_add_proto_list [] = {
{
AVRC_NUM_PROTO_ELEMS,
{
{UUID_PROTOCOL_L2CAP, 1, {AVCT_BR_PSM, 0} },
#if SDP_AVCTP_1_4 == TRUE
{UUID_PROTOCOL_AVCTP, 1, {AVCT_REV_1_4, 0} }
#else
{UUID_PROTOCOL_AVCTP, 1, {AVCT_REV_1_3, 0} }
#endif
}
}
};
Expand Down Expand Up @@ -216,56 +220,64 @@ UINT16 AVRC_FindService(UINT16 service_uuid, BD_ADDR bd_addr,
**
** sdp_handle: SDP handle returned by SDP_CreateRecord().
**
** browsing_en: Supported browsing
**
** Output Parameters:
** None.
**
** Returns AVRC_SUCCESS if successful.
** AVRC_NO_RESOURCES if not enough resources to build the SDP record.
**
******************************************************************************/
UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name,
char *p_provider_name, UINT16 categories, UINT32 sdp_handle)
UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name, char *p_provider_name,
UINT16 categories, UINT32 sdp_handle, BOOLEAN browsing_en)
{
UINT16 browse_list[1];
BOOLEAN result = TRUE;
UINT8 temp[8];
UINT8 *p;
UINT16 count = 1;
UINT16 class_list[2];
UINT16 supported_feature = categories;
BOOLEAN media_player_virtual_filesystem_supported = FALSE;
BOOLEAN add_additional_protocol_list = FALSE;


AVRC_TRACE_API("AVRC_AddRecord uuid: %x", service_uuid);
AVRC_TRACE_API("AVRC_AddRecord uuid: %x, browsing_en:%d", service_uuid, browsing_en);

if ( service_uuid != UUID_SERVCLASS_AV_REM_CTRL_TARGET && service_uuid != UUID_SERVCLASS_AV_REMOTE_CONTROL ) {
return AVRC_BAD_PARAM;
}

/* add service class id list */
class_list[0] = service_uuid;
#if SDP_AVCTP_1_4 == TRUE
if ( service_uuid == UUID_SERVCLASS_AV_REMOTE_CONTROL ) {
class_list[1] = UUID_SERVCLASS_AV_REM_CTRL_CONTROL;
count = 2;
}
#else
#if SDP_AVRCP_1_4 == TRUE
#if (SDP_AVCTP_1_4 == TRUE || SDP_AVRCP_1_5 == TRUE)
if ( service_uuid == UUID_SERVCLASS_AV_REMOTE_CONTROL ) {
class_list[1] = UUID_SERVCLASS_AV_REM_CTRL_CONTROL;
count = 2;
}
#endif
#endif
result &= SDP_AddServiceClassIdList(sdp_handle, count, class_list);

/* add protocol descriptor list */
result &= SDP_AddProtocolList(sdp_handle, AVRC_NUM_PROTO_ELEMS, (tSDP_PROTOCOL_ELEM *)avrc_proto_list);

/* add profile descriptor list */
#if SDP_AVRCP_1_4 == TRUE
/* additional protocol list to include browsing channel */
result &= SDP_AddAdditionProtoLists( sdp_handle, 1, (tSDP_PROTO_LIST_ELEM *)avrc_add_proto_list);
#if SDP_AVRCP_1_5 == TRUE
if (browsing_en) {
add_additional_protocol_list = TRUE;
} else if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET &&
(categories & (AVRC_SUPF_TG_CAT1 | AVRC_SUPF_TG_CAT3))) {
AVRC_TRACE_WARNING("For AVRCP Target Cateory 1 and 3, SDP record shall contain additional protocol list");
add_additional_protocol_list = TRUE;
}

result &= SDP_AddProfileDescriptorList(sdp_handle, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_4);
if (add_additional_protocol_list) {
/* additional protocol list to include browsing channel */
result &= SDP_AddAdditionProtoLists( sdp_handle, 1, (tSDP_PROTO_LIST_ELEM *)avrc_add_proto_list);
}

result &= SDP_AddProfileDescriptorList(sdp_handle, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_5);
#else
#if AVRC_METADATA_INCLUDED == TRUE
result &= SDP_AddProfileDescriptorList(sdp_handle, UUID_SERVCLASS_AV_REMOTE_CONTROL, AVRC_REV_1_3);
Expand All @@ -274,9 +286,15 @@ UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name,
#endif
#endif

/* add supported categories */
/* Check if browsing is supported */
if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_CONTROL && browsing_en) {
supported_feature |= AVRC_SUPF_CT_BROWSE;
} else if (service_uuid == UUID_SERVCLASS_AV_REM_CTRL_TARGET && media_player_virtual_filesystem_supported) {
supported_feature |= AVRC_SUPF_TG_BROWSE;
}
/* add supported feature */
p = temp;
UINT16_TO_BE_STREAM(p, categories);
UINT16_TO_BE_STREAM(p, supported_feature);
result &= SDP_AddAttribute(sdp_handle, ATTR_ID_SUPPORTED_FEATURES, UINT_DESC_TYPE,
(UINT32)2, (UINT8 *)temp);

Expand Down
6 changes: 4 additions & 2 deletions components/bt/host/bluedroid/stack/include/stack/avrc_api.h
Expand Up @@ -195,15 +195,17 @@ extern "C"
**
** sdp_handle: SDP handle returned by SDP_CreateRecord().
**
** browsing_en: Supported browsing
**
** Output Parameters:
** None.
**
** Returns AVRC_SUCCESS if successful.
** AVRC_NO_RESOURCES if not enough resources to build the SDP record.
**
******************************************************************************/
extern UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name,
char *p_provider_name, UINT16 categories, UINT32 sdp_handle);
extern UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name, char *p_provider_name,
UINT16 categories, UINT32 sdp_handle, BOOLEAN browsing_en);

/******************************************************************************
**
Expand Down
Expand Up @@ -34,6 +34,7 @@
#define AVRC_REV_1_0 0x0100
#define AVRC_REV_1_3 0x0103
#define AVRC_REV_1_4 0x0104
#define AVRC_REV_1_5 0x0105

#define AVRC_PACKET_LEN 512 /* Per the spec, you must support 512 byte RC packets */

Expand Down

0 comments on commit 425b660

Please sign in to comment.