Category Archives: Bluetooth

My works related to bluetooth

Bluetooth Workshop at the Kernel Summit

Yesterday and today I’ve got the opportunity to attend the Bluetooth workshop, which is part of the Linux Kernel Summit. During the two days a lot of topics have been discussed, with highlights for the release of BlueZ 5, which will finally remove all the API marked as deprecated but still laying around. This includes the unix api, which means applications which dont yet use the D-Bus fd-passing API will have to upgrade it. Now.

Another important removal will be the ALSA modules for A2DP and HSP. I know some people still using it, despite the fact that PulseAudio bluetooth support is around for about 4 years now and its the recommended way to use both profiles. So now it’s serious, upgrade your installation or you are on your own from now. The gstreamer support will still remain on the tree but still, the recommended way to use these profiles is through PulseAudio.

Also a lot of discussion happened over the LE profiles (which are part of the Bluetooth 4.0 spec) and how to correctly add support for them in the right way and well integrated with the current BR/EDR profiles. There were also discussions on the AMP support and the MGMT interface, which will help to add support for that.

Finally we had an audio discussion together with some of the PulseAudio main hackers (Colin and Arun), which were around for the gstreamer conference.

I would like to thank the Linux Foundation for helping me attending this event. Seriously, you rock!

Advertisements

Handsfree HF role

Here at ProFUSION we’ve been helping people at BlueZ, oFono, and PulseAudio to add support for the Handsfree-unit role of the bluetooth Handsfree Profile to Linux. We had some nice progress this week that lead us to make a video showing what we have so far. It’s still not merged upstream, and definitely not user friendly. But hey, it works!

Kudos to Gustavo Padovan for implementing most of this support into BlueZ and oFono.

1, 2, 3, 4, A2DP Stream

After a few people asking me how to use the A2DP Sink with BlueZ, I’ve decided to write this mini-tutorial with a step-by-step on how to establish a A2DP stream from any device to a BlueZ-enabled host.

Before we start the hands-on, let’s see a little bit of nomenclature. In our use-case we have an stream being transmitted between two devices through a pipeline. Our pipeline is constructed of the remote host, BlueZ and PulseAudio. Each element of this pipeline has a Source (SRC) and a Sink (SNK) interface. The stream is handled between different elements by being sent from one element’s source to another element’s sink. So, the big picture of our pipeline is something like this (with the stream being represented by an arrow):

Remote-SRC ----> SNK-BlueZ-SRC ----> SNK-PulseAudioBT-SRC

With the PulseAudio bluetooth source being available for applications to connect to it and serve themselves with fresh, just-decoded PCM frames of pure stereo audio. In our example, we gonna add another element to the pipeline tho. In order to able to hear the audio we’re receiving, we gonna connect the PulseAudio bluetooth source to a PulseAudio ALSA sink which pushes the audio out through our soundcard speakers.

PulseAudioBT-SRC ----> SNK-PulseAudioALSA ----> SoundCard

So after these lines on theory, let’s get out hands dirty. First of all, you need a recent version of BlueZ and PulseAudio. BlueZ 4.46 and PulseAudio 0.9.16 should be enough, but I strongly recommend getting the newest releases available by the time you read this. Right now the most recent releases are BlueZ 4.58 and PulseAudio 0.9.21.

  1. PulseAudio must be running with module-bluetooth-discover loaded;
    • This module is automatically loaded on startup with the default configuration;
    • If it’s not loaded you can use pactl to load it manually or configure PulseAudio to load it on startup in /etc/pulse/default.pa;
  2. Enable the Source interface on BlueZ:
    • edit /etc/bluetooth/audio.conf and add the following line: Enable=Source ;
    • restart bluetoothd;
  3. Pair both devices;
  4. On the object path representing the remote host, on org.bluez D-Bus service, call the org.bluez.AudioSource.Connect() method;
    • For the connection to succeed you’ll probably have to grant access on the remote host;
    • When the connection is established, a new card should show up on PulseAudio with one source available;
  5. Connect PulseAudio bluetooth source to PulseAudio ALSA sink;
    • load-module module-loopback source=<name> sink=<name>
    • You can use the line above to load the module-loopback, using pactl (on the command line) or inside pacmd shell;
    • To find out the name of the source and the sink, you can use the commands list-sources and list-sinks inside pacmd shell;
    • This step is only needed if you want to send the audio coming through A2DP to your speakers.

It’s important to remember that the current implementation is working but could see some improvements, so expect to hear some glitches if you go through signal variation. Happy bluetooth audio streaming!

BlueZ talk at Unicamp

Me and Gustavo Padovan are presenting a talk about BlueZ at a series of seminars about free software hosted at University of Campinas (Unicamp). If you’re nearby come to join us 16h at CB01 today. We gonna give a brief overview of bluetooth and BlueZ, talk about our contributions to the BlueZ project, and show a little about how to use the BlueZ API inside your applications or as an end-user.

