Now there are two. Yes, there are now two different UCM prototypes for Android on Pandaboard. But why? Well, the first, tinyHAL, came out of conversations with Mark Brown and others, as described in my earlier post. The second came from later discovering that Gabriel Beddingfield had implemented a similar PoC for Blaze. They are both good starts and both have their pluses, and now both run on Pandaboard with the Linaro Android builds.
The first, tinyHAL is available at here. The second, android-ucm, is available here. I have also facilitated the relicensing of the dependencies for android-ucm and deposited them here and here. Please refer to the README in each of these repositories for the instructions on how to build these components in a Linaro Android build.
So, which one should be used and enhanced? Well, I like the XML mapping from android-ucm, and I like the XML configuration formats from tinyHAL. I suspect that the way forward should be to decide the best features, and then combine, refactor, and merge efforts. For now, try them both and see which one you prefer. As always, contributions are always welcome and feel free to contact me or email@example.com if you have comments.
Following the ASoC Embedded ALSA Conference and the Linaro Multimedia Summit last year, I put plans in place to bring UCM to Linaro for both the Ubuntu-based builds and the Android builds. We are seeing that happen. UCM functionality is improving in Ubuntu and now is coming to Android. Based on the initial drop of tinyhal by Mark Brown, I now have a prototype running on Pandaboard. This code should be viewed as a proof-of-concept framework for UCM, not a complete fully-functioning implementation. The code supports basic playback and will need to be enhanced for a full dynamic verb set. I have created a git repository for my work here.
To give it a try, you will need to follow the Linaro Android instructions for building from source, which I recently blogged here. Follow the README instructions for copying files to their needed locations. You can test playback with tinyplay or the Android music player app. The configuration file sets the initial volume, but the Android settings work normally for adjusting this level.
The remaining needed work will continue over the next several weeks, adding support for other mixing and routes. I am also looking to unify the file formats between Ubuntu and Android. Stay tuned for that proposal. As always, contributions are welcome.
Yes, it has been too long since I blogged, I won’t bore you with the details of why. Instead, I’ll kick this off again with a step-by-step post on how to set up a system to do your first Android build.
Linaro has a great new Android homepage with lots of useful links on it, go explore the info there http://wiki.linaro.org/Platform/Android
I did my installation on Ubuntu 11.10 Oneiric, so this post will make the most sense if you do too. Put away that P3 box in the corner you were planning on using. It seems to be a wise requirement to use a quick box with x86_64 support. You will also need ~30G of free space on your drive an a good amount of memory, plan for it. So, go do your AMD64 install of Ubuntu Oneiric desktop and then come back.
The AOSP “Initializing a Build Environment” page is your next stop. It is slightly out of date, but work through it http://source.android.com/source/initializing.html Under the “Installing required packages” section, there is a package change for Oneiric. The package lib32readline5-dev is not available, use lib32readline-gplv2-dev instead.
Next, go get repo. To do this, follow the first 3 steps under the Quickstart section at http://wiki.linaro.org/Platform/Android/BuildSource Wait on running the repo init command for now.
Install gcc-4.5. I used software center, and uninstalled 4.6 first. You may not have to do this as it may have caused me some extra fun for me. Regardless, when you have it installed, make sure that you have /usr/bin/cc and /usr/bin/gcc symlinked to gcc-4.5, not 4.6.
I also experienced a problem that was well documented here: http://unforgivendevelopment.com/2011/10/05/solved-cyanogenmod-build-issues-on-debian-wheezy-testing/ As this post suggests, running “sudo ln -s /usr/include/`uname -m`-linux-gnu/asm/ /usr/include/asm” fixed the problem.
Now it is time to decide on the code to build. I was interested in reproducing the 12.01 Linaro Android “tracking” build because it had the patches needed to make audio work on the Pandaboard. The best way to do this is to follow the “How to Get and Build the Source” on the android-build.linaro.org page for the build you are interested in, in my case, https://android-build.linaro.org/builds/~linaro-android/tracking-panda-12.01-release/ If you follow this exactly (with any changes for your environment, of course), you shouldn’t have any problems. Also, I hope you aren’t in a hurry. The repo sync alone will take over an hour unless you have a super fast connection and the build will depend on your host, but mine takes a good long time.
When the build is complete, check the build log in the root directory to make sure there wasn’t any issues. To use the build you just made, refer to the instructions “How to Use Prebuilt Images” on the same Linaro Build page you used in the step above. The boot, system and userdata compressed tarballs are available in the ~/android/out/target/product/<board> directory. Substitute <board> with your dev platform, in my case that was “pandaboard”. Blast these onto a SD card just like you’d do with the prebuilt images and you’ll be up an running on your own Android build.
That’s all there is to it. Hope this helps, I tried to capture everything that I went through to get it working. Please let me know if you find any omissions or problems so that I can edit this post with any corrections.
Since the Linaro multimedia working group didn’t get to plan at the last Linaro Developers Summit, we held our own mini-summit at the beautiful IBM campus in Austin. It has been 3 weeks and I am just now able to think about other things like updating this blog due to the flurry of planning activities that followed. There are other factors at play too, one of them is I have agreed to take on the role of team lead for the multimedia working group. Even though my view now encompasses all multimedia, I will try to keep to this blogs original intent of writing about Linux sound and specifically ARM audio.
The Linaro multimedia working group, often referred to as MMWG, needed to hold the summit to share our plans and discuss the requirements for the upcoming development cycle. It was very well attended by key technical folks from all areas of ARM-based multimedia. Attending were representatives from Linaro, IBM, NVidia, Freescale, Texas Instruments, Collabora, ST-Ericsson, ARM and others as well as several who were able to dial-in. I had organized meet-ups before, but it was the first time I had organized an event this size. All in all, it went very well and I think everyone enjoyed the experience of meeting to discuss the challenges ahead of us.
Here is a group photo of the attendees at the ASoC and Embedded Linux Audio Conference in Edinburgh :
I’ve been a little busy lately with new assignments and travel. I just returned from two back-to-back conferences, in two different countries, in less than one week.
The first was the ASoC and Embedded Linux Audio Conference in Edinburgh. This was a gathering of about 30-40 multimedia developers from all over the world representing almost every company involved in this space and I was honored to be invited. After introductions, the 2 days worth of in-depth technical discussions got started with a description of the ASoC DSP support, focused on the description and charts shown here -> http://omapedia.org/wiki/Audio_Drive_Arch We then shifted to OS integration topics that mainly centered around Android’s need for a different ALSA user space lib, with more business favorable license terms. Several options were discussed. The UCM talk was next and with an initial brief overview and then enumerating the needs moving forward, including PulseAudio work. Next were discussions on QoS, run-time coefficients, firmware and events. The meeting drew to a close with a summary, questions time and assignments review. I drew the assignment for looking into getting an install script and git set up for the UCM profile config files, something we will need for Linaro. All in all, a great technical conference that was well prepared and useful. Also, it was a fantastic opportunity to meet everyone I have been interacting with in email and IRC, plus many new contacts. I look forward to attending the next one!
The second was the Linux Audio Conference in Dublin, aka, LAC2011. I worked with the planners of this conference to get the PulseAudio folks, including Lennart Poettering, a place to work. The space we were allocated was large enough to allow others to come and listen and ask a few questions. I want to apologize to the people that waited so patiently to ask questions. We had such an active discussion between the developers that they could hardly get a word in edge wise. I learned a lot and hopefully contributed to the overall discussion, direction and schedule. The rest of the conference was more general purpose for all things Linux Audio including: sound generation, sequencing, pro audio, and composition. I have followed this for many years now and it was really interesting to see how it continues to evolve. Even though it was a Linux conference, there were constant references to Apple and iPad integration with the applications used, even a session on running PulseAudio on Mac OS X. I think that mobile Linux has an opportunity to reach these folks.
Even though the trip was jam-packed, it was a perfect technical requirements review for going into the next development cycle for Linaro. They were both worth the hectic travel schedule.
The best way to learn code is to work on it. I did just that implementing a feature to add tsched buffer size to the configuration file. Late in the process, I discovered that it was already possible to pass it to the ALSA module, so I abandoned the additional code. Since it stumped me, I figured the configuration of PulseAudio might be somewhat confusing and could use a blog entry, hence this.
First, if you have not yet read PerfectSetup, start with that. You can find it here: http://www.pulseaudio.org/wiki/PerfectSetup
There are 3 places to change the configuration parameters and behavior of PulseAudio.
system.pa/default.pa – startup script to specify module loading, etc, module parameters are passed here, more on that later
client.conf – does just what is says, config file for clients
daemon.conf – configuration specific to the sound server daemon
On Ubuntu, these files are installed in /etc/pulse. The system.pa startup script is used when PulseAudio is used in system-wide mode. The other, daemon.conf is used when the sound server is started in user mode.
The values listed in these files are default values and are commented out. Obviously, uncommenting the parameter will not change anything unless the assignment is value changed.
The startup script can be used to pass module specific parameters. This is done by uncommenting the line in the file. For example, passing a new tsched buffer size to the ALSA module would look like this:
load-module module-alsa-sink tsched_buffer_size=XYZ
Here are all the module specific parameters for the ALSA module (from module-alsa-card.c) :
“name=<name for the card/sink/source, to be prefixed> ”
“card_name=<name for the card> ”
“card_properties=<properties for the card> ”
“sink_name=<name for the sink> ”
“sink_properties=<properties for the sink> ”
“source_name=<name for the source> ”
“source_properties=<properties for the source> ”
“namereg_fail=<pa_namereg_register() fail parameter value> ”
“device_id=<ALSA card index> ”
“format=<sample format> ”
“rate=<sample rate> ”
“fragments=<number of fragments> ”
“fragment_size=<fragment size> ”
“mmap=<enable memory mapping?> ”
“tsched=<enable system timer based scheduling mode?> ”
“tsched_buffer_size=<buffer size when using timer based scheduling> ”
“tsched_buffer_watermark=<lower fill watermark> ”
“profile=<profile name> ”
“ignore_dB=<ignore dB information from the device?> ”
“sync_volume=<syncronize sw and hw voluchanges in IO-thread?> ”
“profile_set=<profile set configuration file> “