From 4e1cbef68701ea914a74e6e3fea607fc9e351841 Mon Sep 17 00:00:00 2001 From: JP Guillemin Date: Wed, 6 Jan 2021 23:08:44 +0000 Subject: [PATCH] Update of a2dp-codec-sbc.c to achieve SBC XQ quality in dual channel, with fall back to standard Joint Stereo mode --- spa/plugins/bluez5/a2dp-codec-sbc.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/spa/plugins/bluez5/a2dp-codec-sbc.c b/spa/plugins/bluez5/a2dp-codec-sbc.c index f5b6998ac..9e228224a 100644 --- a/spa/plugins/bluez5/a2dp-codec-sbc.c +++ b/spa/plugins/bluez5/a2dp-codec-sbc.c @@ -85,7 +85,8 @@ static int codec_fill_caps(const struct a2dp_codec *codec, uint32_t flags, static uint8_t default_bitpool(uint8_t freq, uint8_t mode) { - /* These bitpool values were chosen based on the A2DP spec recommendation */ + /* A2DP spec v1.2 states that all SNK implementation shall handle bitrates + of up to 512 kbps (~ bitpool = 76 stereo, or 2x38 dual channel). */ switch (freq) { case SBC_SAMPLING_FREQ_16000: case SBC_SAMPLING_FREQ_32000: @@ -95,22 +96,22 @@ static uint8_t default_bitpool(uint8_t freq, uint8_t mode) switch (mode) { case SBC_CHANNEL_MODE_MONO: case SBC_CHANNEL_MODE_DUAL_CHANNEL: - return 31; + return 38; case SBC_CHANNEL_MODE_STEREO: case SBC_CHANNEL_MODE_JOINT_STEREO: - return 53; + return 64; } return 53; case SBC_SAMPLING_FREQ_48000: switch (mode) { case SBC_CHANNEL_MODE_MONO: case SBC_CHANNEL_MODE_DUAL_CHANNEL: - return 29; + return 35; case SBC_CHANNEL_MODE_STEREO: case SBC_CHANNEL_MODE_JOINT_STEREO: - return 51; + return 62; } return 51; } @@ -140,12 +141,12 @@ static int codec_select_config(const struct a2dp_codec *codec, uint32_t flags, else return -ENOTSUP; - if (conf.channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) + if (conf.channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) + conf.channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; + else if (conf.channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) conf.channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO; else if (conf.channel_mode & SBC_CHANNEL_MODE_STEREO) conf.channel_mode = SBC_CHANNEL_MODE_STEREO; - else if (conf.channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) - conf.channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; else if (conf.channel_mode & SBC_CHANNEL_MODE_MONO) conf.channel_mode = SBC_CHANNEL_MODE_MONO; else