#!/bin/bash # Copyright 2004, ..., 2017 Jean-Philippe Guillemin # All rights reserved. # # Permission to use, copy, modify, and distribute this patch for # any purpose with or without fee is hereby granted, provided that # the above copyright notice and this permission notice appear in all # copies. # # THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. # IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF # USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT # OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. here are the features of this patch : - allow to use bitpool 94 on devices that support it, aka SBC XQ - harmless for devices limited to bitpool 53 - deprecates the need for APTX & APTX HD support, which are not better than SBC XQ, are not Open Source, and less supported by devices Reference : http://soundexpert.org/articles/-/blogs/audio-quality-of-sbc-xq-bluetooth-audio-codec diff -rNaud pulseaudio-13.0-orig/src/modules/bluetooth/a2dp-codec-sbc.c pulseaudio-13.0/src/modules/bluetooth/a2dp-codec-sbc.c --- pulseaudio-13.0-orig/src/modules/bluetooth/a2dp-codec-sbc.c 2019-09-13 15:20:03.000000000 +0200 +++ pulseaudio-13.0/src/modules/bluetooth/a2dp-codec-sbc.c 2019-09-18 12:52:07.385514911 +0200 @@ -156,17 +156,17 @@ static uint8_t default_bitpool(uint8_t freq, uint8_t mode) { /* These bitpool values were chosen based on the A2DP spec recommendation */ switch (freq) { - case SBC_SAMPLING_FREQ_16000: - case SBC_SAMPLING_FREQ_32000: + case SBC_SAMPLING_FREQ_48000: switch (mode) { case SBC_CHANNEL_MODE_MONO: case SBC_CHANNEL_MODE_DUAL_CHANNEL: + return SBC_BITPOOL_HQ_MONO_48000; + case SBC_CHANNEL_MODE_STEREO: case SBC_CHANNEL_MODE_JOINT_STEREO: - return SBC_BITPOOL_HQ_JOINT_STEREO_44100; + return SBC_BITPOOL_HQ_JOINT_STEREO_48000; } break; - case SBC_SAMPLING_FREQ_44100: switch (mode) { case SBC_CHANNEL_MODE_MONO: @@ -178,16 +178,14 @@ return SBC_BITPOOL_HQ_JOINT_STEREO_44100; } break; - - case SBC_SAMPLING_FREQ_48000: + case SBC_SAMPLING_FREQ_16000: + case SBC_SAMPLING_FREQ_32000: switch (mode) { case SBC_CHANNEL_MODE_MONO: case SBC_CHANNEL_MODE_DUAL_CHANNEL: - return SBC_BITPOOL_HQ_MONO_48000; - case SBC_CHANNEL_MODE_STEREO: case SBC_CHANNEL_MODE_JOINT_STEREO: - return SBC_BITPOOL_HQ_JOINT_STEREO_48000; + return SBC_BITPOOL_HQ_JOINT_STEREO_44100; } break; } @@ -254,12 +252,12 @@ return 0; } } else { - if (capabilities->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) - config->channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO; + if (capabilities->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) + config->channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; else if (capabilities->channel_mode & SBC_CHANNEL_MODE_STEREO) config->channel_mode = SBC_CHANNEL_MODE_STEREO; - else if (capabilities->channel_mode & SBC_CHANNEL_MODE_DUAL_CHANNEL) - config->channel_mode = SBC_CHANNEL_MODE_DUAL_CHANNEL; + else if (capabilities->channel_mode & SBC_CHANNEL_MODE_JOINT_STEREO) + config->channel_mode = SBC_CHANNEL_MODE_JOINT_STEREO; else if (capabilities->channel_mode & SBC_CHANNEL_MODE_MONO) config->channel_mode = SBC_CHANNEL_MODE_MONO; else { @@ -343,31 +341,27 @@ sample_spec->format = PA_SAMPLE_S16LE; switch (config->frequency) { - case SBC_SAMPLING_FREQ_16000: - sbc_info->frequency = SBC_FREQ_16000; - sample_spec->rate = 16000U; - break; - case SBC_SAMPLING_FREQ_32000: - sbc_info->frequency = SBC_FREQ_32000; - sample_spec->rate = 32000U; + case SBC_SAMPLING_FREQ_48000: + sbc_info->frequency = SBC_FREQ_48000; + sample_spec->rate = 48000U; break; case SBC_SAMPLING_FREQ_44100: sbc_info->frequency = SBC_FREQ_44100; sample_spec->rate = 44100U; break; - case SBC_SAMPLING_FREQ_48000: - sbc_info->frequency = SBC_FREQ_48000; - sample_spec->rate = 48000U; + case SBC_SAMPLING_FREQ_32000: + sbc_info->frequency = SBC_FREQ_32000; + sample_spec->rate = 32000U; + break; + case SBC_SAMPLING_FREQ_16000: + sbc_info->frequency = SBC_FREQ_16000; + sample_spec->rate = 16000U; break; default: pa_assert_not_reached(); } switch (config->channel_mode) { - case SBC_CHANNEL_MODE_MONO: - sbc_info->mode = SBC_MODE_MONO; - sample_spec->channels = 1; - break; case SBC_CHANNEL_MODE_DUAL_CHANNEL: sbc_info->mode = SBC_MODE_DUAL_CHANNEL; sample_spec->channels = 2; @@ -380,17 +374,21 @@ sbc_info->mode = SBC_MODE_JOINT_STEREO; sample_spec->channels = 2; break; + case SBC_CHANNEL_MODE_MONO: + sbc_info->mode = SBC_MODE_MONO; + sample_spec->channels = 1; + break; default: pa_assert_not_reached(); } switch (config->allocation_method) { - case SBC_ALLOCATION_SNR: - sbc_info->allocation = SBC_AM_SNR; - break; case SBC_ALLOCATION_LOUDNESS: sbc_info->allocation = SBC_AM_LOUDNESS; break; + case SBC_ALLOCATION_SNR: + sbc_info->allocation = SBC_AM_SNR; + break; default: pa_assert_not_reached(); } diff -rNaud pulseaudio-13.0-orig/src/modules/bluetooth/a2dp-codecs.h pulseaudio-13.0/src/modules/bluetooth/a2dp-codecs.h --- pulseaudio-13.0-orig/src/modules/bluetooth/a2dp-codecs.h 2019-09-13 15:20:03.000000000 +0200 +++ pulseaudio-13.0/src/modules/bluetooth/a2dp-codecs.h 2019-09-18 12:50:40.543522257 +0200 @@ -61,14 +61,10 @@ * Allocation method = Loudness * Subbands = 8 */ -#define SBC_BITPOOL_MQ_MONO_44100 19 -#define SBC_BITPOOL_MQ_MONO_48000 18 -#define SBC_BITPOOL_MQ_JOINT_STEREO_44100 35 -#define SBC_BITPOOL_MQ_JOINT_STEREO_48000 33 -#define SBC_BITPOOL_HQ_MONO_44100 31 -#define SBC_BITPOOL_HQ_MONO_48000 29 -#define SBC_BITPOOL_HQ_JOINT_STEREO_44100 53 -#define SBC_BITPOOL_HQ_JOINT_STEREO_48000 51 +#define SBC_BITPOOL_HQ_MONO_44100 47 +#define SBC_BITPOOL_HQ_MONO_48000 47 +#define SBC_BITPOOL_HQ_JOINT_STEREO_44100 94 +#define SBC_BITPOOL_HQ_JOINT_STEREO_48000 94 #define MPEG_CHANNEL_MODE_MONO (1 << 3) #define MPEG_CHANNEL_MODE_DUAL_CHANNEL (1 << 2)