<?xml version="1.0" encoding="iso-8859-15" ?>
<rss version="2.0" 
   xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" 
   xmlns:html="http://www.w3.org/1999/html" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
<channel>
   <title>I'll Break Your Audio</title>
   <link>http://0pointer.de/blog</link>
   <description>The Blog Formely Known As Kaisergemuese</description>
   <language>en</language>
   <copyright></copyright>
   <ttl>60</ttl>
   <pubDate>Tue, 19 Jan 2010 20:43 GMT</pubDate>
   <managingEditor>lennart (at) poettering (dot) de</managingEditor>
   <generator>PyBlosxom http://pyblosxom.sourceforge.net/ 1.4.3 01/10/2008</generator>
<item>
   <title>India, 360 Degrees at a Time, Part Seven</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-7</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-7.html</link>
   <description><![CDATA[

<p>Here's the seventh and <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">final</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-2.html">part</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-3.html">of</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-4.html">my</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-5.html">ongoing</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-6.html">series</a>.</p>

<p>One of the grandest sights in Delhi is <a href="http://en.wikipedia.org/wiki/Humayun%27s_Tomb">Humayun's tomb</a>, a predecessor of the greatest mausoleum of them all, the <a href="http://0pointer.de/static/tajmahal2.html">Taj Mahal</a>:</p>

<p><a href="http://0pointer.de/static/delhi3"><img alt="Humayun's Tomb" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/delhi3-gimped-small.jpeg" width="1024" height="174"/></a></p>

<p>A little bit further down a view on the garden:</p>

<p><a href="http://0pointer.de/static/delhi4"><img alt="Humayun's Tomb" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/delhi4-gimped-small.jpeg" width="1024" height="177"/></a></p>

<p>From a different corner:</p>

<p><a href="http://0pointer.de/static/delhi2"><img alt="Humayun's Tomb" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/delhi2-gimped-small.jpeg" width="1024" height="159"/></a></p>

<p>We'll finish with our last panorama that shows the courtyard the <a href="http://en.wikipedia.org/wiki/Jama_Masjid,_Delhi">Jama Masjid</a> of Old Delhi:</p>

<p><a href="http://0pointer.de/static/delhi5"><img alt="Jama Masjid" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/delhi5-gimped-small.jpeg" width="1024" height="183"/></a></p>

<p>That's all panoramas from this trip. Thanks for your interest.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Tue, 19 Jan 2010 20:43 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part Six</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-6</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-6.html</link>
   <description><![CDATA[

<p>Here's the sixth <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">part</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-2.html">of</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-3.html">my</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-4.html">ongoing</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-5.html">series</a>.</p>

<p>Leaving Jodhpur we continued our journey to <a href="http://en.wikipedia.org/wiki/Jaisalmer">Jaisalmer</a>, a sand castle of a town in the <a href="http://en.wikipedia.org/wiki/Thar_Desert">Thar desert</a>:</p>

<p><a href="http://0pointer.de/static/jaisalmer2"><img alt="Jaisalmer" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/jaisalmer2-gimped-small.jpeg" width="1024" height="213"/></a></p>

<p>In the vicinity of Jaisalmer you'll find cliche sand dunes like you'd expect from a grown-up desert:</p>

<p><a href="http://0pointer.de/static/jaisalmer1"><img alt="Jaisalmer" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/jaisalmer1-gimped-small.jpeg" width="1024" height="194"/></a></p>

<p>Our next station after a long, cold and dusty train ride was <a href="http://en.wikipedia.org/wiki/Delhi">Delhi</a>. The principal mosque of Old Delhi is the <a href="http://en.wikipedia.org/wiki/Jama_Masjid,_Delhi">Jama Masjid</a>:</p>

<p><a href="http://0pointer.de/static/delhi1"><img alt="Jama Masjid" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/delhi1-gimped-small.jpeg" width="1024" height="183"/></a></p>

<p>That's all for now, tomorrow I'll post the rest of my panoramas from this trip, all from Delhi.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Mon, 18 Jan 2010 21:14 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part Five</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-5</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-5.html</link>
   <description><![CDATA[

<p>Here's the fourth part <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">of</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-2.html">my</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-3.html">ongoing</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-4.html">series</a>.</p>

<p>After Udaipur the next stop on our trip was <a href="http://en.wikipedia.org/wiki/Jodhpur">Jodhpur</a>, the blue city. Which is called that way due of the blue colour of many of its houses:</p>

<p><a href="http://0pointer.de/static/jodhpur2"><img alt="Jodhpur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/jodhpur2-gimped-small.jpeg" width="1024" height="159"/></a></p>

<p>On a hill next to <a href="http://en.wikipedia.org/wiki/Mehrangarh_Fort">Mehrangarh Fort</a>, one of the biggest Forts in India (the big sand castle on the hill in the panorama above), you find the <a href="http://en.wikipedia.org/wiki/Jaswant_Thada">Jaswant Thada</a>, a memorial of the Maharajas of Jodhpur:</p>

<p><a href="http://0pointer.de/static/jodhpur1"><img alt="Jodhpur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/jodhpur1-gimped-small.jpeg" width="1024" height="235"/></a></p>

<p>Inside the fort you'll find highly decorated courtyards:</p>

<p><a href="http://0pointer.de/static/jodhpur3"><img alt="Jodhpur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/jodhpur3-gimped-small.jpeg" width="1024" height="247"/></a></p>

<p>That's all for Jodhpur, tomorrow I'll post more panoramas, from other stops of our trip.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Sun, 17 Jan 2010 17:43 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part Four</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-4</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-4.html</link>
   <description><![CDATA[

<p>Here's the fourth part of <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">my</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-2.html">ongoing</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-3.html">series</a>.</p>

<p>After Hampi we went to Bangalore to attend <a
href="http://foss.in/">foss.in</a>. (Fantastic conference, btw. The concerts at
the venue are unparalleled.) From there we flew up to <a
href="http://en.wikipedia.org/wiki/Udaipur">Udaipur</a>, in Rajasthan. Udaipur
is (among other things) famous for being the place where the central scenes of <a
href="http://en.wikipedia.org/wiki/Octopussy">Octopussy</a> were filmed.
Octopussy's famous white palace is on Jagniwas Island in Lake Pichola:</p>

<p><a href="http://0pointer.de/static/udaipur1"><img alt="Udaipur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/udaipur1-gimped-small.jpeg" width="1024" height="70"/></a></p>

<p>This panorama was taken from another island in the lake, Jagmandir Island, which is visible in the following shot on the left:</p>

<p><a href="http://0pointer.de/static/udaipur2"><img alt="Udaipur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/udaipur2-gimped-small.jpeg" width="1024" height="150"/></a></p>

<p>Udaipur's scenery, seen from the Maharaja's City Palace down onto Pichola Lake:</p>

<p><a href="http://0pointer.de/static/udaipur3"><img alt="Udaipur" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/udaipur3-gimped-small.jpeg" width="1024" height="175"/></a></p>

<p>That's all for Udaipur, tomorrow I'll post more panoramas, from other stops of our trip.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Sat, 16 Jan 2010 02:10 GMT</pubDate>
</item>
<item>
   <title>Announcing udev-browse</title>
   <guid isPermaLink="false">projects/udev-browse</guid>
   <link>http://0pointer.de/blog/projects/udev-browse.html</link>
   <description><![CDATA[

<p>It's easy to get lost in <tt>/sys</tt> and not much fun typing long
<tt>udevadm info</tt> command lines all the time. Today, when I had enough of
that I sat down and spent an hour to write a little UI for exploring the
udev/sysfs tree: <tt>udev-browse</tt>. I wrote it for my own use, but I am quite sure I am not the only
one who wants a little bit simpler access to the device tree. <a
href="http://git.0pointer.de/?p=udev-browse.git">So here you go.</a></p>

<p>And since everybody loves screenshots here you go:</p>

<p><a href="http://0pointer.de/public/udev-browse"><img src="http://0pointer.de/public/udev-browse" width="931" height="728" alt="udev-browse" style="border: 0px"/></a></p>

<p>Two usability hints: if you run <tt>udev-browse</tt> from a directory in
<tt>/sys</tt> <tt>udev-browse</tt> will automatically present the device of
that path on startup. And if you know the name of a device you can just type it
into the device listbox (which is focussed by default). The usual Gtk+ live
search will then find you the right entry right-away. It's pretty nifty.</p>

<p>It's written in Vala with minimal dependencies.</p>

<p>I want to keep the maintainership burden for this minimal. So no tarballs, no releases, and I won't reply to your emails regarding this tool, unless they include a good, clean, git formatted patch. Thank you for your understanding.</p>

<p>Anyone wants to package this for Fedora? I'd be very thankful if someone would pick it up.</p>

<p>Have fun.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sat, 16 Jan 2010 01:19 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part Three</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-3</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-3.html</link>
   <description><![CDATA[

<p>Here's the third part of my <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">ongoing</a> <a href="http://0pointer.de/blog/photos/india-360-at-a-time-2.html">series</a>.</p>

<p>Still in Hampi here's another 360 from the Hills in Hampi down to the Achyutaraya Temple:</p>

<p><a href="http://0pointer.de/static/hampi5"><img alt="Matanga Hill" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi5-gimped-small.jpeg" width="1024" height="234"/></a></p>

<p>A little further down, before dawn, here's a shot from the rocky path leading up the hill:</p>

<p><a href="http://0pointer.de/static/hampi6"><img alt="Matanga Hill" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi6-gimped-small.jpeg" width="1024" height="250"/></a></p>

<p>Our last picture for today is a view down from Hemakuta Hill which is
covered with old temples and other structures. In the middle you'll see the
large <a href="http://en.wikipedia.org/wiki/Virupaksha_Temple">Virupaksha
Temple</a> which is still in full use. In that temple you'll find an amazing <a
href="http://en.wikipedia.org/wiki/Camera_obscura">camera obscura</a>, a
physics teacher's dream that projects the temple tower onto a wall (<a
href="http://0pointer.de/photos/?gallery=India%20Karnataka%202009-11&amp;photo=871">projection</a>,
<a
href="http://0pointer.de/photos/?gallery=India%20Karnataka%202009-11&amp;photo=865">subject</a>, more interesting in reality. Really.)</p>

<p><a href="http://0pointer.de/static/hampi8"><img alt="Hemakuta Hill" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi8-gimped-small.jpeg" width="1024" height="155"/></a></p>

<p>That's all for Hampi, tomorrow I'll post more panoramas, from other stops of our trip.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Thu, 14 Jan 2010 22:47 GMT</pubDate>
</item>
<item>
   <title>Public Service Announcement: Beware of xmlCleanupParser()!</title>
   <guid isPermaLink="false">projects/beware-of-xmlCleanupParser</guid>
   <link>http://0pointer.de/blog/projects/beware-of-xmlCleanupParser.html</link>
   <description><![CDATA[

<p>Everyone and his dog seem to call libxml2's xmlCleanupParser() at
inappropriate places. For example <a
href="https://bugzilla.redhat.com/show_bug.cgi?id=532307">Empathy</a> does it,
and Abiword does it too. <a href="http://www.google.com/codesearch?q=xmlCleanupParser">Google Code Search</a> seems to reveal at least Inkscape and Dia
do it as well.</p>

<p>So, please, if your project links against libxml2 verify that it calls
xmlCleanupParser() only once, and right before exiting! And if it calls it more
often or somewhere else, then please fix that!</p>

<p>For more information <a
href="http://lists.fedoraproject.org/pipermail/devel/2010-January/129117.html">see
my post on fedora-devel</a>.</p>

<p>Thanks for your time.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Tue, 12 Jan 2010 23:29 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part Two</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-2</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-2.html</link>
   <description><![CDATA[

<p>Here's the second part of my <a href="http://0pointer.de/blog/photos/india-360-at-a-time-1.html">ongoing series</a>.</p>

<p>Climbing down the hills, on the banks of the Tungabhadra river you find people washing laundry and bathing, and <a href="http://0pointer.de/photos/?gallery=India%20Karnataka%202009-11&amp;photo=1434">coracles</a> waiting to be used for a trip through the river.</p>

<p><a href="http://0pointer.de/static/hampi2"><img alt="Tungabhadra River" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi2-gimped-small.jpeg" width="1024" height="146"/></a></p>

<p>The greatest of the ancient temples in Hampi is the <a href="http://en.wikipedia.org/wiki/Vijayanagara#Vittala_Temple">Vitthala Temple</a>:</p>

<p><a href="http://0pointer.de/static/hampi3"><img alt="Vitthala Temple" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi3-gimped-small.jpeg" width="1024" height="162"/></a></p>

<p>Set in in lush green scenery you find the Achyutaraya Temple, which you already might have seen, from above, in <a href="http://0pointer.de/static/hampi7">yesterday's series</a>:</p>

<p><a href="http://0pointer.de/static/hampi4"><img alt="Achyutaraya Temple" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi4-gimped-small.jpeg" width="1024" height="164"/></a></p>

<p>That's it for today, tomorrow I'll post more panoramas, both from Hampi and other stops of our trip.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Tue, 12 Jan 2010 18:05 GMT</pubDate>
</item>
<item>
   <title>India, 360 Degrees at a Time, Part One</title>
   <guid isPermaLink="false">photos/india-360-at-a-time-1</guid>
   <link>http://0pointer.de/blog/photos/india-360-at-a-time-1.html</link>
   <description><![CDATA[

<p>Yes, I won't spare you my panorama shots from my recent trip to India. After
arriving in Goa <a href="http://en.wikipedia.org/wiki/Badami">Badami</a> was
our next stop. It's a very pretty little town in northern Karnataka, and here's
a panorama shot from the entrance of the town's famous caves:</p>

<p><a href="http://0pointer.de/static/badami1"><img alt="Badami" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/badami1-gimped-small.jpeg" width="1024" height="324"/></a></p>

<p>Next step was one of the most amazing places on earth, <a
href="http://en.wikipedia.org/wiki/Hampi">Hampi</a> in central Karnataka. It
is definitely one of the greatest sights I have ever seen, and I guess I can
say I have seen quite a few in my life. A vast landscape of hills covered in
boulders, lush mango and banana plantations, rice fields, dotted with age-old
temples and impressive ruins. Locals crossing the river in <a href="http://0pointer.de/photos/?gallery=India%20Karnataka%202009-11&amp;photo=1434">coracles</a> that look
like they belong in a time centuries ago. Women washing colourful laundry in
the river, pilgrims wading across the river in their black clothes.  An India
that delivers every bit of that promise it makes to its visitors.  The ruins
rival the grand sites in Greece and the landscape sometimes looks like a
Crysis in-game scene.</p>

<p>Taken from one of the hills in Hampi this is the sunset:</p>

<p><a href="http://0pointer.de/static/hampi1"><img alt="Hampi Sunset" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi1-gimped-small.jpeg" width="1024" height="122"/></a></p>

<p>And then, the next day at dawn make your way up the hills again and you can get an even greater view on the whole scenery:</p>

<p><a href="http://0pointer.de/static/hampi7"><img alt="Hampi Dawn" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm" src="http://0pointer.de/static/hampi7-gimped-small.jpeg" width="1024" height="200"/></a></p>

<p>That's it for today, tomorrow I'll post more panoramas, both from Hampi and other stops of our trip.</p>

<p>Also, if you haven't seen them yet, don't miss <a href="http://0pointer.de/blog/photos/india-again.html">my panoramas from my India trip the year before</a>.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Mon, 11 Jan 2010 19:56 GMT</pubDate>
</item>
<item>
   <title>Jodhpur After Dark</title>
   <guid isPermaLink="false">photos/jodhpur</guid>
   <link>http://0pointer.de/blog/photos/jodhpur.html</link>
   <description><![CDATA[

<div> <a
href="http://0pointer.de/photos/?gallery=India%20Rajasthan%202009-12&amp;photo=1536"><img
src="http://0pointer.de/photos/galleries/India%20Rajasthan%202009-12/lq/img-1536.jpg"
width="320" height="480" alt="Jodhpur"/></a>&nbsp;<a
href="http://0pointer.de/photos/?gallery=India%20Rajasthan%202009-12&amp;photo=1505"><img
src="http://0pointer.de/photos/galleries/India%20Rajasthan%202009-12/lq/img-1505.jpg"
width="320" height="480" alt="Jodhpur"/></a>&nbsp;<a
href="http://0pointer.de/photos/?gallery=India%20Rajasthan%202009-12&amp;photo=1526"><img
src="http://0pointer.de/photos/galleries/India%20Rajasthan%202009-12/lq/img-1526.jpg"
width="320" height="480" alt="Jodhpur"/></a> </div>

<p>India is a weird and beautiful country. And I am too lazy to retouch my photos.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Thu, 31 Dec 2009 15:33 GMT</pubDate>
</item>
<item>
   <title>On OOM</title>
   <guid isPermaLink="false">projects/on-oom</guid>
   <link>http://0pointer.de/blog/projects/on-oom.html</link>
   <description><![CDATA[

<p>Building on what <a href="http://log.ometer.com/2008-02.html#4.2">Havoc
wrote two years ago about the fallacies of OOM safety (Out Of Memory) in user code</a> I'd
like to point you to <a
href="http://article.gmane.org/gmane.comp.audio.jackit/19998">this little mail
I just posted to jack-devel</a> which tries to give you the bigger picture.
Should be interesting for non-audio folks, too.</p>

<p>Say <b>NO</b> to OOM safety!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 13 Nov 2009 01:25 GMT</pubDate>
</item>
<item>
   <title>Public Service Announcement</title>
   <guid isPermaLink="false">projects/no-more-dmidecode</guid>
   <link>http://0pointer.de/blog/projects/no-more-dmidecode.html</link>
   <description><![CDATA[

<p>Folks! Since quite some time now the kernel exports the DMI machine
information below <tt>/sys/class/dmi/id/</tt>. You may stop now parsing the
output of <tt>dmidecode</tt> thus depending on external tools and privileged
code.</p>

<p>For example, to read your BIOS vendor string all you need to do is this:</p>

<pre>$ read bv &lt; /sys/class/dmi/id/bios_vendor
$ echo $bv</pre>

<p>Which is of course much simpler, and cleaner, and safer than anything involving <tt>dmidecode</tt>.</p>

<p>Thank you for your time!</p>


]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 06 Nov 2009 10:14 GMT</pubDate>
</item>
<item>
   <title>Ubuntu doesn't get it</title>
   <guid isPermaLink="false">projects/pa-in-ubuntu</guid>
   <link>http://0pointer.de/blog/projects/pa-in-ubuntu.html</link>
   <description><![CDATA[

<p>&lt;rant&gt;</p>

<p>So in the past Ubuntu packaged PA in a way that, let's say, was not
exactly optimal. I thought they'd gotten around fixing things since then. Turns
out they didn't. Seems in their upcoming release they again did some <a
href="https://bugs.launchpad.net/ubuntu/+source/pulseaudio/+bug/452458">genius
thing to make PA on Ubuntu perform worse than it could</a>. The Ubuntu kernel
contains all kind of closed-source and other crap to no limits, but backporting
a tiny patch that is blessed and merged upstream and in Fedora for ages, that
they won't do. Gah.</p>

<p>And it doesn't stop there. <a
href="http://bazaar.launchpad.net/~ubuntu-core-dev/pulseaudio/ubuntu/annotate/head%3A/debian/patches/0053-fix-sigsegv-module-bluetooth-device.patch">This
patch is an outright insult<a/>. <a
href="http://bazaar.launchpad.net/~ubuntu-core-dev/pulseaudio/ubuntu/annotate/head%3A/debian/patches/0090-disable-flat-volumes.patch">This
is disappointing</a>.</p>

<p>Madness. Not good, Ubuntu, really not good! And I'll get all the
complaints for this f**up again. Thanks!</p>

<p>/me is disappointed. Ubuntu, you really can do better than this.</p>

<p>&lt;/rant&gt;</p>



]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Mon, 19 Oct 2009 01:13 GMT</pubDate>
</item>
<item>
   <title>The Times They Are A-Changin'</title>
   <guid isPermaLink="false">projects/win7-plays-catchup</guid>
   <link>http://0pointer.de/blog/projects/win7-plays-catchup.html</link>
   <description><![CDATA[

<p>Kinda fun <a
href="http://channel9.msdn.com/shows/Going+Deep/Elliot-H-Omiya-Larry-Osterman-and-Frank-Yerrace-Inside-Windows-7-Audio-Stack/">watching
this video</a>. As it seems the big new features of the Windows 7 audio stack are the
ability to move streams while they are live, to do role-based policy routing,
and to pause streams during phone calls. Hah! That's so yesterday! <a
href="http://pulseaudio.org/">A certain sound server I happen to know very
well</a> has been supporting this for a longer time already, and you can even
buy that logic in <a href="http://maemo.nokia.com/n900/">various consumer
products</a>.</p>

<p>Nice to know that in some areas of the audio stack it's not us who need to
play catch-up with them, but they are the ones who need to play catch-up with
us.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sun, 18 Oct 2009 17:33 GMT</pubDate>
</item>
<item>
   <title>In The Press II</title>
   <guid isPermaLink="false">projects/cio-lpc-2k9</guid>
   <link>http://0pointer.de/blog/projects/cio-lpc-2k9.html</link>
   <description><![CDATA[

<p><a href="http://www.cio.com.au/article/320807/open_source_identity_pulseaudio_creator_lennart_poettering">CIO has an interview with me.</a></p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sat, 10 Oct 2009 14:38 GMT</pubDate>
</item>
<item>
   <title>In The Press</title>
   <guid isPermaLink="false">projects/lwn-lpc-2k9</guid>
   <link>http://0pointer.de/blog/projects/lwn-lpc-2k9.html</link>
   <description><![CDATA[

<p><a href="http://lwn.net/Articles/355542/">LWN covers Paul's and my talk at the Audio MC at LPC, Portland.</a> (Subscribers only for now)</p>

<p><b>Update:</b> <a
href="http://lwn.net/SubscriberLink/355542/e354c2205dade9e4/">Here's a free
subscriber link.</a></p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Wed, 07 Oct 2009 18:29 GMT</pubDate>
</item>
<item>
   <title>LPC Audio BoF Notes</title>
   <guid isPermaLink="false">projects/audio-bof-notes</guid>
   <link>http://0pointer.de/blog/projects/audio-bof-notes.html</link>
   <description><![CDATA[

<p>Here are some very short notes from the Audio BoF
at the <a href="http://linuxplumbersconf.org/2009/">Linux Plumbers
Conference</a> in Portland two weeks ago. Sorry for the delay!</p>

<p>Biggest issue discussed was audio routing. On embedded devices this gets
more complex each day, and there are a lot of open questions on the desktop,
too. Different DSP scenarios; how do mixer controls match up with PCM streams
and jack sensing? How do we determine which volume control sliders that are in
the pipeline we are currently interested in? How does that relate to policy
decisions? Format to store audio routing in?</p>

<p>The <a href="http://www.slimlogic.co.uk/?p=40">ALSA scenario subsystem</a>
currently being worked on by Liam Girdwood and the folks at SlimLogic and
currently on its way to being integrated into ALSA proper hopefully helps us,
so that we can strip a lot of complexity related to the routing logic from
PulseAudio and move it into a lower level which naturally knows more about the
hardware's internal routing.</p>

<p>Does it make sense for some apps to bypass the ALSA userspace layer and
to talk to the kernel drivers via ioctl()s directly?i (i.e. thus not depending on ALSA's
LISP intepreter, and a lot of other complexities)? Probably yes, but certainly
not in the short term future. Salsa? libsydney?</p>

<p>Should the timing deviation estimation/interpolation be moved from
PulseAudio into the kernel? Might be a good idea. Particularly interesting
when we try to to monitor not only the system and audio clocks, but the video
output and particularly the video input (i.e. video4linux) clocks, too. A
unified kernel-based timing system has advantages in accuracy, allows better
handling of (pseudo-) atomic timing snapshots, and would centralize timing
handling not only between different applications (PA and JACK) but also
between different subsystems.  Problem: current timing stuff in PulseAudio
might be a bit too homegrown for moving it 1:1 into the kernel. Also, depends
on FP. Needs someone to push this. Apple does the clock handling in the
kernel. How does this relate to ALSA's timer API?</p>

<p>Seems Ubuntu is going to kill OSS pretty soon too, following Fedora's lead. Yay!</p>

<p>And that's all I have. Should be the biggest points raised. Ping me if I
forgot something.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Tue, 06 Oct 2009 23:36 GMT</pubDate>
</item>
<item>
   <title>Latency Control</title>
   <guid isPermaLink="false">projects/latency-control</guid>
   <link>http://0pointer.de/blog/projects/latency-control.html</link>
   <description><![CDATA[

<p>An often asked question is how to properly talk to <a
href="http://pulseaudio.org/">PulseAudio</a> from within applications where
latency matters. To answer that question once and for all I've <a
href="http://pulseaudio.org/wiki/LatencyControl">written this guide in our
Wiki</a> that should light things up a little. If you are interested in audio
latency in PA, want to know how to minimize CPU usage and power consumption or
how to maximize drop-out safety make sure to read this!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Tue, 06 Oct 2009 18:49 GMT</pubDate>
</item>
<item>
   <title>Canonical,</title>
   <guid isPermaLink="false">projects/canonical-contributions</guid>
   <link>http://0pointer.de/blog/projects/canonical-contributions.html</link>
   <description><![CDATA[

<p>one small note: requiring <a
href="http://www.canonical.com/contributors">copyright assignment</a> from
contributors, and putting your code in exotic VCSes that only a minority of
potential contributors know or are willing to use is not helpful for attracting
contributions -- right the contrary, it scares them away. Please fix that!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Mon, 05 Oct 2009 19:17 GMT</pubDate>
</item>
<item>
   <title>Conferences</title>
   <guid isPermaLink="false">projects/lpc-bluez-maemo-2009</guid>
   <link>http://0pointer.de/blog/projects/lpc-bluez-maemo-2009.html</link>
   <description><![CDATA[

<p>Last week I've been at the <a
href="http://linuxplumbersconf.org/2009/">Linux Plumbers Conference</a> in
Portland. Like last year it kicked ass and proved again being one of the most
relevant Linux developer conferences (if not <i>the</i> most relevant one). I
ran the Audio MC at the conference which was very well attended. The slides
for our <a href="http://linuxplumbersconf.org/2009/program/">four talks in the
track are available online</a>. (My own slides are probably a bit too terse
for most readers, the interesting stuff was in the talking, not the
reading...) Personally, for me the most interesting part was to see to which
degree Nokia actually adopted <a href="http://pulseaudio.org/">PulseAudio</a>
in the N900.  While I was aware that Nokia was using it, I wasn't aware that
their use is as comprehensive as it turned out it is. And the industry
support from other companies is really impressive too. After the main track we
had a BoF session, which notes I'll post a bit later. Many thanks to Paul,
Jyri, Pierre for their great talks. Unfortunately, Palm, the only manufacturer
who is actually already shipping a phone with PulseAudio didn't send anyone to
the conference who wanted to talk about that. Let's hope they'll eventually
learn that just throwing code over the wall is not how Open Source works.
Maybe they'll send someone to next year's LPC in Boston, where I hope to be
able to do the Audio MC again.</p>

<p>Right now I am at the BlueZ Summit in Stuttgart. Among other things we have
been discussing how to improve Bluetooth Audio support in PulseAudio. I guess
one could say thet the Bluetooth support in PulseAudio is already one of its
highlights, in fact working better then the support on other OSes (yay, that's
an area where Linux Audio really shines!). So up next is better support for
allowing PA to receive A2DP audio, i.e. making PA act as if it was a Headset or
your hifi. Use case: send music from from your mobile to your desktop's hifi
speakers. (Actually this is already support in current BlueZ/PA versions, but
not easily accessible). Also Bluetooth headsets tend to support AC3 or MP3
decoding natively these days so we should support that in PA too. Codec
handling has been on the TODO list for PA for quite some time, for the SPDIF or
HDMI cases, and Bluetooth Audio is another reason why we really should have
that.</p>

<p>Next week I'll be at the <a
href="http://wiki.maemo.org/Maemo_Summit_2009">Maemo Summit</a> in Amsterdam.
Nokia kindly invited me. Unfortunately I was a bit too late to get a proper
talk accepted.  That said, I am sure if enough folks are interested we could do
a little ad-hoc BoF and find some place at the venue for it. If you have any
questions regarding PA just talk to me. The N900 uses PulseAudio for all things
audio so I am quite sure we'll have a lot to talk about.</p>

<p>See you in Amsterdam!</p>

<p>One last thing: Check out <a
href="http://colin.guthr.ie/2009/10/kde-plus-pulseaudio-does-not-equal-sucks/">Colin's
work to improve integration of PulseAudio and KDE</a>!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 02 Oct 2009 14:57 GMT</pubDate>
</item>
<item>
   <title>Plumbers 2009 Audio Bof Thu, 10:00 am</title>
   <guid isPermaLink="false">projects/plumbers-audio-bof</guid>
   <link>http://0pointer.de/blog/projects/plumbers-audio-bof.html</link>
   <description><![CDATA[

<p>Tomorrow, Thu 24th 10 am, there's going to be an Audio BoF at LPC Portland, Salon E. Don't miss it.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Wed, 23 Sep 2009 23:10 GMT</pubDate>
</item>
<item>
   <title>Skype</title>
   <guid isPermaLink="false">projects/skype</guid>
   <link>http://0pointer.de/blog/projects/skype.html</link>
   <description><![CDATA[

<p>A quick update on Skype: the next Skype version will include native
PulseAudio support. And not only that but they even <a
href="http://0pointer.de/blog/projects/tagging-audio.html">tag their audio
streams properly</a>. This enables PulseAudio to do fancy stuff like
automatically pausing your audio playback when you have a phone call. Good job!</p>

<p>In some ways they are now doing a better job with integration in to the modern
audio landscape than some Free Software telephony applications!</p>

<p>Unfortunately they didn't fix the biggest bug though: it's still not Free
Software!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Tue, 22 Sep 2009 17:51 GMT</pubDate>
</item>
<item>
   <title>More Mutrace</title>
   <guid isPermaLink="false">projects/mutrace2</guid>
   <link>http://0pointer.de/blog/projects/mutrace2.html</link>
   <description><![CDATA[

<p>Here's a list of quick updates on my <a
href="http://git.0pointer.de/?p=mutrace.git"><tt>mutrace</tt></a> mutex profiler since
<a href="http://0pointer.de/blog/projects/mutrace.html">my initial announcement two weeks ago</a>:</p>

<p>I added some special support for tracking down use of mutexes in realtime
threads. It's a very simple extension that -- if enabled -- checks on each
mutex operation wheter it is executed by a realtime thread or not. (--track-rt) The
output of a test run of this you can find in <a href="http://lalists.stanford.edu/lad/2009/09/0116.html">this announcement on LAD</a>.
Particularly interesting is that you can use this to track down which mutexes
are good candidates for priority inheritance.</p>

<p>The mutrace tarball now also includes a companion tool <tt>matrace</tt>
that can be used to track down memory allocation operations in realtime
threads. See the same lad announcement as above for example output of this
tool.</p>

<p>With help from Boudewijn Rempt I added some compatibility code for
profiling C++/Qt apps with mutrace, which he already used <a href="http://mail.kde.org/pipermail/kimageshop/2009-September/007471.html">for some</a> <a href="http://mail.kde.org/pipermail/kimageshop/2009-September/007470.html">interesting
profiling results</a> on krita.</p>

<p>Finally, after my comments on the locking hotspots in glib's type system,
Wim Taymans and Edward Hervey worked on turning the mutex-emulated rwlocks
into OS native ones with quite positive results, <a href="https://bugzilla.gnome.org/show_bug.cgi?id=585375">for more information see this
bug</a>.</p>

<p>As soon as <a href="https://bugzilla.redhat.com/show_bug.cgi?id=523553">my review request</a> is fully processed mutrace will be available
in rawhide.</p>

<p>A snapshot tarball of <tt>mutrace</tt> <a
href="http://0pointer.de/public/mutrace-0.1.tar.gz">you may find here</a>
(despite the name of the tarball that's just a snapshot, not the real release
0.1), for all those folks who are afraid of git, or don't have a current
autoconf/automake/libtool installed.</p>

<p><a href="http://lwn.net/Articles/352828/">Oh, and they named a unit after me.</a></p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Tue, 22 Sep 2009 17:38 GMT</pubDate>
</item>
<item>
   <title>Measuring Lock Contention</title>
   <guid isPermaLink="false">projects/mutrace</guid>
   <link>http://0pointer.de/blog/projects/mutrace.html</link>
   <description><![CDATA[

<p>When naively profiling multi-threaded applications the time spent waiting
for mutexes is not necessarily visible in the generated output. However lock
contention can have a big impact on the runtime behaviour of applications. On
Linux <a href="http://valgrind.org/docs/manual/drd-manual.html">valgrind's
drd</a> can be used to track down mutex contention. Unfortunately running
applications under valgrind/drd slows them down massively, often having the
effect of itself generating many of the contentions one is trying to track
down. Also due to its slowness it is very time consuming work.</p>

<p>To improve the situation if have now written <a
href="http://git.0pointer.de/?p=mutrace.git">a mutex profiler called
<tt>mutrace</tt></a>. In contrast to valgrind/drd it does not virtualize the
CPU instruction set, making it a lot faster. In fact, the hooks <tt>mutrace</tt>
relies on to profile mutex operations should only minimally influence
application runtime. <tt>mutrace</tt> is not useful for finding
synchronizations bugs, it is solely useful for profiling locks.</p>

<p>Now, enough of this introductionary blabla. Let's have a look on the data
<tt>mutrace</tt> can generate for you. As an example we'll look at
<tt>gedit</tt> as a bit of a prototypical Gnome application. Gtk+ and the other
Gnome libraries are not really known for their heavy use of multi-threading,
and the APIs are generally not thread-safe (for a good reason). However,
internally subsytems such as <tt>gio</tt> do use threading quite extensibly.
And as it turns out there are a few hotspots that can be discovered with
<tt>mutrace</tt>:</p>

<pre>
$ LD_PRELOAD=/home/lennart/projects/mutrace/libmutrace.so gedit
mutrace: 0.1 sucessfully initialized.
</pre>

<p>gedit is now running and its mutex use is being profiled. For this example
I have now opened a file with it, typed a few letters and then quit the program
again without saving. As soon as gedit exits <tt>mutrace</tt> will print the
profiling data it gathered to stderr. <a
href="http://0pointer.de/public/mutrace.txt">The full output you can see
here.</a> The most interesting part is at the end of the generated output, a
breakdown of the most contended mutexes:</p>

<pre>
mutrace: 10 most contended mutexes:

 Mutex #   Locked  Changed    Cont. tot.Time[ms] avg.Time[ms] max.Time[ms]       Type
      35   368268      407      275      120,822        0,000        0,894     normal
       5   234645      100       21       86,855        0,000        0,494     normal
      26   177324       47        4       98,610        0,001        0,150     normal
      19    55758       53        2       23,931        0,000        0,092     normal
      53      106       73        1        0,769        0,007        0,160     normal
      25    15156       70        1        6,633        0,000        0,019     normal
       4      973       10        1        4,376        0,004        0,174     normal
      75       68       62        0        0,038        0,001        0,004     normal
       9     1663       52        0        1,068        0,001        0,412     normal
       3   136553       41        0       61,408        0,000        0,281     normal
     ...      ...      ...      ...          ...          ...          ...        ...

mutrace: Total runtime 9678,142 ms.
</pre>

<p>(Sorry, LC_NUMERIC was set to de_DE.UTF-8, so if you can't make sense of
all the commas, think <tt>s/,/./g</tt>!)</p>

<p>For each mutex a line is printed. The 'Locked' column tells how often the
mutex was locked during the entire runtime of about 10s. The 'Changed' column
tells us how often the owning thread of the mutex changed. The 'Cont.' column
tells us how often the lock was already taken when we tried to take it and we
had to wait. The fifth column tell us for how long during the entire runtime
the lock was locked, the sixth tells us the average lock time, and the seventh
column tells us the longest time the lock was held. Finally, the last column
tells us what kind of mutex this is (recursive, normal or otherwise).</p>

<p>The most contended lock in the example above is #35. 275 times during the
runtime a thread had to wait until another thread released this mutex. All in
all more then 120ms of the entire runtime (about 10s) were spent with this
lock taken!</p>

<p>In the full output we can now look up which mutex #35 actually is:</p>

<pre>
Mutex #35 (0x0x7f48c7057d28) first referenced by:
	/home/lennart/projects/mutrace/libmutrace.so(pthread_mutex_lock+0x70) [0x7f48c97dc900]
	/lib64/libglib-2.0.so.0(g_static_rw_lock_writer_lock+0x6a) [0x7f48c674a03a]
	/lib64/libgobject-2.0.so.0(g_type_init_with_debug_flags+0x4b) [0x7f48c6e38ddb]
	/usr/lib64/libgdk-x11-2.0.so.0(gdk_pre_parse_libgtk_only+0x8c) [0x7f48c853171c]
	/usr/lib64/libgtk-x11-2.0.so.0(+0x14b31f) [0x7f48c891831f]
	/lib64/libglib-2.0.so.0(g_option_context_parse+0x90) [0x7f48c67308e0]
	/usr/lib64/libgtk-x11-2.0.so.0(gtk_parse_args+0xa1) [0x7f48c8918021]
	/usr/lib64/libgtk-x11-2.0.so.0(gtk_init_check+0x9) [0x7f48c8918079]
	/usr/lib64/libgtk-x11-2.0.so.0(gtk_init+0x9) [0x7f48c89180a9]
	/usr/bin/gedit(main+0x166) [0x427fc6]
	/lib64/libc.so.6(__libc_start_main+0xfd) [0x7f48c5b42b4d]
	/usr/bin/gedit() [0x4276c9]
</pre>

<p>As it appears in this Gtk+ program the rwlock <tt>type_rw_lock</tt>
(defined in glib's <tt>gobject/gtype.c</tt>) is a hotspot. GLib's rwlocks are
implemented on top of mutexes, so an obvious attempt in improving this could
be to actually make them use the operating system's rwlock primitives.</p>

<p>If a mutex is used often but only ever by the same thread it cannot starve
other threads. The 'Changed.' column lists how often a specific mutex changed
the owning thread. If the number is high this means the risk of contention is
also high. The 'Cont.' column tells you about contention that actually took
place.</p>

<p>Due to the way <tt>mutrace</tt> works we cannot profile mutexes that are
used internally in glibc, such as those used for synchronizing <tt>stdio</tt>
and suchlike.</p> <p><tt>mutrace</tt> is implemented entirely in userspace. It
uses all kinds of exotic GCC, glibc and kernel features, so you might have a
hard time compiling and running it on anything but a very recent Linux
distribution. I have tested it on Rawhide but it should work on slightly older
distributions, too.</p>

<p>Make sure to build your application with <tt>-rdynamic</tt> to make the
backtraces <tt>mutrace</tt> generates useful.</p>

<p>As of now, <tt>mutrace</tt> only profiles mutexes. Adding support for
rwlocks should be easy to add though. Patches welcome.</p>

<p>The output <tt>mutrace</tt> generates can be influenced by various
<tt>MUTRACE_xxx</tt> environment variables. See the sources for more
information.</p>

<p>And now, please take <tt>mutrace</tt> and profile and speed up your application!</p>

<p><a href="http://git.0pointer.de/?p=mutrace.git">You may find the sources in my
git repository.</a></p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Mon, 14 Sep 2009 22:07 GMT</pubDate>
</item>
<item>
   <title>pthread_key_create() is dangerous</title>
   <guid isPermaLink="false">projects/pthread-key-create</guid>
   <link>http://0pointer.de/blog/projects/pthread-key-create.html</link>
   <description><![CDATA[

<p>If you use <tt>pthread_key_create()</tt> with a non-NULL <tt>destructor</tt>
parameter (or an equivalent TLS construct) in a library/shared object then you
<i>MUST</i> link your library wth <tt>-z nodelete</tt> (or an equivalent
construct).</p>

<p>If you don't, then you'll have a lot of fun (like I just had) debugging
segfaults in the TLS destruction logic where functions are called that might
not even exist anymore in memory.</p>

<p>Now don't tell me I hadn't told you.</p>

<p>(Oh, and I hope I don't need to mention that all GObject-based libraries should
link with <tt>-z nodelete</tt> anyway, for making sure the type system doesn't
break.)</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Mon, 10 Aug 2009 20:39 GMT</pubDate>
</item>
<item>
   <title>The Highest Man in Spain</title>
   <guid isPermaLink="false">photos/canaries-360</guid>
   <link>http://0pointer.de/blog/photos/canaries-360.html</link>
   <description><![CDATA[

<p>Ever wanted to know what's the view like being the highest person in all of Spain? -- No? Hmm, can't help you then. -- Otherwise:</p>
<p><a href="http://0pointer.de/static/teide2"><img alt="Pico del Teide" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/teide2-small.jpeg" width="1024" height="230"/></a></p>

<p>That's on the summit of <a href="http://en.wikipedia.org/wiki/Pico_del_Teide">Pico del Teide</a> at 3718m, on <a href="http://en.wikipedia.org/wiki/Tenerife">Tenerife island</a>. Unless you leave solid ground this is as high as you can get in Spain. 163m lower it's a bit more obvious that the Teide is a volcano:</p>
<p><a href="http://0pointer.de/static/teide"><img alt="Pico del Teide" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/teide-small.jpeg" width="1024" height="184"/></a></p>

<p>And coming down to the surrounding caldera it's even more obvious:</p>
<p><a href="http://0pointer.de/static/teide3"><img alt="Pico del Teide" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/teide3-small.jpeg" width="1024" height="260"/></a></p>
<p><a href="http://0pointer.de/static/teide4"><img alt="Pico del Teide" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/teide4-small.jpeg" width="1024" height="296"/></a></p>
<p><a href="http://0pointer.de/static/teide5"><img alt="Pico del Teide" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/teide5-small.jpeg" width="1024" height="229"/></a></p>

<p>On a ridge next to the caldera you find the <a href="http://en.wikipedia.org/wiki/Teide_Observatory">Teide Observatory</a>:</p>
<p><a href="http://0pointer.de/static/observatory"><img alt="Teide Observatory" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/observatory.jpeg" width="1024" height="98"/></a></p>

<p>The caldera is covered in old lava flows:</p>
<p><a href="http://0pointer.de/static/caldera"><img alt="Caldera" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/caldera-small.jpeg" width="1024" height="240"/></a></p>
<p><a href="http://0pointer.de/static/caldera2"><img alt="Caldera" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/caldera2-small.jpeg" width="1024" height="307"/></a></p>

<p>Vulcanism has created various interesting rock formations in the caldera:</p>
<p><a href="http://0pointer.de/static/roques"><img alt="Roques" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/roques-small.jpeg" width="1024" height="194"/></a></p>
<p><a href="http://0pointer.de/static/roques2"><img alt="Roques" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/roques2-small.jpeg" width="1024" height="176"/></a></p>

<p>Tenerife is not just about the Teide and its dusty caldera. In the north of the island you find the <a href="http://en.wikipedia.org/wiki/Macizo_de_Anaga">Anaga mountain range</a>:</p>
<p><a href="http://0pointer.de/static/tenerife-north"><img alt="Tenerife North" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/tenerife-north-small.jpeg" width="1024" height="175"/></a></p>

<p>Neighboring <a href="http://en.wikipedia.org/wiki/Gran_Canaria">Gran Canaria</a> was where our little trip started and ended, right after the <a href="http://www.grancanariadesktopsummit.org/">Gran Canaria Desktop Summit</a>. Gran Canaria has no Teide but a very impressive landscape nonetheless:</p>

<p><a href="http://0pointer.de/static/nublo"><img alt="Roque Nublo" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/nublo-small.jpeg" width="1024" height="210"/></a></p>

<p>That's the view from the <a href="http://en.wikipedia.org/wiki/Roque_Nublo">Roque Nublo</a>, the island's most famous landmark. The rock itself is visible here (on the left):</p>
<p><a href="http://0pointer.de/static/nublo2"><img alt="Roque Nublo" style="border: 10px solid #232729; background-color: #6b6c6; padding: 1px; -moz-border-radius: 7px; margin: 0.5cm"  src="http://0pointer.de/static/nublo2-small.jpeg" width="1024" height="176"/></a></p>


]]></description>
   <category domain="http://0pointer.de/blog">/photos</category>
   <pubDate>Sun, 09 Aug 2009 20:22 GMT</pubDate>
</item>
<item>
   <title>Oh Nine Sixteen</title>
   <guid isPermaLink="false">projects/oh-nine-sixteen</guid>
   <link>http://0pointer.de/blog/projects/oh-nine-sixteen.html</link>
   <description><![CDATA[

<p>As a followup to <a
href="http://0pointer.de/blog/projects/oh-nine-fifteen.html">Oh Nine
Fifteen</a> here's a little overview of the changes coming with <a
href="http://pulseaudio.org/">PulseAudio 0.9.16</a> which will be part of
Fedora 12 (already in Rawhide; I think Ubuntu Karmic (?) will have it
too).</p>

<h3>A New Mixer Logic</h3>

<p>We now try to control more than just a single ALSA mixer element for volume
control. This increases the hardware volume range and granularity exposed and
should also help minimizing problems by incomplete or incorrect default mixer
initialization on the lower levels.</p>

<p>This also adds support for allowing selection of input/output ports for
sound cards.  This is used to expose changing between Mic vs. Line-In for input
source selection and Headphones vs. Speaker for output selection (of course the
list of available port is strictly dependant on what you hardware supports).
The list of available ports is deliberately kept minimal.</p>

<p>Thanks to Bastien the newest GNOME Volume Control now exposes profile/port
switching quite nicely, <a
href="http://www.hadess.net/2009/07/bad-at-updates-easy-51.html">which he
blogged about.</a> <a href="http://0pointer.de/public/g-v-c-ports">This
screenshot shows how the port (here called 'Connector') can be selected
in the new dialog.</a></p>

<p>The mixer rework also allows us to handle semi-pro/pro sound cards a bit
more flexibly. For example, which profiles/ports are exposed in PulseAudio or
how specific mixer elements are handled can now be controlled by editing .ini
file like configuration files in <tt>/usr/share/pulseaudio/alsa-mixer/</tt>.
<a
href="https://tango.0pointer.de/pipermail/pulseaudio-discuss/2009-June/004229.html">Read
this mail for more information about this.</a></p>

<h3>UPnP MediaServer Support</h3>

<p>PulseAudio now integrates with Zeeshan's fabulous <a
href="http://live.gnome.org/Rygel">Rygel UPnP/DLNA MediaServer</a>. If enabled
Rygel will automatically expose all local audio devices which are managed by
PulseAudio as UPnP/DLNA MediaServer items which your UPnP/DLNA MediaRenderers
can now tune into. (Meaning: you can now stream audio from your PC  directly to
your UPnP DMP (Digital Media Player) device, such as the PS3.) Communication
between Rygel and PulseAudio follows our little <a
href="http://live.gnome.org/Rygel/MediaServerSpec">Media Server Spec on the
GNOME Wiki</a>. This nicely complements the RAOP (Apple Airport) support we
introduced in PulseAudio 0.9.15. In one of the next versions of
PulseAudio/Rygel we hope to add support for PulseAudio becoming a MediaRenderer
as well. This will then not only allow you to stream from your PC to your
DMP device, but also allows PulseAudio to act as
"networked speaker", which can be used by any UPnP/AV/DLNA control point, such
as Windows' Media Player.</p>

<h3>Hotplug Support Improved</h3>

<p>If you select a particular device as the default for a specific application
or class of streams, then when unplugging the device PulseAudio moves the stream
automatically to another audio device if one exists. New in PulseAudio 0.9.16
is that if you replug the audio device the stream will instantly be moved back,
requiring no further user intervention.</p>

<p>Also, PulseAudio now includes some implicit rules for doing the 'right
thing' when finding an audio device for an application. For example, unless
configured otherwise it will now route telephony applications automatically to
Bluetooth headsets if one is connected, in favour of the internal sound card of
the computer.</p>

<h3>Surround Sound Support for Event Sounds</h3>

<p>This is more a new feature of <a
href="http://0pointer.de/lennart/projects/libcanberra/">libcanberra</a> than
of PulseAudio, but nonetheless: we now support surround for events sounds.
This allows us to play full 5.1 login sounds for example, in best THX cinema
fashion. We'd love to ship a 5.1 sound for login by default in <a
href="http://cgit.freedesktop.org/~mccann/sound-theme-freedesktop/">sound-theme-freedesktop</a>.
We'd be very thankful if <i>you</i> would be willing to contribute a sound
here, or two! A sound a bit less bombastic than the famous cinema THX effect
would probably be a good idea though.</p>

<p>And then there's of course the usual batch of fixes and small improvements.
A substantial number of non-user visible changes have been made as well. For
example, as HAL is now obsolete PulseAudio now moved to udev for its device
discovery needs. We replaced our gdbm support by support for tdb. Also,
we stripped all security senstive code from PulseAudio, and ported it to use
<a href="http://0pointer.de/blog/projects/rtkit.html">RealtimeKit</a> instead.
For the upcoming distributions that means that PulseAudio will run as real-time
process by default, improving drop-out safety.</p>

<p>And for some extra PA eye-candy, have a look on <a
href="http://www.gnome-look.org/content/show.php/Impulse+-+PulseAudio+visualizer?content=99383">Impulse</a>!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Wed, 05 Aug 2009 00:30 GMT</pubDate>
</item>
<item>
   <title>World Domination Accomplished</title>
   <guid isPermaLink="false">projects/avahi-world-domination</guid>
   <link>http://0pointer.de/blog/projects/avahi-world-domination.html</link>
   <description><![CDATA[

<p>I hereby officially declare that I have reached my goal of world domination. <a
href="http://emacs-fu.blogspot.com/2009/07/emacs-23-is-very-near.html">Emacs 23
(apparently due today) ships with Avahi support out of the box.</a> Obviously,
one of the most natural combinations of software thinkable.</p>

<p>After Emacs, there's not much else I could win, or is there?</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Wed, 29 Jul 2009 19:03 GMT</pubDate>
</item>
<item>
   <title>Yet Another Kit</title>
   <guid isPermaLink="false">projects/rtkit</guid>
   <link>http://0pointer.de/blog/projects/rtkit.html</link>
   <description><![CDATA[

<p><a href="http://0pointer.de/blog/projects/cgroups-and-rtwatch">A while
back</a> I was celebrating that arrival of <i>secure</i> realtime scheduling
for the desktop.  As it appears this was a bit premature then, since (mis-)using
cgroups for this turned out to be more problematic and messy than I
anticipated.</p>

<p>As a followup I'd now like to point you to <a
href="http://lalists.stanford.edu/lad/2009/06/0191.html">this announcement I
posted to LAD yesterday</a>, introducing <a
href="http://git.0pointer.de/?p=rtkit.git">RealtimeKit</a> which should fix
the problem for good. It has now entered Rawhide becoming part of the default
install (by means of being a dependency of PulseAudio), and I assume the other
distros are going to adopt it pretty soon, too.</p>

<p><a href="http://lalists.stanford.edu/lad/2009/06/0191.html">Read the full announcement.</a></p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sat, 20 Jun 2009 19:29 GMT</pubDate>
</item>
<item>
   <title>Linux Plumbers Conference 2009 CFP Ending Soon!</title>
   <guid isPermaLink="false">projects/plumbersconf-2009</guid>
   <link>http://0pointer.de/blog/projects/plumbersconf-2009.html</link>
   <description><![CDATA[

<p>The <a href="http://linuxplumbersconf.org/2009/submit/">Call for Papers</a> for
the <a href="http://www.linuxplumbersconf.org/">Linux Plumbers Conference (LPC)</a>
in September in Portland, Oregon <a href="http://lwn.net/Articles/336707/">is ending soon</a>, on <b>June 15th 2009</b>. It's a conference
about the core infrastructure of Linux systems: the part of the system where
userspace and the kernel interface. It's the first conference where the focus
is specifically on getting together the kernel people who work on the
userspace interfaces and the userspace people who have to deal with kernel
interfaces. It's supposed to be a place where all the people doing
infrastructure work sit down and talk, so that each other understands better
what the requirements and needs of the other are, and where we can work
towards fixing the major problems we currently have with our lower-level
APIs.</p>

<p>Last year's conference was hugely successful. If you want to read up what
happened then, LWN <a href="http://lwn.net/Articles/297958/">has</a> <a
href="http://lwn.net/Articles/299088/">good</a> <a
href="http://lwn.net/Articles/300324/">coverage</a>.</p>

<p>Like last year, I will be running the Audio conference track of LPC. Audio
infrastructure on Linux is still heavily fragmented. Pro, desktop and embedded worlds are
very seperate. While we have quite good driver support the
user experience is far from perfect, mostly because our infrastructure is
so balkanized. Join us at the LPC and help to fix this! If you are doing <b>audio infrastructure work</b> on Linux, make sure to attend and <b>submit a paper!</b></p>

<p><a href="http://linuxplumbersconf.org/2009/register/">Sign up soon!</a> <a href="http://linuxplumbersconf.org/2009/submit/">Send in your paper quickly!</a></p>

<p><a href="http://www.linuxplumbersconf.org"><img style="border: 0" src="http://linuxplumbersconf.org/2009/style/tagline.png" alt="Plumbers Logo" width="493" height="90"/></a></p>

<p>See you in Portland!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 12 Jun 2009 14:18 GMT</pubDate>
</item>
<item>
   <title>Living in Berlin? You are a GNOMEr?</title>
   <guid isPermaLink="false">projects/berlin-gnomers</guid>
   <link>http://0pointer.de/blog/projects/berlin-gnomers.html</link>
   <description><![CDATA[

<p>If you live in Berlin and are a GNOMEr of some kind then please feel
invited top drop by tomorrow (Fri 29) at 4 pm at the <a
href="http://www.pratergarten.de/d/biergarten.php4">Prater Biergarten</a>
(Weather permitting outside, otherwise inside).  We'll have a little GNOME
get-together. For now, we know that at least the Openismus Berlin folks will
be there, as will I and presumably one special guest from Finland, and whoever
else wants to attend.</p>

<p>Hope to see you tomorrow!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Thu, 28 May 2009 21:50 GMT</pubDate>
</item>
<item>
   <title>The Sound of Fedora 11</title>
   <guid isPermaLink="false">projects/shameless-self-promotion</guid>
   <link>http://0pointer.de/blog/projects/shameless-self-promotion.html</link>
   <description><![CDATA[

<p><a href="http://jaboutboul.blogspot.com/2009/05/sound-of-fedora-11.html">I learned so much when I read this interview.</a> And so will you!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Thu, 21 May 2009 15:03 GMT</pubDate>
</item>
<item>
   <title>All About Fragments</title>
   <guid isPermaLink="false">projects/all-about-periods</guid>
   <link>http://0pointer.de/blog/projects/all-about-periods.html</link>
   <description><![CDATA[

<p>In my on-going series <i><a
href="http://0pointer.de/blog/projects/guide-to-sound-apis">Writing
Better Audio Applications</a></i> for Linux, here's another
installment: a little explanation how fragments/periods and buffer
sizes should be chosen when doing audio playback with traditional
audio APIs such as ALSA and OSS. This originates from <a
href="http://bugzilla.gnome.org/show_bug.cgi?id=572953#c5">some emails
I exchanged with the Ekiga folks</a>. In the last weeks I kept copying
this explanation to various other folks. I guess it would make sense
to post this on my blog here too to reach a wider audience. So here it
is, mostly unedited:</p>

<pre>
Yes. You shouldn't misuse the fragments logic of sound devices. It's
like this:

   The latency is defined by the buffer size.
   The wakeup interval is defined by the fragment size.

The buffer fill level will oscillate between 'full buffer' and 'full
buffer minus 1x fragment size minus OS scheduling latency'. Setting
smaller fragment sizes will increase the CPU load and decrease battery
time since you force the CPU to wake up more often. OTOH it increases
drop out safety, since you fill up playback buffer earlier. Choosing
the fragment size is hence something which you should do balancing out
your needs between power consumption and drop-out safety. With modern
processors and a good OS scheduler like the Linux one setting the
fragment size to anything other than half the buffer size does not
make much sense.

Your <i>[Ekiga's ptlib driver that is]</i> ALSA output is configured
to set the the fragment size to the size of your codec audio
frames. And that's a bad idea. Because the codec frame size has not
been chosen based on power consumption or drop-out safety
reasoning. It has been chosen by the codec designers based on
different reasoning, such as latency.

You probably configured your backend this ways because the ALSA
library docs say that it is recommended to write to the sound card in
multiples of the fragment size. However deducing from this that you
hence should configure the fragment size to the codec frame size is
wrong!

The best way to implement playback these days for ALSA is to write as
much as snd_pcm_avail() tells you to each time you wake up due to
POLLOUT on the sound card. If that is not a multiple of your codec
frame size then you need to buffer the the remainder of the decoded
data yourself in system memory.

The ALSA fragment size you should normally set as large as possible
given your latency constraints but that you have at least two
fragments in your buffer size.

I hope this explains a bit how frag_size/buffer_size should be
chosen. If you have questions, just ask.

(Oh, ALSA uses the term 'period' for what I call 'fragment'
above. It's synonymous)
</pre>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sat, 18 Apr 2009 23:34 GMT</pubDate>
</item>
<item>
   <title>GNOME now esound-free</title>
   <guid isPermaLink="false">projects/esound-free</guid>
   <link>http://0pointer.de/blog/projects/esound-free.html</link>
   <description><![CDATA[

<p><a href="http://blogs.gnome.org/aklapper/">Andre Klapper</a> just informed
me that GNOME is now officially <a href="http://en.wikipedia.org/wiki/Esound">esound</a>-free: all modules have been ported over
to <a href="http://0pointer.de/lennart/projects/libcanberra/">libcanberra</a>
for event sounds or GStreamer/PulseAudio for everything else. It's time to
celebrate!</p>

<p>It's an end of an era. The oldest version of esound in GNOME CVS is 0.2.1,
commited on May 11th 1998.  It has been shipped with every GNOME release since
1.0 back in 1999. (esound outside of GNOME dates even further back, probably
some time in the year 1997 or so). After almost 11 years in GNOME it's all over now.
Oh, those were the good times.</p>

<p>If you maintain a module that is not part of GNOME that still uses
esound, hurry and update yours as well!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Sun, 05 Apr 2009 18:23 GMT</pubDate>
</item>
<item>
   <title>What YOU need to know about Practical Real-Time Programming</title>
   <guid isPermaLink="false">projects/realtime-bossa</guid>
   <link>http://0pointer.de/blog/projects/realtime-bossa.html</link>
   <description><![CDATA[

<p><a href="http://etrunko.blogspot.com/">Eduardo Lima</a> just added a couple
of more videos from <a href="http://www.bossaconference.indt.org/">one of the
best conferences in existence</a> to <a href="http://openbossa.blip.tv/">the
OpenBOSSA</a> channel at blip.tv. Humbly as I am I'd like to ask everyone who
is interested in real-time and/or audio/video/animation programming <a
href="http://blip.tv/file/1953900"><b>to have a peek at this particular one</b></a>.</p>

<p>That's all.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 03 Apr 2009 23:38 GMT</pubDate>
</item>
<item>
   <title>Device Reservation Spec</title>
   <guid isPermaLink="false">projects/device-reservation</guid>
   <link>http://0pointer.de/blog/projects/device-reservation.html</link>
   <description><![CDATA[

<p>The <a href="http://jackaudio.org/">JACK</a> folks and I have agreed on a little specification for <a
href="http://git.0pointer.de/?p=reserve.git;a=blob_plain;f=reserve.txt">device
reservation</a> that allows clean hand-over of audio device access from
<a href="http://pulseaudio.org">PulseAudio</a> to JACK and back. The specification is generic enough to allow
locking/hand-over of other device types as well, not just audio cards. So, in
case someone needs to implement a similar kind of locking/handover for any kind of resource here's some
prior art you can base your work on. Given that HAL is supposed to go away
pretty soon this might be an option for a replacement for HAL's current device
locking. The logic is as simple as it can get. Whoever owns a certain service name on
the D-Bus session bus owns the device access. For further details, <a
href="http://git.0pointer.de/?p=reserve.git;a=blob_plain;f=reserve.txt">read the spec</a>.</p>

<p>There's even a <a href="http://git.0pointer.de/?p=reserve.git">reference
implementation</a> available, which both JACK2 and PulseAudio have now
integrated.</p>

<p>Also known as PAX SOUND SERVERIS.</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Thu, 26 Feb 2009 17:55 GMT</pubDate>
</item>
<item>
   <title>Having fun with bzr</title>
   <guid isPermaLink="false">projects/bizarre-fun</guid>
   <link>http://0pointer.de/blog/projects/bizarre-fun.html</link>
   <description><![CDATA[

<p>So I wanted to hack proper channel mapping query support into <a
href="http://www.mega-nerd.com/libsndfile">libsndfile</a>, something I have had
on my TODO list for years. The first step was to find the <a
href="http://www.mega-nerd.com/libsndfile/development.html">source code
repository for it</a>. That was easy. Alas the VCS used is bzr. There are some
very vocal folks on the Internet who claim that the bzr user interface is
stupendously easy to use in contrast to git which apparantly is the very
definition of complexity. And if it is stated on the Internet it must be true.
I think I mastered git quite well, so yeah, checking out the sources with bzr
can't be that difficult for my limited brain capacity.</p>

<p>So let's do what Erik suggests for checking out the sources:</p>

<pre>$ bzr get http://www.mega-nerd.com/Bzr/libsndfile-pub/</pre>

<p>Calling this I get a nice percentage counter that starts at 0% and ends at, ... uh, 0%. That gives me a real feeling of progress. It takes a while, and then I get an error:</p>

<pre>bzr: ERROR: Not a branch: "http://www.mega-nerd.com/Bzr/libsndfile-pub/".</pre>

<p>Now that's a useful error message. They even include an all-caps word! I guess that error message is right -- it's not a branch, it is a repository. Or is it not?</p>

<p>So what do we do about this? Maybe <tt>get</tt> is not actually the right verb. Let's try to play around a bit. Let's use the verb I use to get sources with in git:</p>

<pre>$ bzr clone http://www.mega-nerd.com/Bzr/libsndfile-pub/</pre>

<p>Hmm, this results in exactly same 0% to 0% progress counter, and the same useless error message.</p>

<p>Now I remember that bzr is actually more inspired by Subversion's UI than by git's, so let's try it the SVN way.</p>

<pre>$ bzr checkout http://www.mega-nerd.com/Bzr/libsndfile-pub/</pre>

<p>Hmm, and of course, I get exactly the same results again. A counter that counts from 0% to 0% and the same useless error message.</p>

<p>Ok, maybe that error is bzr's standard reply? Let's check this out:</p>

<pre>$ bzr waldo http://www.mega-nerd.com/Bzr/libsndfile-pub/
bzr: ERROR: unknown command "waldo"</pre>

<p>Apparently not. bzr actually knows more than one error message.</p>

<p>Ok, I admit doing this by trial-and-error is a rather lame approach. RTFM! So let's try this.</p>

<pre>$ man bzr-get
No manual entry for bzr-get</pre>

<p>Ouch. No man page? How awesome. Ah, wait, maybe they have only a single unreadable mega man page for everything. Let's try this:</p>

<pre>$ man bzr</pre>

<p>Wow, this actually worked. Seems to list all commands. Now let's look for the help on <tt>bzr get</tt>:</p>

<pre>/bzr get
Pattern not found  (press RETURN)</pre>

<p>Hmm, no documentation for their most important command? That's weird! Ok, let's try it again with our git vocabulary:</p>

<pre>/bzr clone
Pattern not found  (press RETURN)</pre>

<p>Ok, this not funny anymore. Apparently the verbs are listed in alphabetical order.
So let's browse to the letter <i>g</i> as in <tt>get</tt>. However it doesn't
exist. There's <tt>bzr export</tt>, and then the next entry is <tt>bzr
help</tt> (Oh, irony!) -- but no <tt>get</tt> in-between.</p>

<p>Ok, enough of this shit. Maybe the message wants to tell us that the repo
actually doesn't exist (even though it confusingly calls it a "branch"). Let's
go back to the original page at Erik's site and read things again. Aha, the
"<i>main archive archive can be found at (yes, the directory looks empty, but
it isn't):  <a
href="http://www.mega-nerd.com/Bzr/libsndfile-pub/">http://www.mega-nerd.com/Bzr/libsndfile-pub/</a>".</i>
Hmm, indeed -- that URL looks very empty when it is accessed. How weird though
that in bzr a repo is an empty directory!</p>

<p>And at this point I gave up and downloaded the tarball to make my patches
against. I have still not managed to check out the sources from the repo.
Somehow I get the feeling the actual repo really isn't available anymore under that address.</p>

<p>So why am I blogging about this? Not so much to start another flamefest, to
nourish the fanboys, nor because it is so much fun to bash other people's work or
simply to piss people off. It's more for two reasons:</p>

<p>Firstly, simply to make
the point that folks can claim a thousand times that git's UI sucks and bzr's
UI is awesome. It's simply not true. From what I experienced it is not the
tiniest bit better.  The error messages useless, the documentation incomplete,
the interfaces surprising and exactly as redundant as git's. The only
effective difference I noticed is that it takes a bit longer to show those
error messages with bzr -- the Python tax. To summarize this more positively: git excels as much as bzr does. Both' documentation, their error messages and their user interface are the best in their class. And they have all the best chances for future improvement.</p>

<p>And the second reason of course is that I'd still like to know what the correct way to get the sources is. But for that I should probably ask Erik himself.</p>


]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Wed, 25 Feb 2009 09:39 GMT</pubDate>
</item>
<item>
   <title>This is funny</title>
   <guid isPermaLink="false">got-style</guid>
   <link>http://0pointer.de/blog/got-style.html</link>
   <description><![CDATA[

<p><a href="http://userstyles.org/styles/6371">Uh?</a></p>

<p>Some folks apparently don't have much respect for my web design skills -- and I always considered myself the Malevich of web design! Pfft!</p>

]]></description>
   <category domain="http://0pointer.de/blog"></category>
   <pubDate>Mon, 23 Feb 2009 15:52 GMT</pubDate>
</item>
<item>
   <title>Generating Copyright Headers from git History</title>
   <guid isPermaLink="false">projects/copyright</guid>
   <link>http://0pointer.de/blog/projects/copyright.html</link>
   <description><![CDATA[

<p><a href="http://0pointer.de/public/copyright.py">Here's a little a little tool I
wrote</a> that automatically generates copyright headers for source files in a
git repository based on the git history.</p>

<p>Run it like this:</p>

<pre>~/projects/pulseaudio$ copyright.py src/pulsecore/sink.c src/pulsecore/core-util.c</pre>

<p>And it will give you this:</p>

<pre>
File: src/pulsecore/sink.c
	Copyright 2004, 2006-2009 Lennart Poettering
	Copyright 2006-2007 Pierre Ossman
	Copyright 2008-2009 Marc-Andre Lureau
File: src/pulsecore/core-util.c
	Copyright 2004, 2006-2009 Lennart Poettering
	Copyright 2006-2007 Pierre Ossman
	Copyright 2008 Stelian Ionescu
	Copyright 2009 Jared D. McNeill
	Copyright 2009 Marc-Andre Lureau
</pre>

<p>This little script could use love from a friendly soul to make it crawl entire source trees and patch in appropriate copyright headers. Anyone up for it?</p>




]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 20 Feb 2009 23:16 GMT</pubDate>
</item>
<item>
   <title>Tagging Audio Streams</title>
   <guid isPermaLink="false">projects/tagging-audio</guid>
   <link>http://0pointer.de/blog/projects/tagging-audio.html</link>
   <description><![CDATA[

<p>So you are hacking an audio application and the audio data you are
generating might eventually end up in <a
href="http://pulseaudio.org/">PulseAudio</a> before it is played. <b><a
href="http://pulseaudio.org/wiki/ApplicationProperties">If that's the case then please make sure
to read this!</a></b></p>

<p>Here's the quick summary for Gtk+ developers:</p>

<p>PulseAudio can enforce all kinds of policy on sounds. For example, starting
in 0.9.15, we will automatically pause your media player while a phone call is
going on. To implement this we however need to know what the stream you
are sending to PulseAudio should be categorized as: is it music? Is it a
movie? Is it game sounds? Is it a phone call stream?</p>

<p>Also, PulseAudio would like to show a nice icon and an application name next
to each stream in the volume control. That requires it to be able to deduce
this data from the stream.</p>

<p>And here's where you come into the game: please add three lines like the
following next to the beginning of your <tt>main()</tt> function to your Gtk+
application:</p>

<pre>
...
<a
href="http://library.gnome.org/devel/glib/unstable/glib-Miscellaneous-Utility-Functions.html#g-set-application-name">g_set_application_name</a>(_("Totem Movie Player"));
<a
href="http://library.gnome.org/devel/gtk/unstable/GtkWindow.html#gtk-window-set-default-icon-name">gtk_window_set_default_icon_name</a>("totem");
<a
href="http://library.gnome.org/devel/glib/unstable/glib-Miscellaneous-Utility-Functions.html#g-setenv">g_setenv</a>("PULSE_PROP_media.role", "video", TRUE);
...
</pre>

<p>If you do this then the PulseAudio client libraries will be able to figure out the rest for you.</p>

<p>There is more meta information (aka "properties") you can set for your application or for your streams that is useful to PulseAudio. In case you want to know more about them or you are looking for equivalent code to the above example for non-Gtk+ applications, <a href="http://pulseaudio.org/wiki/ApplicationProperties">make sure to read the mentioned page</a>.</p>

<p>Thank you!</p>

<p>Oh, and even if your app doesn't do audio, calling <tt>g_set_application_name()</tt> and <tt>gtk_window_set_default_icon_name()</tt> is always a good idea!</p>

]]></description>
   <category domain="http://0pointer.de/blog">/projects</category>
   <pubDate>Fri, 20 Feb 2009 21:02 GMT</pubDate>
</item>
</channel>
</rss>