If you’re far away from Campinas, you can at least take a look at the slides: BlueZ talk

BlueZ now has A2DP Sink support

Last week was the midterm evaluations for GSoC and also the very same week when my patches were merged upstream into BlueZ. Most of the work was to adapt the existing Source functions to support both Source and Sink and to add Sink logic to the A2DP Server.

There is now a new Source interface on D-Bus, similar to the Sink interface, than can be used to access the Sink functionality. It may sound odd the Sink being accessed through an interface called Source, but in this case it actually acts as a sink on the air interface (receives audio stream from other bluetooth device) and as a source on the application interface (generates audio stream to applications).

Unfortunately, that’s not enough for one to be able to stream audio to a BlueZ device. Right now there is no client able to handle the incoming stream. The good news are that this is part 2 of my SoC project, to implement some clients outside BlueZ to handle this stream. I’m gonna start with PulseAudio, since I’ve implemented the bluetooth sink module on it last year and am more familiar with it’s implementation. After that, I’ll probably implement an ALSA client too.

So what’s the current implementation useful for? From an users perspective, not much. But it shows we are on the way to have it done. Right now it’s possible to connect to the audio sink and put it on STREAMING state, but it doesn’t know how handle the stream and disconnects after a few packets. I’ve tested it with two bluetooth adapter on my laptop and also trying to stream from an Android phone to the laptop.

The Source interface is disabled by default, so if want to test it, make sure to add an “Enable=Source” line to your audio.conf. The code is available on bluez git repo and will be on release 4.46.

GSoC09 is up and running!

I’m glad to announce that I was accepted for one more Google Summer of Code program. I’m going to work with BlueZ again, this year to implement the A2DP sink profile. Full proposal following.

Abstract

This project is to implement the Sink role on BlueZ, according to the A2DP specification v1.2. This role provide means to receive an audio stream coming from an audio Source on the same piconet. It’s very important, and can add several use cases for the Linux bluetooth stack, like Linux to Linux streams, bluetooth microphones support or using a Linux device as bluetooth speakers. It’s also a mandatory feature for an implementation to be full compliant with A2DP v1.2.

Content

Have you worked on a Linux system before?

I’ve been working with Linux since 2002, when I’ve started the Computer Engineering undergrad. In the beginning I just did the school projects on Linux, but since the middle of 2002 it’s my main system. By that time I had Conectiva on my home computer, RedHat on the school, and Slackware on my home router. After a few years I got in touch with Gentoo, and I liked so much the idea that it became my main distro. In addition, I’ve also started working on a project at University of Campinas, to make a Linux distribution for Itautec, a brazilian IT company, which was Gentoo based. Nowadays I’m using Ubuntu in my laptop, because of the speedy install and no need of much tweaking, so I have more time to work with other projects, but I’m confortable using and administrating any distribution.

Have you contributed to a open source project? if yes, please provide the details

