[pulseaudio-discuss] Bluetooth codec selection
Georg Chini
georg at chini.tk
Tue Jan 7 20:57:40 UTC 2020
On 07.01.20 19:37, Pali Rohár wrote:
> Hello!
>
> My A2DP patch series which adds support for more A2DP codecs is still in
> review state, but Tanu about year ago wrote that do not like my proposal
> with usage of PA profiles for selecting A2DP codec. Because nobody for
> last year come up with another option how to solve this problem and
> because without it is not possible to add support for other codecs it
> means that pulseaudio is stucked and has no way to improve A2DP support.
>
> So here I'm adding another proposal how to handle multi-codec support
> for bluetooth in pulseaudio. But first description of our problem:
>
> Currently we have following profiles for bluetooth card:
>
> * headset_audio_gateway
> * headset_head_unit
> * a2dp_source
> * a2dp_sink
>
> If we look at HW level of HSP/HFP profiles they may supports following
> codecs: CVSD, mSBC, AuriStream. All are bidirectional, synchronous.
> Moreover encoding from PCM stream to codec data may be done at HW level
> (bluetooth adapter) or on SW level (pulseaudio). Currently encoding to
> CVSD is done at HW level and encoding to mSBC at SW level. But e.g. new
> Thinkpads has bluetooth adapters which can do mSBC-encoding at HW level
> and theoretically pulseaudio could just pass PCM samples to BT without
> need to use any software sbc encoding library (*).
>
> And if we look at A2DP profiles it is quite a bit complicated. Every
> "A2DP codec" is either one-way (source or sink) or is bi-directional
> (but it is rare and most devices does not support them). Plus every
> "A2DP codec" may support more "codec profiles", so e.g. we have SBC-MQ
> or SBC-HQ. And bidirectional "A2DP codecs" may use different "audio
> codec" for one directional and different for back directional (e.g.
> A2DP codec aptX-LL uses aptX codec for playing and SBC codec for
> recording).
>
> Result is: "SBC" codec is supported in "headset_head_unit" PA profile
> (as mSBC"), it is supported also in "a2dp_sink" PA profile when "A2DP
> SBC" codec is used and also in "a2dp_source" PA profile when "aptX-LL"
> codec is used.
>
> So adding a new API which sets codec on PA bluetooth card is not enough.
>
> I would propose following API:
>
> Add support for pulseaudio "sub-profiles". For every pulseaudio profile
> it would be possible to register sub-profile and applications via
> pulseaudio API would be able to change sub-profile of some PA card (if
> currently selected PA profile would support it).
>
> Plus adds a two new profiles:
> * a2dp_source_with_backchannel
> * a2dp_sink_with_backchannel
>
> For music playback in most cases is useful only profiles without
> backchannel to maximize bandwidth. And because A2DP codecs with
> bachannel does not fit into HSP profiles it make sense to have them in
> separate profile. In most cases A2DP profile with backchannel is the
> best way for VOIP (as it has microphone recording support), so bluetooth
> policy plugin would be extended to use also this profile for VOIP.
>
> Sub-profiles for bluetooth PA card would be following:
>
> * headset_audio_gateway
> - CVSD (hardware)
> - mSBC (software)
> - mSBC (hardware)
> ...
> * headset_head_unit
> - same as in headset_audio_gateway
> * a2dp_source
> - SBC-LQ
> - SBC-MQ
> - SBC-HQ
> ..,
> - faststream without backchannel
> - aptX
> - aptX-HD
> - aptX-LL without backannel
> - LDAC
> ...
> * a2dp_sink
> - same as in a2dp_source
> * a2dp_source_with_backchannel
> - faststream with backchannel
> - aptX-LL with backchannel
> * a2dp_sink_with_backchannel
> - same as in a2dp_source_with_backchannel
>
> So sub-profile would be one specific configuration of codec. In HSP/HFP
> there would be two sub-profiles for every codec (one for software
> encoding, one for hardware encoding). In A2DP it may be various. E.g.
> for "SBC profiles" there would be one sub-profile for every SBC
> configuration. For faststream codec there would be two, one with
> backchannel, one without. Default sub-codec selection would be up to
> the pulseaudio module. And applications (pactl / pavucontrol / ...)
> would be able to change PA sub-profile in similar way how they can do it
> for PA profiles.
>
> Of course some sub-profiles does not have to be supported (e.g. mSBC in
> hardware encoding) and in these cases pulseaudio would not announce
> these unsupported sub-profiles.
>
> What do you think about this my proposal?
>
> Tanu, is this acceptable for you?
>
> Basically it is needed only to add APIs for applications to:
> * get current sub-profile of card
> * get list of all sub-profiles for specific profile
> * change sub-profile of card
>
> I'm not saying how would API look like. I'm open for implementation
> details... I can imagine that we can extend PA protocol or use messaging
> API for it or anything else...
>
>
> (*) - currently Linux kernel blocks this usage of mSBC HW encoding and
> force userspace to do whole encoding at application level (in
> pulseaudio).
>
I think your proposal looks good. I agree that we need new profiles for A2DP
with backchannel and your sub-profiles basically implement codec switching
(or codec parameter switching in some cases). Sub-profile switching could
be implemented using !51, which then allows control via pactl or pacmd.
In pavucontrol, sub-profiles could be displayed in a separate drop down box.
More information about the pulseaudio-discuss
mailing list