[pulseaudio-discuss] [PATCH v7 00/13] New API for Bluetooth A2DP codecs

Pali Rohár pali.rohar at gmail.com
Fri Mar 22 10:44:56 UTC 2019

Hello, may I ask for review of this patch series or at least first 10
patches? Patches are now one month old and I have not touched this for
that time period. Currently I have this code and details in my head, but
chances are that I forgot other details in future and therefore it would
be hard to me to again do needed analysis and later do required
modifications. Prepare all those changes were time consuming, it took me
half of year to evolve into V7 version and probably I would not have
time to implement it again in future...

On Saturday 23 February 2019 10:45:31 Pali Rohár wrote:
> This is 7th version of my patch series for modular A2DP codec API and
> aptX support. Main change for v7 version is splitting Modular API patch
> into two: first (4/13) which implements API and second (12/13) which
> implements codec switching via separate profiles. Main objections were
> for exporting separate profile for each codec. As this functionality
> is not present in first 10 patches, I hope that it speed up reviewing
> and merging first 10 patches!
> This patch series provides new modular API for Bluetooth A2DP codecs,
> clean up module-bluez5-device and bluez5-util to be codec independent
> and convert SBC codec into this new API for A2DP codecs. Also it adds
> support for aptX, aptX HD and FastStream A2DP codecs.
> New codec API is designed in way, that for adding new codec is not
> needed to touch bluez5-util nor module-bluez5-device files. Whole
> codec registration is done in a2dp-codec-util.c file, without need
> to update any header file.
> Some A2DP codecs are bidirectional and support backchannel for
> microphone voice. This new A2DP codec API fully supports this feature
> and module-bluez5-device was extended to support microphone voice source
> for codecs which declares such support. FastStream is example of such
> codec.
> For every A2DP codec is created card profile. When using bluez from
> current git master then only those profiles codec profiles are created
> which are supported by remote headset/endpoint.
> With this new modular API it should be easy to add other codec support
> like MP3, AAC or LDAC.
> API is designed also for ability to register "more variants" of one
> A2DP codec. This is used by SBC codec. It exports 5 different variants:
> Low Quality, Medium Quality, High Quality, Ultra High Quality and
> Automatic Quality. Also if remote device exports more endpoints for SBC
> codec with different quality, pulseaudio SBC code properly find and use
> endpoint which matches defined quality.
> I tested playback with SBC, aptX and FastStream codecs, including
> switching between them while playing music and it is working fine. When
> switching codec there is some 1-2s quiet window. Also microphone voice
> in FastStream is working and has slightly better quality as in HSP profile.
> Changes in v7:
> * Split patch "Modular API for A2DP codecs" into two parts:
>   - 4/13: Implementation of codec API (without exporting new profiles)
>   - 12/13: Implementation of codec switching via bluez; exporting profile per codec
> * Fixed A2DP SBC endianity in SBC and FastStream codecs for bigendian hosts
> * Fixed checks for SetConfiguration call
> * Fixed checks for transport_config
> Changes in v6:
> * Change A2DP profile immediately and remove -EAGAIN problem,
>   this fixes the last problem with switching from one A2DP codec
>   profile to another, now it is fully transparent
> * Add more variants of SBC codec, including SBC Ultra High Quality which
>   beats aptX and should be supported by most bluetooth headsets
> * Update module-bluetooth-policy code to prefer using bi-directional
>   A2DP profiles for VOIP applications as it has better VOIP quality as
>   HSP/HFP profiles
> * Add missing validations for SBC codec parameters
> * Clean up SBC bitpool calculation
> * Fixed debug usage of sbc_get_implementation_info()
> * Update a2dp-codecs.h from upstream bluez project again
> * Use bluez's "Device" key for determining device path for SEP endpoint
>   (instead of guessing it directly from SEP endpoint string)
> * Simplify aptX and aptX HD code as they share lot of common parts
> * Fix assigning sink/sources into port profiles
> * Remove a2dp_sink_codecs/a2dp_source_codecs hashmaps to simplify code
> * Fix announcing transport availability when bluez supports codec changing
> * Fix switching A2DP codec when bluez removed/re-added remote endpoints
> Changes in v5:
> * Added support for switching between A2DP codec via profiles.
>   This requires bluez patches from above link.
> Changes in v4:
> * Added support for aptX HD codec
> * Changed codec API for reading block size and reducing encoder bitrate
> * Added support for microphone backchannel into module-bluez5-device
> * Added support for microphone backchannel into FastStream codec
> * Fixed parsing FastStream A2DP config buffer
> * Fixed validation for config buffers
> * Fixed calculating block size for aptX codec
> * Fixed resetting SBC and FastStream codecs
> Changes in v3:
> * Fixed problems pointed by Tanu
> Pali Rohár (13):
>   switch-on-port-available: Fix null pointer dereference
>   bluetooth: policy: Remove BlueZ 4 related code
>   bluetooth: Update a2dp-codecs.h from upstream bluez project
>   bluetooth: Modular API for A2DP codecs
>   bluetooth: Add missing validations for SBC codec parameters
>   bluetooth: Clean up SBC bitpool calculation
>   bluetooth: Set correct endianity for SBC codec
>   bluetooth: Add A2DP aptX and aptX HD codecs support
>   bluetooth: Add A2DP FastStream codec support
>   bluetooth: Add more variants of SBC codec
>   bluetooth: policy: Reflect a2dp profile names
>   bluetooth: Implement A2DP codec switching and backchannel support
>   bluetooth: policy: Treat bi-directional A2DP profiles as suitable for
>     VOIP
>  configure.ac                                    |   36 +
>  src/Makefile.am                                 |   20 +-
>  src/modules/bluetooth/a2dp-codec-api.h          |   80 ++
>  src/modules/bluetooth/a2dp-codec-aptx.c         |  445 ++++++++++
>  src/modules/bluetooth/a2dp-codec-faststream.c   |  436 ++++++++++
>  src/modules/bluetooth/a2dp-codec-sbc.c          | 1033 +++++++++++++++++++++++
>  src/modules/bluetooth/a2dp-codec-util.c         |   78 ++
>  src/modules/bluetooth/a2dp-codec-util.h         |   34 +
>  src/modules/bluetooth/a2dp-codecs.h             |  336 +++++++-
>  src/modules/bluetooth/bluez5-util.c             |  775 +++++++++++------
>  src/modules/bluetooth/bluez5-util.h             |   39 +-
>  src/modules/bluetooth/module-bluetooth-policy.c |  117 +--
>  src/modules/bluetooth/module-bluez5-device.c    |  914 ++++++++++----------
>  src/modules/module-switch-on-port-available.c   |    2 +-
>  14 files changed, 3561 insertions(+), 784 deletions(-)
>  create mode 100644 src/modules/bluetooth/a2dp-codec-api.h
>  create mode 100644 src/modules/bluetooth/a2dp-codec-aptx.c
>  create mode 100644 src/modules/bluetooth/a2dp-codec-faststream.c
>  create mode 100644 src/modules/bluetooth/a2dp-codec-sbc.c
>  create mode 100644 src/modules/bluetooth/a2dp-codec-util.c
>  create mode 100644 src/modules/bluetooth/a2dp-codec-util.h

Pali Rohár
pali.rohar at gmail.com

More information about the pulseaudio-discuss mailing list