My first contribution was a little bit frustrating, since I never got any answer (a two lines patch to python-dialog – http://sourceforge.net/projects/pythondialog/ – to support one dialog that was missing). After that I’ve made some performance improvements in ImageMagick and DevIL using OpenMP, both of them being accepted upstream. I was also accepted and successfully completed a GSoC 08 project with BlueZ to make the bluetooth audio client for PulseAudio. All these successful experiences were outstanding and all of them (now including the never answered patch) were very useful to learn about the community and how to work with open source model. Now I’m looking for a job with open source, and also plan to continue contributing to some projects of my personal interest. Right now I’m following the BlueZ and PulseAudio mailing lists.

What is your educational Qualification (grad/under-grad) ?

I’m a Computer Engineer, majored on University of Campinas (Unicamp), Brazil. I’ve started my master degree on Computer Science studies last year, on the same university, working with visualization of concurrent algorithms. I’ve also been working as a teaching assistant of the Operating Systems course in my university, for two semesters. The last time we proposed to the students to make some changes in a memory filesystem that was developed for them to work on. This activity is giving me a bit more of knowledge on the Linux kernel, that maybe can be helpful to complete this project.

Why do you want to do a project involving Bluetooth/BlueZ ?

I’ve already been a GSoC student with BlueZ and was a very good experience. I’ve worked with the same protocol of this project, so I already have some knowledge on it. The initial motivation to choose BlueZ last year was because it’s something that I use on my daily activities (I have a bluetooth mouse on my notebook and a headset that I use to talk with friends and family on VoIP systems) and because I’m very enthusiastic about wireless devices and mobility. Besides that, I always had interest about network-related stuff.

If your application is accepted will it be a part of your graduation process or it will it be just for hobby?

If I get accepted to this project, it will not be part of my graduation process.

Give us an *estimative* of your schedule (exams period, etc.) and how much time you would be able to dedicate to the project.

The project will be divided into 5 activities. I plan to work around 20h per week with this project, during the whole program. The other 20h of a working week are going to be dedicated to my Master degree program, but it’s flexible enough to allow me some extra hours near deadlines, if needed.

1. Re-read the A2DP specification v1.2 from bluetooth.com (and related specs like AVDTP, GAVDP etc) and understand it’s current implementation. The A2DP Sink role is the dual of the A2DP Source role, with the main difference being the implementation of the “Receive Audio Stream” procedure, described in Section 3.2.2 of the spec, instead of the “Send Audio Stream procedure”. Together with this study of the spec, the code under the audio dir on BlueZ source code will be studied, to learn exactly what’s implemented and which files implement each part.

2. Maybe reorganize some code to enable reuse. If there are some already implemented parts for the Source which the Sink is also going to use (likely the AVDTP signaling procedures), the idea is to use the same implementation to minimize bugs and easy the maintenance.

3. Find out which are the missing parts and procedures to full support the Sink role and implement them.

4. Create the API for clients that want to obtain the audio received by BlueZ and export it via D-Bus, as it already done for the Source profile (which acts as a sink for software clients like media players).

Community Bounding Period (April 20th – May 22nd): Activities 1 and 2 are going to be performed on this period.

Coding Phase I (May 23rd – July 12nd): Most of activity 3 is going to be performed on this period.

Coding Phase II (July 13rd – August 17th): Finish of activity 3 and activity 4 are going to be performed on this period.

Future Work: If there is enough time, or as a future project, I would like to implement a client that uses the bluetooth audio somehow, in order to test the Sink implementation. My first idea is to do so on PulseAudio, as I’ve already worked with it before, but other ideas are also welcome.

Bluez-PulseAudio is now mainstream

With the PulseAudio 0.9.13 being release on Oct 10th, my bluetooth module for PulseAudio has gone upstream! Check out the relese notes.

Com o lançamento do PulseAudio 0.9.13 em 10/Oct, meu módulo bluetooth entrou na linha de desenvolvimento principal! Veja as notas de lançamento.

Con el lanzamiento del PulseAudio 0.9.13 en 10/Oct, mi modulo bluetooth ha entrado en la linea de desarrollo principal! Vea las notas de lanzamiento.

GSoC 2008

This year I’ve participated in the Google Summer of Code program. Despite the fact that wasn’t summer in the southern hemisphere, everything happened as expected. I’ve worked with BlueZ as my mentoring organization, and my project was to add bluetooth support to the PulseAudio sound server. The abstract of my application can be found here.

The implementation was made through 2 modules: module-bluetooth-device and module-bluetooth-discover. The latter connects to BlueZ through D-Bus to find out what devices have already been paired with each adapter present on the system, and the loads one instance of the module-bluetooth-device for each device found (in contrast to linux kernel modules, PulseAudio modules can be loaded more than once at the same time). It also keeps watching for new adapters and devices, so it can load a module to take care of each new device that shows up.

The former, module-bluetooth-device, is the one who actually does the job of creating the bluetooth audio channel in PulseAudio. First, it connects to the BlueZ audio service through one unix socket to obtain the device capabilities. Then it configures the device according to it’s capabilities, setup the SBC encoder (if applicable) and obtain a file descriptor to write audio data to the device. This fd is passed to a PulseAudio I/O thread (which runs with real time priorities if the user has real time privileges properly set), which gets the audio data coming to this sink (sink is the name of an output channel in PulseAudio), encode it (if applicable) and write it on the device fd. Also, the I/O thread has to take care of the clock synchronization between PulseAudio an the device.

I really enjoyed doing this job. Working with an open source community is outstanding! I’ve learned a lot during the program, made good contacts, and the most important: had a lot of fun! I would like to thank a lot my mentor, Luiz Augusto von Dentz, and the PulseAudio maintainer, Lennart Poettering. Without the help of these two guys I wouldn’t have been able to finish this project. And of course I have to thank Google for helping FLOSS develpment throug this program and LH for making the program happen and for being so kind and patient with all the students. LH, you rock!

I’ll continue working on this project, since there still a lot to be done. Time synchronization is not the best and the usability is far from ideal. I have a git repository for this on gitorious, on an branch called bt. Feel free to point bugs and make sugestions. Also, if you really enjoyed the project and want to help more, I accept donations of A2DP, HSP, or HFP bluetooth audio devices, for test and development. All of this was made so far with a borrowed device from my good friend João Eduardo Ferreira Bertacchi (thanks JE!). The oficial release note on the BlueZ website about this project can be found here.