From 015555c6fb0d8b4ced3b687edf21f8a190d8906d Mon Sep 17 00:00:00 2001 From: xiongweichao Date: Mon, 29 May 2023 15:32:53 +0800 Subject: [PATCH] change(bt/Bluedroid): Update AVRCP version to 1.5 --- components/bt/host/bluedroid/bta/ar/bta_ar.c | 6 +- .../bt/host/bluedroid/bta/av/bta_av_cfg.c | 3 +- .../bt/host/bluedroid/bta/av/bta_av_main.c | 8 +-- .../bluedroid/bta/include/bta/bta_ar_api.h | 4 +- .../bluedroid/bta/include/bta/bta_av_api.h | 1 + .../bt/host/bluedroid/stack/avrc/avrc_sdp.c | 60 ++++++++++++------- .../bluedroid/stack/include/stack/avrc_api.h | 6 +- .../bluedroid/stack/include/stack/avrc_defs.h | 1 + 8 files changed, 56 insertions(+), 33 deletions(-) diff --git a/components/bt/host/bluedroid/bta/ar/bta_ar.c b/components/bt/host/bluedroid/bta/ar/bta_ar.c index c94910cd04b..cd70eeec240 100644 --- a/components/bt/host/bluedroid/bta/ar/bta_ar.c +++ b/components/bt/host/bluedroid/bta/ar/bta_ar.c @@ -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; @@ -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). @@ -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. diff --git a/components/bt/host/bluedroid/bta/av/bta_av_cfg.c b/components/bt/host/bluedroid/bta/av/bta_av_cfg.c index 9f39239f5c6..ef22d7932b1 100644 --- a/components/bt/host/bluedroid/bta/av/bta_av_cfg.c +++ b/components/bt/host/bluedroid/bta/av/bta_av_cfg.c @@ -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 */ diff --git a/components/bt/host/bluedroid/bta/av/bta_av_main.c b/components/bt/host/bluedroid/bta/av/bta_av_main.c index 48b6a5f6942..ffdf5243aad 100644 --- a/components/bt/host/bluedroid/bta/av/bta_av_main.c +++ b/components/bt/host/bluedroid/bta/av/bta_av_main.c @@ -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 } @@ -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 } diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_ar_api.h b/components/bt/host/bluedroid/bta/include/bta/bta_ar_api.h index 99cc511e957..2823d674e54 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_ar_api.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_ar_api.h @@ -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); /****************************************************************************** ** diff --git a/components/bt/host/bluedroid/bta/include/bta/bta_av_api.h b/components/bt/host/bluedroid/bta/include/bta/bta_av_api.h index f64612cc292..ddf72b96372 100644 --- a/components/bt/host/bluedroid/bta/include/bta/bta_av_api.h +++ b/components/bt/host/bluedroid/bta/include/bta/bta_av_api.h @@ -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 */ diff --git a/components/bt/host/bluedroid/stack/avrc/avrc_sdp.c b/components/bt/host/bluedroid/stack/avrc/avrc_sdp.c index 11a994d7acb..fa98082e86b 100644 --- a/components/bt/host/bluedroid/stack/avrc/avrc_sdp.c +++ b/components/bt/host/bluedroid/stack/avrc/avrc_sdp.c @@ -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 @@ -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 @@ -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 } } }; @@ -216,6 +220,8 @@ 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. ** @@ -223,8 +229,8 @@ UINT16 AVRC_FindService(UINT16 service_uuid, BD_ADDR bd_addr, ** 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; @@ -232,9 +238,12 @@ UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name, 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; @@ -242,18 +251,11 @@ UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name, /* 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); @@ -261,11 +263,21 @@ UINT16 AVRC_AddRecord(UINT16 service_uuid, char *p_service_name, 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); @@ -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); diff --git a/components/bt/host/bluedroid/stack/include/stack/avrc_api.h b/components/bt/host/bluedroid/stack/include/stack/avrc_api.h index cbbb4b1c696..21f4bee5766 100644 --- a/components/bt/host/bluedroid/stack/include/stack/avrc_api.h +++ b/components/bt/host/bluedroid/stack/include/stack/avrc_api.h @@ -195,6 +195,8 @@ extern "C" ** ** sdp_handle: SDP handle returned by SDP_CreateRecord(). ** +** browsing_en: Supported browsing +** ** Output Parameters: ** None. ** @@ -202,8 +204,8 @@ extern "C" ** 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); /****************************************************************************** ** diff --git a/components/bt/host/bluedroid/stack/include/stack/avrc_defs.h b/components/bt/host/bluedroid/stack/include/stack/avrc_defs.h index 7619aa2f4dc..c90fa6cfeb3 100644 --- a/components/bt/host/bluedroid/stack/include/stack/avrc_defs.h +++ b/components/bt/host/bluedroid/stack/include/stack/avrc_defs.h @@ -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 */