<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>return EWTF; &#187; KDE</title>
	<atom:link href="http://randomguy3.wordpress.com/category/kde/feed/" rel="self" type="application/rss+xml" />
	<link>http://randomguy3.wordpress.com</link>
	<description>Just press reset</description>
	<lastBuildDate>Thu, 09 Jul 2009 11:30:56 +0000</lastBuildDate>
	<generator>http://wordpress.com/</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<image>
		<url>http://www.gravatar.com/blavatar/b6a75efcff5f16bc9a6a2bb09fab5dd7?s=96&#038;d=http://s.wordpress.com/i/buttonw-com.png</url>
		<title>return EWTF; &#187; KDE</title>
		<link>http://randomguy3.wordpress.com</link>
	</image>
			<item>
		<title>Akuadec</title>
		<link>http://randomguy3.wordpress.com/2009/07/09/akuadec/</link>
		<comments>http://randomguy3.wordpress.com/2009/07/09/akuadec/#comments</comments>
		<pubDate>Thu, 09 Jul 2009 11:29:52 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[KDE]]></category>
		<category><![CDATA[GCDS]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=219</guid>
		<description><![CDATA[Another day of the Gran Canaria Desktop Summit.  After yesterday&#8217;s post, I got several offers of power adaptors.  However, I ended up buying one on my way back to the hotel, along with a bunch of food for lunch today (the lunches here at the university are poor and quite expensive for what [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=219&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Another day of the Gran Canaria Desktop Summit.  After yesterday&#8217;s post, I got several offers of power adaptors.  However, I ended up buying one on my way back to the hotel, along with a bunch of food for lunch today (the lunches here at the university are poor and quite expensive for what they are).</p>
<p>In fact, speaking of food, I had the worst meal I&#8217;ve had this week, and one of the worst I&#8217;ve had in my life, last night.  We went to a Chinese all-you-can-eat buffet.  Now, now, don&#8217;t scoff.  I&#8217;m had some good (although never excellent) food at all-you-can-eat buffets.  It seems that the Canary Islands is not the place for them, though.  This one was so bad that after my first plateful, I was still hungry but didn&#8217;t want to eat any more.  Avoid like the plague.</p>
<p>This was in direct contrast to the meal I had with the Amarok guys the night before, which was really nice (if expensive) &#8211; masses of paella, salad, chips and warm chocolate brownie.  It was seriously good.</p>
<p>Today we had more Amarok discussions.  So far we&#8217;ve discussed:</p>
<ul>
<li>liblastfm on Windows</li>
<li>Playlist synchronisation</li>
<li>Unit testing</li>
<li>Whether scripts should be able to respond to Amarok quitting (and potentially slow it down)</li>
<li>A UPnP collection</li>
<li>Reorganising the source files</li>
<li>Playdar</li>
<li>The UI for dynamic playlists, and context-sensitive information for the area on the left of Amarok (where collections and services etc. are)</li>
<li>The EngineController class</li>
<li>Mac/Windows ports</li>
</ul>
<p>Still to come:</p>
<ul>
<li>Media devices update</li>
<li>The evil &#8220;organise files&#8221; bug (pro tip: don&#8217;t use Amarok 2 to organise your files for now)</li>
<li>UI clutter</li>
</ul>
<p>We&#8217;ve had a very productive couple of days, and Leo&#8217;s been taking photos of the whiteboard, so we have a permanent record of our discussions.  Expect blog posts about the cooler things we discussed.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/219/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/219/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/219/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=219&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/07/09/akuadec/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Guademy</title>
		<link>http://randomguy3.wordpress.com/2009/07/08/guademy/</link>
		<comments>http://randomguy3.wordpress.com/2009/07/08/guademy/#comments</comments>
		<pubDate>Wed, 08 Jul 2009 17:09:01 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[KDE]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[GCDS]]></category>
		<category><![CDATA[KDE4]]></category>
		<category><![CDATA[now playing]]></category>
		<category><![CDATA[Plasma]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=217</guid>
		<description><![CDATA[It&#8217;s been a while since I posted.  Such is life.
I&#8217;m really enjoying my first Akademy.  I managed to forget a power adapter to convert between my British plug and the European sockets, but Nuno lent me one for a few days.  I now have to find my own, though, as he went [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=217&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>It&#8217;s been a while since I posted.  Such is life.</p>
<p>I&#8217;m really enjoying my <a href="http://www.grancanariadesktopsummit.org">first Akademy</a>.  I managed to forget a power adapter to convert between my British plug and the European sockets, but Nuno lent me one for a few days.  I now have to find my own, though, as he went home today.</p>
<p>So, the conference.  The keynotes on Saturday morning were really good.  I recommend watching them when the videos are online (which they may be already).  Of course, there is some furore over Richard Stallman&#8217;s talk, but I think that was always expected.</p>
<p>Yesterday was the KDE e.v. meeting, which I didn&#8217;t go to (not being a member of the e.v.).  Instead, I slept in (sleep has been in short supply), went to the beach, and hacked.  I put together a <a href="http://www.kde-look.org/content/show.php/Now+playing+controls?content=108130">small plasmoid</a> (87 lines of javascript) to show some controls for a media player.  The idea is that you can put this on an auto-hiding panel on your desktop so that they don&#8217;t take up screen real estate, but are easily accessibly just by moving your mouse.  The other half of the job, of course, is to do one that displays information.  Then you can have the information about what song is currently playing permanently visible, and the controls only appear when you want them.</p>
<p>Today we had a very productive discussion on moving KDE to <a href="http://git-scm.com/">Git</a>.  The aim (if everything goes swimmingly) seems to be to move before KDE 4.4 goes into freeze.  <a href="http://amarok.kde.org/">Amarok</a> is intending to move very soon, though.</p>
<p>Speaking of Amarok, we&#8217;ve been sitting in one of the labs discussing things since the Git <a href="http://en.wikipedia.org/wiki/Birds_of_a_Feather_(computing)">BoF</a>.  It&#8217;s amazing how much gets decided how quickly, especially when you&#8217;re used to deciding things on mailing lists.  This is particularly true for user interface decisions.  I&#8217;m expecting great things from the next release of Amarok.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/217/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/217/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/217/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=217&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/07/08/guademy/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Akademy rooms</title>
		<link>http://randomguy3.wordpress.com/2009/05/25/akademy-rooms/</link>
		<comments>http://randomguy3.wordpress.com/2009/05/25/akademy-rooms/#comments</comments>
		<pubDate>Mon, 25 May 2009 21:55:59 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[KDE]]></category>
		<category><![CDATA[GCDS]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=215</guid>
		<description><![CDATA[I figured I&#8217;d follow Peter Zhou&#8217;s lead and ask if anyone is still looking for a roommate at Akademy.  I don&#8217;t bite, I promise&#8230;
       <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=215&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>I figured I&#8217;d follow Peter Zhou&#8217;s lead and ask if anyone is still looking for a roommate at Akademy.  I don&#8217;t bite, I promise&#8230;</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/215/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/215/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/215/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=215&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/05/25/akademy-rooms/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>What&#8217;s Playing, Doc?</title>
		<link>http://randomguy3.wordpress.com/2009/05/17/whats-playing-doc/</link>
		<comments>http://randomguy3.wordpress.com/2009/05/17/whats-playing-doc/#comments</comments>
		<pubDate>Sun, 17 May 2009 12:51:36 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Plasma]]></category>
		<category><![CDATA[Amarok]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[now playing]]></category>
		<category><![CDATA[scripting]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=210</guid>
		<description><![CDATA[So, I was round at a friend&#8217;s, and he was playing with Amarok and the Plasma widgets screensaver, and wanted a way to see what was currently playing when his computer was locked.  Of course, I pointed him towards the Now Playing applet, but it was overkill for what he wanted &#8211; he didn&#8217;t want [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=210&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>So, I was round at a friend&#8217;s, and he was playing with Amarok and the Plasma widgets screensaver, and wanted a way to see what was currently playing when his computer was locked.  Of course, I pointed him towards the Now Playing applet, but it was overkill for what he wanted &#8211; he didn&#8217;t want the buttons, or the sliders &#8211; just a display of the current information.  Well, I was in the mood for playing, and it took me about 15 minutes to construct a javascript plasmoid, most of which was spent researching how to use data engines from them.</p>
<p>The code I left him with was:</p>
<pre><code>layout = new LinearLayout(plasmoid);
layout.setOrientation(QtVertical);

label = new Label();
layout.addItem(label);
label.text = 'No player'

plasmoid.dataUpdate = function(name, data) {
    label.text = 'Info:\n';
    for (var key in data) {
        label.text += key + ': ' + data[key] + '\n';
    }
}

plasmoid.dataEngine("nowplaying").connectSource("org.mpris.amarok", plasmoid, 500);
</code></pre>
<p>This was in a file called &#8220;main.js&#8221; in a subfolder called &#8220;contents&#8221;.  In the plasmoid folder (the folder containing the contents folder), I also put in a metadata.desktop file:</p>
<pre><code>
[Desktop Entry]
Name=Simple Now Playing
Comment=Now Playing as Matt likes it
Icon=applications-multimedia
Type=Service
X-Plasma-API=javascript
X-Plasma-MainScript=main.js
X-Plasma-DefaultSize=200,100
X-KDE-ServiceTypes=Plasma/Applet
X-KDE-PluginInfo-Author=Alex Merry
X-KDE-PluginInfo-Email=alex.merry [SPAMNO]@[SPAMNO] kdemail.org
X-KDE-PluginInfo-Name=simplenowplaying
X-KDE-PluginInfo-Version=0.1
X-KDE-PluginInfo-Website=http://plasma.kde.org/
X-KDE-PluginInfo-Category=Multimedia
X-KDE-PluginInfo-Depends=
X-KDE-PluginInfo-License=GPL
X-KDE-PluginInfo-EnabledByDefault=true
</code></pre>
<p>Now it was just a case of calling <kbd>plasmapkg -i .</kbd> from within the plasmoid directory, and the simple widget was installed.  This produces the following:</p>
<p><img src="http://randomguy3.files.wordpress.com/2009/05/simple-now-playing.png?w=347&#038;h=284" alt="simple-now-playing" title="simple-now-playing" width="347" height="284" class="alignnone size-full wp-image-213" /></p>
<p>Of course, this will only work with Amarok, and doesn&#8217;t respond to Amarok being started or quit.  That&#8217;s OK, it&#8217;s not much more work to deal with that:</p>
<pre><code>
layout = new LinearLayout(plasmoid);
layout.setOrientation(QtVertical);

label = new Label();
layout.addItem(label);
label.text = "No player found";

function firstSource() {
	var sources = plasmoid.dataEngine("nowplaying").sources;
	if (sources.length) {
		return sources[0];
	} else {
		label.text = "No player found";
		return '';
	}
}

plasmoid.dataUpdate = function(name, data) {
	if (source == name) {
		label.text = 'Info:\n';
		for (var key in data) {
			label.text += key + ': ' + data[key] + '\n';
		}
	}
}

source = firstSource();

npDataEngine = plasmoid.dataEngine("nowplaying");

npDataEngine.sourceRemoved.connect(function(name) {
	if (name == source) {
		source = firstSource();
		if (source) {
			npDataEngine.connect(source, plasmoid, 500);
		}
	}
});

npDataEngine.sourceAdded.connect(function(name) {
	if (!source) {
		source = name;
		npDataEngine.connect(source, plasmoid, 500);
	}
});

if (source) {
	npDataEngine.connectSource(source, plasmoid, 500);
}
</code></pre>
<p>Of course, it&#8217;s not much work to only show the things you&#8217;re interested in, but this covers the interesting parts of the plasmoid.</p>
<p>Interesting note: it appears that if you replace the line <kbd>label.text = 'Info:\n';</kbd> with <kbd>label.text = '';</kbd>, the subsequent calls to <kbd>label.text += ...</kbd> don&#8217;t work &#8211; you just end up with a blank label.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/210/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/210/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/210/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=210&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/05/17/whats-playing-doc/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>

		<media:content url="http://randomguy3.files.wordpress.com/2009/05/simple-now-playing.png" medium="image">
			<media:title type="html">simple-now-playing</media:title>
		</media:content>
	</item>
		<item>
		<title>Why silence is better than 10 reasons</title>
		<link>http://randomguy3.wordpress.com/2009/03/31/why-silence-is-better-than-10-reasons/</link>
		<comments>http://randomguy3.wordpress.com/2009/03/31/why-silence-is-better-than-10-reasons/#comments</comments>
		<pubDate>Tue, 31 Mar 2009 19:57:57 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[KDE]]></category>
		<category><![CDATA[dolphin]]></category>
		<category><![CDATA[GNOME]]></category>
		<category><![CDATA[logic]]></category>
		<category><![CDATA[Plasma]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=200</guid>
		<description><![CDATA[This is a deconstruction of 10 reasons why GNOME is better than KDE, which is pretty obviously a piece of flame-bait.  Wallen basically says as much at the start of the article.  But I&#8217;m in the mood for dissecting arguments.
I would like to say right now that this is not a &#8220;10 reasons [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=200&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>This is a deconstruction of <a href="http://blogs.techrepublic.com.com/10things/?p=570">10 reasons why GNOME is better than KDE</a>, which is pretty obviously a piece of flame-bait.  Wallen basically says as much at the start of the article.  But I&#8217;m in the mood for dissecting arguments.</p>
<p>I would like to say right now that this is <em>not</em> a &#8220;10 reasons why KDE is better than GNOME&#8221; article.  That would be inane.  I have many GNOMEy friends, and no intention of trying to convert any of them.  Anyway, I&#8217;m pretty sure that any one of you can come up with both 10 things KDE does better than GNOME and 10 things GNOME does better than KDE.</p>
<p>Instead, this is an excercise in deconstructing an argument.  Critical thinking, if you will.  Because Wallen completely failed to come up with 10 reasons for anything.</p>
<p>So, lets start at the top.  &#8220;1. KDE 4&#8243;.  I&#8217;m not really sure there&#8217;s anything to say about this, other than that the entire paragraph is simply a collection of unsupported statements (with no narrative to connect them).  He doesn&#8217;t provide a single example to support any of his attacks (including &#8216;KDE was (and is) the first-ever “Microsofting” of the Linux desktop&#8217; and KDE 4 was &#8220;painfully worthless&#8221;).  OK, let&#8217;s move on.</p>
<p>&#8220;2. Start Menu&#8221;.  Well, using Microsoft terminology when &#8216;&#8221;Microsofting&#8221; the Linux desktop&#8217; was mentioned in the previous paragraph was probably intentional, but not helpful to any argument, really.  We get &#8220;It should be pretty obvious&#8221; and &#8220;It should also be fairly obvious&#8221; almost straight off the bat.  Chalk one down for unsupported statements.</p>
<p>There&#8217;s possibly a valid criticism about Kickoff and the lack of KDE 3&#8217;s quick menu applets being made in here, but it&#8217;s difficult to disentangle from the ad hominem attacks.  And he probably has a point about discoverability of things like how to change the menu to &#8220;classic&#8221; style.  Not that I believe such a thing is both possible and discoverable in any other desktop, so I&#8217;m not sure it really advances his original argument about one desktop being &#8220;better&#8221; than the other.</p>
<p>In &#8220;3: Nautilus vs. Dolphin&#8221;, he actually doesn&#8217;t compare Dolphin to Nautilus.  He compares Dolphin to Konqueror, and the latter still functions as a file manager in KDE 4.  OK, that first statement wasn&#8217;t entirely true.  He says that Nautilus is Dolphin, but stable (and makes a reference to Dropbox that appears to bear no relation to anything else).  That brings the number of potentially valid criticisms in this article up to about 3 (the arguments in section 2 were hazy).</p>
<p>He also says that users will find most of the features of Dolphin useless.  And justifies this by mentioning one feature, possibly two if you count rating and tagging separately (Dolphin has more than three features, right?).  One black mark next to &#8220;generalising from the specific&#8221;.  And possibly &#8220;presenting exaggeration as fact&#8221;.</p>
<p>&#8220;4: Foundations&#8221;.  I&#8217;m not sure why he picked this title.  Qt 4 gets a passing mention (in the first sentence), and the only thing that is said about GTK+ is that there will be a version 3 soon.  I guess you&#8217;re supposed to infer from context that this will break backwards compatibility.  He also implies (but doesn&#8217;t say outright) that the port to Qt 4 was largely or solely because of the potential for a windows port.  The reason was in fact because Qt 4 had a much-improved API, and Qt 3 was shortly to become unsupported by Trolltech (as was).</p>
<p>This section also has a fallacious comparison between GNOME 2.24, with it&#8217;s forward compatibility flags, and KDE 4 (a more sensible, although still not entirely accurate, comparison would be the as-yet-unreleased GNOME 2.30 with KDE 4).  The thing is, he could probably have made a decent argument along the lines of GTK+3&#8217;s migration plan being better than QT 4&#8217;s, but he completely failed, largely by getting sidetracked with the Window port non-issue.  Oh, and I&#8217;m really not sure what resources he believes are being diverted from the main project to work on the windows port.  Or how KDE might go about forcing those people who insist on getting their favourite applications to run on Windows (as they did even back in KDE 3 days) to give up such an unworthy pursuit and return to the warm, fuzzy and &#8211; above all &#8211; morally superior fold of free unix-based operating systems.</p>
<p>Sorry, I seem to have had a nasty attack of sarcasm there.  I&#8217;ll try not to let it happen again.</p>
<p>On the other hand, section four is possibly the most well-constructed section in terms of arguments.  I had to remove the underpinning (the assumption that the move to Qt 4 was all about Windows) before the rest of the structure of the argument collapsed.</p>
<p>Oddly enough, in &#8220;5. Resources&#8221;, his one concession to KDE 4 (using fewer resources than KDE 3&#8243; is highly disputed among those who measure such things in KDE.  The rest of this section revolves around his decidedly unscientific comparison between the memory usage of KDE and GNOME (given the content of section 10, one has to assume that this means default installs of Fedora 10, but there is nothing to say so).  He gets a difference of 10Mb when both desktops use more than 1.25Gb of RAM.  That&#8217;s a 1% difference in memory usage.  Apparently this means that &#8220;GNOME requires less hardware to run&#8221;.  I&#8217;m not entirely sure where he intends to buy exactly 1.27Gb of RAM from (which, it seems, will run GNOME but not KDE &#8211; providing you don&#8217;t launch any other applications, of course).  But, seriously, 1% is not a significant difference.  Given that his measurement almost certainly includes kernel caches, and is probably based on the default installations of one particular distribution, it is almost certainly completely dwarfed by the error rate.</p>
<p>&#8220;6. Clutter&#8221;.  Half-way there.  Showing the desktop folder, it seems, is cluttering the desktop.  Despite this being what just about every other desktop implementation out there does.  *shrugs*.  Let&#8217;s play along, then.  This is a reasonable argument, but made at the expense of ignoring the facts.  The major one is that it takes one click to remove the item he&#8217;s complaining about.  So, a second argument that required me to actually respond with a fact, rather than dismantle purely on the basis of fallacious reasoning.</p>
<p>&#8220;7: Customization&#8221;.  Again, lots of unsupported statements.  GNOME is almost infinitely customizable (how?); KDE 4 locks you down (in what way?).  Nowhere does he give even one example of something that GNOME allows you to customise that KDE doesn&#8217;t.  He talks about mouse menus, but this appears to be a comparison of KDE 4 with KDE 3 (and I&#8217;m not sure what he means by &#8220;mouse menus&#8221;, either).  And saying that you can&#8217;t change the look of something except by using the very mechanism that allows you to change its look (theming, in this case) is&#8230; true.  But completely besides the point.</p>
<p>&#8220;8: System Tray overkill&#8221;.  This is a comparison of the default setups on Fedora 10, not of the default setups of the desktop environments in general.  So this is an example of generalising from the specific.</p>
<p>Apart from that, not all of the items he lists are actually part of the system tray (the clock, for example, is actually an applet, not a system tray icon).  And desktop shells can&#8217;t do anything about the system tray other than display what programs offer.  The applets, on the other hand, can be removed &#8211; both in GNOME and KDE.  The one valid argument in this is about the loading time of the system tray.  I think that&#8217;s 4 valid arguments (that couldn&#8217;t be immediately dismissed by stating a single fact) in total so far.</p>
<p>&#8220;9: Default applications&#8221;.  Konqueror has been the default web browser of KDE (although not necessarily of any given distribution&#8217;s installation of KDE) since KDE 2, as far as I&#8217;m aware.  So quite where he got the idea that Konqi has suddenly moved into this role, I don&#8217;t know.  KOffice 2 hasn&#8217;t even been released, so I doubt it&#8217;s the default anywhere (although I&#8217;ve heard that Fedora can be pretty bleeding edge).  And Firefox isn&#8217;t the default browser in GNOME, it&#8217;s Epiphany.  Although that does use the same rendering engine as Firefox.  And I&#8217;m not sure GNOME really has a &#8220;default&#8221; office suite.  Basically, Wallen is confusing desktop environment defaults with distribution defaults.  Repeat after me: Fedora is not representative of all Linux distributions.</p>
<p>So that&#8217;s a mix of generalising from the specific and ignoring certain facts.</p>
<p>&#8220;10: KDE = Vista?&#8221;.  I can sum this up as &#8220;people don&#8217;t like Vista, and I think KDE looks like Vista, ergo KDE sucks&#8221;.  Unfair?  Well, maybe.  But saying that you can make KDE look like Vista by installing the right theme (I assume Emerald refers to a theme) does not an argument make.  And I know that Vista is famed for being unstable (<a href="http://www.joelonsoftware.com/items/2008/03/17.html">slightly unfairly, I have to say</a>), but all software goes through an unstable phase (except possibly TeX) and that doesn&#8217;t make it like Vista.  Or unlike Linux (as in GNU/Linux, not the kernel).  And he still hasn&#8217;t presented a convincing argument (or an argument at all, for that matter) for KDE 4 not being flexible.  Plasma was designed to be much more flexible than kicker/kdesktop, and Wallen has failed to provide any evidence that it has failed in those aims.  Not that I&#8217;ve presented any evidence it has succeeded in them, but my aim is not to prove the worthiness of KDE 4 but to dismantle Wallen&#8217;s arguments.</p>
<p>Finally, Wallen makes the common mistake of assuming that KDE 4 = Plasma.  Well, OK, Dolphin got a mention.  Yes, it&#8217;s probably the most user-visible component of a KDE 4 desktop session, but KDE is primarily a software platform, and includes a desktop shell as part of that.  So that&#8217;s generalising from the specific again.</p>
<p>Well, I found four reasonable arguments in there, plus a few more that were recognisable as arguments even if they could be countered with a simple fact (I can forgive people for not knowing <em>all</em> the pertinent facts <img src='http://s.wordpress.com/wp-includes/images/smilies/face-raspberry.png' alt=':-P' class='wp-smiley' /> ).  But most of the rest didn&#8217;t form any coherent argument at all.</p>
<p>I think that&#8217;s enough from me.  I suggest you all go read about <a href="http://www.nizkor.org/features/fallacies/">logical fallacies</a> now, so you can give fancy names to Wallen&#8217;s arguments.</p>
<p>This has been a public service broadcast on how not to argue your case.</p>
<p>[Post edited slightly at 21:26 GMT 2009-03-31]</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/200/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/200/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/200/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=200&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/03/31/why-silence-is-better-than-10-reasons/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Now Playing with Art</title>
		<link>http://randomguy3.wordpress.com/2009/02/21/now-playing-with-art/</link>
		<comments>http://randomguy3.wordpress.com/2009/02/21/now-playing-with-art/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 23:37:21 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[Plasma]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=188</guid>
		<description><![CDATA[Michael Pyne added support for album art to Juk&#8217;s D-Bus interface, and modified the now playing dataengine to get this artwork.  The dataengine already supported getting artwork from MPRIS-enabled players, and Amarok has provided album artwork over MPRIS for a while.
So I&#8217;ve now added the display of album artwork to the now playing widget:
Naturally, this [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=188&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Michael Pyne added support for album art to <a href="http://developer.kde.org/~wheeler/juk.html">Juk</a>&#8217;s <a href="http://www.freedesktop.org/wiki/Software/dbus">D-Bus</a> interface, and modified the now playing dataengine to get this artwork.  The dataengine already supported getting artwork from <a href="http://wiki.xmms2.xmms.se/wiki/Media_Player_Interfaces">MPRIS</a>-enabled players, and <a href="http://amarok.kde.org/">Amarok</a> has provided album artwork over MPRIS for a while.</p>
<p>So I&#8217;ve now added the display of album artwork to the now playing widget:</p>
<div id="attachment_189" class="wp-caption alignnone" style="width: 401px"><img class="size-full wp-image-189" title="Now Playing screenshot" src="http://randomguy3.files.wordpress.com/2009/02/nowplaying.png?w=391&#038;h=219" alt="The Now Playing applet with album artwork" width="391" height="219" /><p class="wp-caption-text">The Now Playing widget with album artwork</p></div>
<p>Naturally, this disappears (and the text moves over to the left) when there is no album artwork available, and the image resizes to be as tall as the text when you resize the widget.</p>
<p>Oh, and I fixed the scrollbars to work when you use the mouse wheel on them.  This fix will be in the next release of 4.2 (although the artwork won&#8217;t be).</p>
<p>Now I need to improve the functionality of the widget when it&#8217;s on the panel.  And any help in generally making the widget prettier would be most welcome.  I really don&#8217;t like the scrollbars, and the album art needs a frame.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/188/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/188/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/188/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=188&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/02/21/now-playing-with-art/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>

		<media:content url="http://randomguy3.files.wordpress.com/2009/02/nowplaying.png" medium="image">
			<media:title type="html">Now Playing screenshot</media:title>
		</media:content>
	</item>
		<item>
		<title>Running out of original titles on the subject of replay gain</title>
		<link>http://randomguy3.wordpress.com/2009/01/31/running-out-of-original-titles-on-the-subject-of-replay-gain/</link>
		<comments>http://randomguy3.wordpress.com/2009/01/31/running-out-of-original-titles-on-the-subject-of-replay-gain/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 01:23:32 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[ID3v2]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[mp4]]></category>
		<category><![CDATA[musepack]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[replay gain]]></category>
		<category><![CDATA[vorbis]]></category>
		<category><![CDATA[wavpack]]></category>
		<category><![CDATA[wma]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=183</guid>
		<description><![CDATA[Now that Amarok can read replay gain tags from almost all the files that it can read metadata from, I feel replay gain support in Amarok is pretty much there.<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=183&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Now that <a href="http://amarok.kde.org/">Amarok</a> can read <a href="http://wiki.hydrogenaudio.org/index.php?title=Replay_Gain">replay gain</a> tags from almost all the files that it can read metadata from, I feel replay gain support in Amarok is pretty much there.  And, yes, all this will be in Amarok 2.1.</p>
<p>A small caveat: the reading of replay gain tags from <a href="http://wiki.hydrogenaudio.org/index.php?title=Mp4">MP4</a> files only works if Amarok was built against <a href="http://resare.com/libmp4v2/">libMP4v2</a>.  Amarok uses its own (home-brewed?) code for reading MP4 tags when it can&#8217;t find libMP4v2 at build-time, but it doesn&#8217;t support freeform tags and I don&#8217;t see the point of implementing that support when libMP4v2 does the job.</p>
<p>Amarok 2.1 will support all the file formats that <a href="http://www.kde-apps.org/content/show.php?content=26073">Amarok 1.4&#8217;s replay gain script</a> did (and more), apart from <a href="http://wiki.hydrogenaudio.org/index.php?title=Musepack">Musepack</a> (mpc).  Ironically, this is because of Musepack&#8217;s native support for replay gain &#8211; rather than abusing metadata tags to store the replay gain information, Musepack has a special field in the file header to specify the values.  However, <a href="http://developer.kde.org/~wheeler/taglib.html">TagLib</a> doesn&#8217;t let us at this field, so we&#8217;re a bit stuck.</p>
<p>So the state of replay gain support in Amarok is that, for files in the main collection or elsewhere on your computer&#8217;s filesystem (so not streaming media and not portable music players), replay gain tags (both album and track mode) will be read from the following formats:</p>
<ul>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Mp3">MP3</a> (as written by <a href="http://mp3gain.sourceforge.net/">mp3gain</a>/<a href="http://www.rarewares.org/aac-encoders.php#aacgain">aacgain</a>, <a href="http://www.foobar2000.org/">Foobar2000</a> and <a href="http://code.google.com/p/quodlibet/wiki/Mutagen">Mutagen/Quod Libet</a> &#8211; yes, there are three different ways of writing the tags to MP3 files)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Ogg_Vorbis">OGG Vorbis</a> (as written by <a href="http://www.sjeng.org/vorbisgain.html">vorbisgain</a> and anything compatible)</li>
<li>OGG FLAC (assuming the tags are stored in the same way as in OGG Vorbis)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Speex">OGG Speex</a> (assuming the tags are stored in the same way as in OGG Vorbis)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Flac">FLAC</a> (as written by <a href="http://flac.sourceforge.net/">flac</a> [with it's --replay-gain switch] and anything compatible)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Windows_Media_Audio">WMA</a>/<a href="http://wiki.hydrogenaudio.org/index.php?title=ASF">ASF</a> (as written by the <a href="http://www.kde-apps.org/content/show.php?content=26073">Amarok 1.4 replay gain script</a>)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=Mp4">MP4</a> (as written by aacgain and anything compatible, providing Amarok was built with <a href="http://resare.com/libmp4v2/">libMP4v2</a>)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=WavPack">WavPack</a> (assuming the tags are stored in a similar way to how mp3gain stores them in MP3 files)</li>
<li><a href="http://wiki.hydrogenaudio.org/index.php?title=TTA">TrueAudio</a> (assuming the tags are stored in a similar way to how Foobar2000 or QuodLibet/Mutagen store the tags in MP3 files)</li>
</ul>
<p>In addition, Amarok will use the track mode tags (or the album mode ones if there aren&#8217;t any track mode tags) to adjust the gain during playback.  I haven&#8217;t added an option to switch to album mode (or even disable it, if you really want to) yet, but that will come.  I just have to figure out where it should go in the user interface&#8230;</p>
<p>Of course, this is only half the functionality provided by the Amarok 1.4 replay gain script.  That also parsed and tagged files in the playlist.  This could be implemented nicely as a script (I certainly don&#8217;t believe it belongs in the core of Amarok).  But that&#8217;s for another day, and probably another person.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/183/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/183/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/183/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=183&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/01/31/running-out-of-original-titles-on-the-subject-of-replay-gain/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Replay This</title>
		<link>http://randomguy3.wordpress.com/2009/01/18/replay-this/</link>
		<comments>http://randomguy3.wordpress.com/2009/01/18/replay-this/#comments</comments>
		<pubDate>Sun, 18 Jan 2009 01:43:51 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[ID3v2]]></category>
		<category><![CDATA[mp3]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=178</guid>
		<description><![CDATA[So, after some trial-and-error, I&#8217;ve cracked the RVA2 frame format as written by Quod Libet / Mutagen.

All values are stored big-endian (most significant byte first).  This tripped me up, because this is not true for all data stored in all tag formats.
If we think of the peak value in terms of the &#8220;units, tens, thousands&#8221; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=178&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>So, after some trial-and-error, I&#8217;ve cracked the RVA2 frame format as written by <a title="A pyGTK+ music player" href="http://code.google.com/p/quodlibet/">Quod Libet</a> / <a title="A pure Python audio metadata library" href="http://code.google.com/p/quodlibet/wiki/Mutagen">Mutagen</a>.</p>
<ul>
<li>All values are stored big-endian (most significant byte first).  This tripped me up, because this is not true for all data stored in all tag formats.</li>
<li>If we think of the peak value in terms of the &#8220;units, tens, thousands&#8221; format you learned at school (only, of course, in binary this is &#8220;units, twos, fours&#8221;), the first bit is the units, the second is the halves, the third quarters and so on.  Simple, yes?  However, it&#8217;s not so easy to infer from the code that parses it.  So I&#8217;ve put plenty of comments in the amarokcollectionscanner code.</li>
<li>Everything else you could wish to know about the format is in the <a href="http://www.id3.org/id3v2.4.0-frames">ID3v2.4 frames list</a>, section 4.11.</li>
</ul>
<p>So Amarok&#8217;s collection now has complete support for replay gain tags in Ogg Vorbis (as written by vorbisgain), FLAC (as written by flacenc) and MP3 (as written by Foobar2000 [ID3v2.3 TXXX comments], Quod Libet / Mutagen [ID3v2.4 RVA2] or mp3gain [APEv2]).</p>
<p>Other formats will follow.  As will replay gain support for files that aren&#8217;t in the collection, but are on the local machine.</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/178/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/178/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/178/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=178&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/01/18/replay-this/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Reverse Engineering Datatypes</title>
		<link>http://randomguy3.wordpress.com/2009/01/17/reverse-engineering-datatypes/</link>
		<comments>http://randomguy3.wordpress.com/2009/01/17/reverse-engineering-datatypes/#comments</comments>
		<pubDate>Sat, 17 Jan 2009 02:14:28 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[ID3v2]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[replay gain]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=165</guid>
		<description><![CDATA[Amarok now reads the tags written by Foobar2000 and by mp3gain (written when you call mp3gain without the -a or -r options) from MP3 files.  However, the final part of MP3 support is tricker: the RVA2 tag in the ID3v2.4 spec.
Naturally, the specification leaves out an all-important detail: the format of the peak volume field.  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=165&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Amarok now reads the tags written by Foobar2000 and by mp3gain (written when you call mp3gain without the -a or -r options) from MP3 files.  However, the final part of MP3 support is tricker: the RVA2 tag in the <a title="The list of frames in the ID3v2.4 specification" href="http://www.id3.org/id3v2.4.0-frames">ID3v2.4 spec.</a></p>
<p>Naturally, the specification leaves out an all-important detail: the format of the peak volume field.  It tells you which bits represent the peak volume, but not how to interpret them.</p>
<p>Luckily, <a href="http://code.google.com/p/quodlibet/wiki/Mutagen">mutagen</a>, a <a href="http://www.python.org/">Python</a> audio metadata library, supports this tag, so it&#8217;s implementation can serve as a reference.  However, they try to be clever with their implementation, so reverse-engineering it to arrive at the format of the original data requires some work.</p>
<p>The documentation on the Python class implementing the RVA2 frame support says that the peak volume is a float between 0 and 1.  So 0 is silent, 1 is full volume (digital full scale).  This doesn&#8217;t seem right to me, because the replay gain specification points out that it is possible to have a peak volume over 1 in some circumstances in a compressed audio file.  But we&#8217;ll leave that aside for the moment.</p>
<p>Let&#8217;s start with the code.  <strong>data</strong> contains the raw bytes, the first of which is a number specifying how many <em>bits</em> (not bytes) of the remaining data is occupied by the number representing the peak volume.</p>
<pre>        peak = 0
        bits = ord(data[0])
        bytes = min(4, (bits + 7) &gt;&gt; 3)
        # not enough frame data
        if bytes + 1 &gt; len(data): raise ID3JunkFrameError
        shift = ((8 - (bits &amp; 7)) &amp; 7) + (4 - bytes) * 8
        for i in range(1, bytes+1):
            peak *= 256
            peak += ord(data[i])
        peak *= 2**shift
        return (float(peak) / (2**31-1))</pre>
<p>Let&#8217;s start with <strong>bytes</strong>.  This is simply <strong>bits</strong> (the number of bits representing the peak volume) rounded up to the nearest 8, then divided by 8.  So if <strong>bits</strong> is <em>8n + k</em>, <strong>bytes</strong> is <em>n</em> in the case that <em>k = 0</em> and <em>(n+1)</em> in the case that <em>k &gt; 0</em>.</p>
<p>The next variable is the <strong>shift</strong>.  This is the first bit of clever magic, and it takes some time spent staring at it (preferably with a pad and paper to hand) to arrive at the following conclusion:</p>
<ul>
<li>if <em>k = 0</em>, <strong>shift</strong> is <em>8(4 &#8211; n)</em></li>
<li>if <em>k &gt; 0</em>, <strong>shift</strong> is <em>8(4 &#8211; (n + 1))</em></li>
</ul>
<p>Then we read the bits into <strong>peak</strong>.  Remember that if <em>k &gt; 0</em>, the last <em>(8 &#8211; k)</em> bits will be junk.  Now we shift it right (<strong>shift</strong> is always at least <em>0</em>, because of our contraint on <strong>bytes</strong> to be at least <em>4</em>) so that the first 32 bits are all that remains (I assume here that Python is treating <strong>peak</strong> as an integer).  Then we turn <strong>peak</strong> into a float and divide it by <em>(2<sup>31</sup>) &#8211; 1</em>.  This contant is a magic number, being the largest value that can be stored in a signed 32-bit integer.</p>
<p>Something that might shed light on this is that, when it writes the peak volume out, it simply writes the value multiplied by <em>2<sup>15</sup></em> as a 16-bit unsigned integer.  This would make interpreting the value as simple as placing a &#8220;decimal&#8221; point after the first binary digit (so we get 1 digit before the point and 15 after).  Note that this does indeed allow a peak volume greater than <em>1</em> (but less than <em>2</em>).</p>
<p>I&#8217;m left with two questions:</p>
<ol>
<li>Why do we divide the number by MAX_INT_32, rather than simply <em>2<sup>31</sup></em>? (I just made up that constant name now, don&#8217;t complain that it&#8217;s wrong.)</li>
<li>Why does mutagen put a 32-bit minimum on the number, and then write a 16-bit number when it writes out RVA2 tags?</li>
</ol>
<p>Answers on a postcard (or just in the comments).</p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/165/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/165/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/165/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=165&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/01/17/reverse-engineering-datatypes/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
		<item>
		<title>Gaining Gain for Personal Gain</title>
		<link>http://randomguy3.wordpress.com/2009/01/15/gaining-gain-for-personal-gain/</link>
		<comments>http://randomguy3.wordpress.com/2009/01/15/gaining-gain-for-personal-gain/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 22:34:41 +0000</pubDate>
		<dc:creator>randomguy3</dc:creator>
				<category><![CDATA[Amarok]]></category>
		<category><![CDATA[flac]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[replay gain]]></category>
		<category><![CDATA[vorbis]]></category>

		<guid isPermaLink="false">http://randomguy3.wordpress.com/?p=159</guid>
		<description><![CDATA[SVN commit 911684 by alexmerry:
ReplayGain FTW!
Make replay gain support actually do something by
(a) getting the data we stored out of the collection database
(b) using it when the track changes
Also, improve the storage of replay gain tags by storing NULL when they weren&#8217;t present on the original track metadata.  This allows us to substitute the [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=159&subd=randomguy3&ref=&feed=1" />]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><blockquote><p>SVN commit 911684 by alexmerry:</p>
<p>ReplayGain FTW!</p>
<p>Make replay gain support actually do something by<br />
(a) getting the data we stored out of the collection database<br />
(b) using it when the track changes</p>
<p>Also, improve the storage of replay gain tags by storing NULL when they weren&#8217;t present on the original track metadata.  This allows us to substitute the track gain for the album gain when the latter is requested but doesn&#8217;t exist.</p></blockquote>
<p>This closes <a href="https://bugs.kde.org/show_bug.cgi?id=81661">the most popular feature request</a> on bugzilla.</p>
<p>Of course, there&#8217;s still work to be done.</p>
<ul>
<li>Currently, it&#8217;s fixed in track mode.</li>
<li>It only works on files in the collection &#8211; it should be possible to extend it to other files on the local computer at least.</li>
<li>Finally, it only works on Ogg Vorbis and FLAC files (mp3gain and aacgain modify MP3/MP4 files in such a way that we don&#8217;t need to do anything special in Amarok for them to sound right, providing you pass either the &#8220;-r&#8221; or &#8220;-a&#8221; option).  Adding other file types is simply a case of adding the relevant code to amarokcollectionscanner.</li>
</ul>
<p>But, right now, I&#8217;m listening to my music all playing at the right volume (apart from the WMA files, but what can you do?).</p>
<p><strong>[edit]</strong> I should point out that it works <em>without</em> moving your volume slider up and down like the Amarok 1.4 script did.  It just works magically and invisibly, like it should.  This part of the implementation (actually changing the volume) was a doddle, thanks to the wonder of <a href="http://phonon.kde.org">Phonon</a>.  <strong>[/edit]</strong></p>
  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/randomguy3.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/randomguy3.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/randomguy3.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/randomguy3.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/randomguy3.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/randomguy3.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/randomguy3.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/randomguy3.wordpress.com/159/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/randomguy3.wordpress.com/159/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/randomguy3.wordpress.com/159/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=randomguy3.wordpress.com&blog=1667330&post=159&subd=randomguy3&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://randomguy3.wordpress.com/2009/01/15/gaining-gain-for-personal-gain/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c8fc62d9e4ea671e01e1ac86bb7d90b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">randomguy3</media:title>
		</media:content>
	</item>
	</channel>
</rss>