On Sat, 2019-04-06 at 11:16 +0200, Pali Rohár wrote: > This patch provides support for aptX and aptX HD codecs in bluetooth A2DP > profile. It uses open source LGPLv2.1+ licensed libopenaptx library which > can be found at https://github.com/pali/libopenaptx. > > aptX for s24 stereo samples provides fixed 6:1 compression ratio and > bitrate 352.8 kbit/s, aptX HD provides fixed 4:1 compression ratio and > bitrate 529.2 kbit/s. > > According to soundexpert research, aptX codec used in bluetooth A2DP is no > better than SBC High Quality settings. And you cannot hear difference > between aptX and SBC High Quality, aptX is just a copper-less overpriced > audio cable. > > aptX HD is high-bitrate version of aptX. It has clearly noticeable increase > in sound quality (not dramatic though taking into account the increase in > bitrate). > > http://soundexpert.org/news/-/blogs/audio-quality-of-bluetooth-aptx > --- > configure.ac | 36 +++ > src/Makefile.am | 6 + > src/modules/bluetooth/a2dp-codec-aptx.c | 445 ++++++++++++++++++++++++++++++++ > src/modules/bluetooth/a2dp-codec-util.c | 8 + > 4 files changed, 495 insertions(+) > create mode 100644 src/modules/bluetooth/a2dp-codec-aptx.c > +static bool can_accept_capabilities_common(const a2dp_aptx_t *capabilities, uint32_t vendor_id, uint16_t codec_id) { > + if (!(capabilities->frequency & (APTX_SAMPLING_FREQ_16000 | APTX_SAMPLING_FREQ_32000 | > + APTX_SAMPLING_FREQ_44100 | APTX_SAMPLING_FREQ_48000))) > + return false; > + > + if (A2DP_GET_VENDOR_ID(capabilities->info) != vendor_id || A2DP_GET_CODEC_ID(capabilities->info) != codec_id) > + return false; > + > + if (!(capabilities->channel_mode & APTX_CHANNEL_MODE_STEREO)) Why is mono support not implemented? Is it a limitation of libopenaptx? It's not a big shortcoming, but it would be nice to support mono too. > +static size_t decode_buffer(void *codec_info, const uint8_t *input_buffer, size_t input_size, uint8_t *output_buffer, size_t output_size, size_t *processed) { > + struct aptx_context *aptx_c = (struct aptx_context *) codec_info; > + > + const uint8_t *p; > + uint8_t *d; > + size_t to_write, to_decode; > + > + p = input_buffer; > + to_decode = input_size; > + > + d = output_buffer; > + to_write = output_size; > + > + while (PA_LIKELY(to_decode > 0)) { Is it intentional that encode_buffer() checks both to_encode and to_write in the while loop condition, but decode_buffer() only checks to_decode? If so, why does encode_buffer() need to be extra careful but decode_buffer() doesn't? -- Tanu https://www.patreon.com/tanuk https://liberapay.com/tanuk _______________________________________________ pulseaudio-discuss mailing list pulseaudio-discuss@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss