Re: bluez: A2DP backchannel

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wednesday 11 July 2018 16:37:47 Pali Rohár wrote:
> On Wednesday 11 July 2018 16:34:14 Luiz Augusto von Dentz wrote:
> > Hi Pali,
> > 
> > On Wed, Jul 11, 2018 at 2:04 PM, Pali Rohár <pali.rohar@xxxxxxxxx> wrote:
> > > Hi!
> > >
> > > Some vendor A2DP bluetooth codecs like FastStream or aptX Low Latency
> > > supports backchannel. Which means that they are bi-directional and in
> > > A2DP they supports not only (music) playback, but also receiving
> > > backchannel (microphone) voice.
> > >
> > > How to establish this bi-directional A2DP transfer with backchannel via
> > > bluez daemon?
> > 
> > There is no such thing as bi-directional in AVDTP, which is a screw up
> > from the spec authors,
> 
> So it means that those vendor A2DP codecs somehow extends AVDTP, right?
> I would need to figure out how A2DP devices send voice data... At least
> backchannel activation for FastStream is via one bit in codec parameters
> like other codec parameters.
> 
> > luckily we don't have to stick to it since our
> > sockets are bi-directional so you can send and receive data at same
> > time, though the configuration must be the same in either direction
> > otherwise we would have to support transport multiplexing to have
> > multiple configuration done using the same channel.
> 
> So does it mean that I can read from file descriptor received from dbus
> which is used for sending encoded A2DP audio samples? And if other side
> (e.g device with FastStream or aptX LL vendor codec) send voice via A2DP
> then I receive them on that file descriptor?

Now I established A2DP connection with FastStream codec and in btmon I
see that my headset started sending some data to channel 65 in this A2DP
mode.

So definitely it is possible to send data from headset to computer (that
backchannel) in A2DP mode despite what A2DP specification says.

I managed to modify pulseaudio code to start encoding and streaming
FastStream data to headset and it is working.

Now the challenge would be how to get those data which headset send to
channel 65? Is bluez really sending them via file descriptor which is
used for writing from host to headset?

Via btmon I was able to dump data from this channel 65 and via some
sed/perl magic I converted received voice data and played it:

$ btmon > /tmp/dump
CTRL+C
$ grep 'Channel: 65' -A 14 /tmp/dump | grep '^        ' | sed 's/^        //;s/  .*//' | tr ' ' '\n' | perl -ne 'print chr(hex($_))' > /tmp/voice.sbc
$ sbcdec -f /tmp/voice.snd /tmp/voice.sbc
$ play /tmp/voice.snd

And I heard clear voice. So FastStream is really just rebranded SBC
codec (with fixed parameters; without RTP) and in A2DP bluetooth profile
provides nice bi-directional channels.

-- 
Pali Rohár
pali.rohar@xxxxxxxxx

Attachment: signature.asc
Description: PGP signature


[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux