From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: ValdikSS Date: Thu, 13 Sep 2018 23:14:10 +0300 Subject: [PATCH] Allow using alternative (higher) SBC HD bitrates with a property Change-Id: Ic85e5c8a8c70233de2125e69c01d74e5501a2da8 --- stack/a2dp/a2dp_sbc_encoder.cc | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/stack/a2dp/a2dp_sbc_encoder.cc b/stack/a2dp/a2dp_sbc_encoder.cc index d80f1b680..5cf1ac104 100644 --- a/stack/a2dp/a2dp_sbc_encoder.cc +++ b/stack/a2dp/a2dp_sbc_encoder.cc @@ -32,6 +32,7 @@ #include "embdrv/sbc/encoder/include/sbc_encoder.h" #include "osi/include/log.h" #include "osi/include/osi.h" +#include "osi/include/properties.h" /* Buffer pool */ #define A2DP_SBC_BUFFER_SIZE BT_DEFAULT_BUFFER_SIZE @@ -54,6 +55,17 @@ #define A2DP_SBC_3DH5_DEFAULT_BITRATE 552 #define A2DP_SBC_3DH5_48KHZ_BITRATE 601 +/* + * SBC Dual Channel (SBC HD) 2DH5 alternative bitrates. + * 648 kbps @ 48 khz, 595.4 kbps @ 44.1 khz. + * Up to 3 frames for 2DH5. + */ +#define A2DP_SBC_2DH5_ALT_BITRATE 596 +#define A2DP_SBC_2DH5_ALT_48KHZ_BITRATE 649 + +// SBC HD alternative bitrate property +#define A2DP_SBC_HD_PROP "persist.bluetooth.sbc_hd_higher_bitrate" + #define A2DP_SBC_NON_EDR_MAX_RATE 229 /* @@ -853,6 +865,7 @@ static uint16_t a2dp_sbc_source_rate() { if (a2dp_sbc_encoder_cb.sbc_encoder_params.s16SamplingFreq == SBC_sf48000) rate = A2DP_SBC_48KHZ_BITRATE; + /* 3DH5 maximum bitrates */ if (a2dp_sbc_encoder_cb.peer_supports_3mbps && a2dp_sbc_encoder_cb.TxAaMtuSize >= MIN_3MBPS_AVDTP_SAFE_MTU) { rate = A2DP_SBC_3DH5_DEFAULT_BITRATE; @@ -860,6 +873,14 @@ static uint16_t a2dp_sbc_source_rate() { rate = A2DP_SBC_3DH5_48KHZ_BITRATE; } + /* 2DH5 alternative bitrates */ + if (!a2dp_sbc_encoder_cb.peer_supports_3mbps && + osi_property_get_int32(A2DP_SBC_HD_PROP, 0)) { + rate = A2DP_SBC_2DH5_ALT_BITRATE; + if (a2dp_sbc_encoder_cb.sbc_encoder_params.s16SamplingFreq == SBC_sf48000) + rate = A2DP_SBC_2DH5_ALT_48KHZ_BITRATE; + } + /* restrict bitrate if a2dp link is non-edr */ if (!a2dp_sbc_encoder_cb.is_peer_edr) { rate = A2DP_SBC_NON_EDR_MAX_RATE;