<?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/"
	>

<channel>
	<title>Katastrophos.net Blog &#187; Quasar Media Player</title>
	<atom:link href="http://katastrophos.net/andre/blog/tag/quasar/feed/" rel="self" type="application/rss+xml" />
	<link>http://katastrophos.net/andre/blog</link>
	<description>Chaotic solutions and random thoughts from the restless mind of a notorious problem solver (TM), by Andre Beckedorf</description>
	<lastBuildDate>Fri, 30 Dec 2011 19:32:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>QuasarMX, Qt, QML and the experiments</title>
		<link>http://katastrophos.net/andre/blog/2011/12/30/quasarmx-qt-qml-and-the-experiments/</link>
		<comments>http://katastrophos.net/andre/blog/2011/12/30/quasarmx-qt-qml-and-the-experiments/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 02:34:17 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Harmattan]]></category>
		<category><![CDATA[MeeGo]]></category>
		<category><![CDATA[Nokia N9]]></category>
		<category><![CDATA[Nokia N950]]></category>
		<category><![CDATA[QML]]></category>
		<category><![CDATA[Qt]]></category>
		<category><![CDATA[Qt Quick]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Software]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/?p=577</guid>
		<description><![CDATA[Some of you following my micro-blogging on Twitter might already know about it: In the last few months I have been busy developing a new application. What initially just started out as a re-write of the user interface of Quasar Media Player has turned into a completely new application called QuasarMX. It is based on [...]]]></description>
			<content:encoded><![CDATA[<p>Some of you following my micro-blogging on Twitter might already know about it: In the last few months I have been busy developing a new application. What initially just started out as a re-write of the user interface of <a href="http://katastrophos.net/quasar" title="Quasar Media Player Homepage" target="_blank">Quasar Media Player</a> has turned into a completely new application called QuasarMX. It is based on the very core of Quasar Media Player but stripped of all the legacy and third-party code. The completely new UI is based on <a href="https://qt.nokia.com/qtquick/" title="Qt Quick homepage" target="_blank">Qt Quick / QML</a>, a new technology which simplicity and elegance I fell in love with over the past year. For me QuasarMX also marks the start of two experiments: </p>
<p>1. How many platforms and operating systems can I port my app to?<br />
2. Is there any commercial viability at all in publishing the software to various app stores (Nokia Ovi store, Android Market etc.) ?</p>
<p>The first experiment is important to me. Now that Nokia put the <a href="http://qt-project.org" title="Qt Project" target="_blank">Qt project into open governance</a>, the Qt community has the unique opportunity to extend primary platform support to Android, iOS and possibly even Windows Phone 7, thus extending the possible market cap and audience for mobile apps based on Qt dramatically. This experiment is largely about experiencing first hand what changes are required to get my application running on these platforms and as a matter of fact what needs to be done in projects like Necessitas (Qt on Android) to make that goal happen.</p>
<p>As for the second experiment I am actually just interested in getting to know the mechanics of the various app stores. I am pretty confident that there is little to no money to be made from yet another music player app. Yet, it is still interesting to see what happens, what works and what not, especially in regards to future apps.</p>
<p>In July Nokia accepted my application and invited me into the Qt Ambassador program. As part of this program Nokia loaned a N950 developer device to me, which I extensively used to develop and test the Harmattan UI for QuasarMX. The new user interface is very much inspired by the simplicity of the MeeGo Harmattan Swipe UI.</p>
<p><a href="http://katastrophos.net/quasarmx" title="QuasarMX homepage" target="_blank"><img src="http://katastrophos.net/andre/blog/wp-content/uploads/2011/12/quasarmx_blog1.png" alt="" title="quasarmx_blog" border="0" style="border: none" width="475" height="241" class="noframe aligncenter size-full wp-image-587" /></a></p>
<p>As of yesterday the open Beta 1 of <a href="http://katastrophos.net/quasarmx" title="QuasarMX homepage" target="_blank">QuasarMX is available</a> for the <a href="http://swipe.nokia.com" title="Nokia N9 Swipe Homepage" target="_blank">Nokia N9</a> and N950. Releases for other platforms will follow shortly.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2011/12/30/quasarmx-qt-qml-and-the-experiments/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Quasar Media Player 0.96 beta 4 available</title>
		<link>http://katastrophos.net/andre/blog/2010/03/28/quasar-media-player-0-96-beta-4-available/</link>
		<comments>http://katastrophos.net/andre/blog/2010/03/28/quasar-media-player-0-96-beta-4-available/#comments</comments>
		<pubDate>Sun, 28 Mar 2010 20:00:33 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/?p=298</guid>
		<description><![CDATA[I am pleased to announce beta 4 of Quasar Media Player. This new version introduces some new features and big improvements in terms of performance and memory-usage. The previously separate last.fm Audioscrobbler QScrobbler has been integrated into Quasar as add-on. This release also marks the introduction of the Cover Art Downloader which uses the new [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://katastrophos.net/quasar"><img src="http://katastrophos.net/zaurus/sources/quasar/quasar_logo.png" class="noframe" border="0" style="border: none" alt="Quasar Media Player" /></a></p>
<p>I am pleased to announce beta 4 of Quasar Media Player.<br />
This new version introduces some new features and big improvements in terms of performance and memory-usage.<br />
The previously separate last.fm Audioscrobbler <a href="http://katastrophos.net/andre/blog/software/qscrobbler/"><strong>QScrobbler</strong></a> has been integrated into Quasar as add-on.<br />
This release also marks the introduction of the <strong>Cover Art Downloader</strong> which uses the new <a href="http://katastrophos.net/andre/blog/software/cover-art-providers/"><strong>open-source katastrophos.net Cover Art search engine</strong></a> to download cover art images for the new <strong>Cover Art Flow album browser</strong>.</p>
<p><center><a href="http://katastrophos.net/andre/blog/wp-content/uploads/2007/10/QuasarWin1.PNG" rel="lightbox[298]"><img src="http://katastrophos.net/andre/blog/wp-content/uploads/2007/10/QuasarWin1-150x122.PNG" alt="Quasar Media Player on Windows 7" title="Quasar Media Player on Windows 7" width="150" height="122" class="size-thumbnail wp-image-301" /></a><a href="http://katastrophos.net/andre/blog/wp-content/uploads/2007/10/QuasarOSX2.png" rel="lightbox[298]"><img src="http://katastrophos.net/andre/blog/wp-content/uploads/2007/10/QuasarOSX2-150x122.png" alt="Cover Art Downloader on OS X" title="Cover Art Downloader on OS X" width="150" height="122" class="size-thumbnail wp-image-303" /></a></center></p>
<p>Binaries for the previous platforms (Sharp Qtopia and pdaXrom) along with new binaries for Windows and OS X (universal) are available on the <a href="http://katastrophos.net/quasar">project&#8217;s homepage</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2010/03/28/quasar-media-player-0-96-beta-4-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nightly Builds of Quasar Media Player available</title>
		<link>http://katastrophos.net/andre/blog/2009/07/29/nightly-builds-of-quasar-media-player-available/</link>
		<comments>http://katastrophos.net/andre/blog/2009/07/29/nightly-builds-of-quasar-media-player-available/#comments</comments>
		<pubDate>Wed, 29 Jul 2009 22:38:51 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OS X]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/?p=199</guid>
		<description><![CDATA[It&#8217;s been some time since the last update. In my previous post I mentioned I was in the process of setting up a nightly build system. This system has been running silently since May. I guess it is finally time for me to officially announce the nightly builds of Quasar Media Player: http://www.katastrophos.net/downloads/quasar/nightly/ Along with [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://katastrophos.net/quasar"><img src="http://katastrophos.net/zaurus/sources/quasar/quasar_logo.png" class="noframe" border="0" style="border: none" alt="Quasar Media Player" /></a></p>
<p>It&#8217;s been some time since the last update. In my previous post I mentioned I was in the process of setting up a nightly build system. This system has been running silently since May.<br />
I guess it is finally time for me to officially announce the nightly builds of Quasar Media Player:</p>
<p><a href="http://www.katastrophos.net/downloads/quasar/nightly/" class="websitelink" target="_blank">http://www.katastrophos.net/downloads/quasar/nightly/</a></p>
<p>Along with the most <a href="http://www.katastrophos.net/downloads/quasar/nightly/source/" target="_blank">current sourcecode tarball</a>, binaries are available for 4 platforms:<br />
<a href="http://www.katastrophos.net/downloads/quasar/nightly/win32/" target="_blank">Windows (win32)</a>, <a href="http://www.katastrophos.net/downloads/quasar/nightly/osx/" target="_blank">OS X (universal binary)</a>, <a href="http://www.katastrophos.net/downloads/quasar/nightly/sharp-qtopia/" target="_blank">Sharp Qtopia</a> and <a href="http://www.katastrophos.net/downloads/quasar/nightly/pdaxrom/" target="_blank">pdaXrom</a> Linux (both for Zaurus PDA)<br />
The Windows version comes in two styles: a generic setup (EXE) and a self-contained portable version (7z archive)</p>
<p>Enjoy and please leave a comment.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2009/07/29/nightly-builds-of-quasar-media-player-available/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Setting up the Inno Setup compiler on Debian</title>
		<link>http://katastrophos.net/andre/blog/2009/03/16/setting-up-the-inno-setup-compiler-on-debian/</link>
		<comments>http://katastrophos.net/andre/blog/2009/03/16/setting-up-the-inno-setup-compiler-on-debian/#comments</comments>
		<pubDate>Sun, 15 Mar 2009 23:36:22 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Debian]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Findings]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Server]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/?p=180</guid>
		<description><![CDATA[I&#8217;m currently setting up a nightly build system for Quasar on my Linux box which is running Debian. This system also cross-compiles Quasar for Windows. The Windows version of Quasar is going to be available in two fashions: one self-contained, portable version and one version that can be installed. I&#8217;m not a huge fan of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m currently setting up a nightly build system for Quasar on my Linux box which is running Debian. This system also cross-compiles Quasar for Windows.<br />
The Windows version of Quasar is going to be available in two fashions: one self-contained, portable version and one version that can be installed.<br />
I&#8217;m not a huge fan of installers. But when it comes to creating a setup program for a given Windows application I&#8217;m quite accustomed to <a href="http://www.innosetup.com" target="_blank">Inno Setup</a> having used it for years. Unfortunately there is no native Linux version of the Inno Setup compiler available for Linux. <a href="http://nsis.sourceforge.net" target="_blank">NSIS</a> exists as package for Debian but I am not fond of using it, largely because I am a Delphi guy. :)<br />
So, here is a small guide on how to get the Inno Setup compiler up and running on Debian:</p>
<p>First step is to install <a href="http://www.winehq.org" target="_blank">Wine</a> either as super user or by using <strong>sudo</strong>:</p>
<pre name="code" class="bash:nocontrols">
sudo apt-get install wine
</pre>
<p>As normal user fire up your X server and your favourite terminal application and get the latest <a href="http://www.innosetup.com/isdl.php#qsp" target="_blank">Inno Setup QuickStart pack</a>:</p>
<pre name="code" class="bash:nocontrols">
mkdir /tmp/innosetup
cd /tmp/innosetup
wget http://files.jrsoftware.org/ispack/ispack-5.2.3.exe
wine ./ispack-5.2.3.exe
</pre>
<p>This will start the installer in Wine. Note, for the installation you will need a running X11 server since the installer obviously is graphical. If you have not set up Wine before, the default location <strong>C:\Program Files\Inno Setup 5</strong> will install to <strong>~/.wine/drive_c/Programme/Inno Setup 5</strong>.</p>
<p>Luckily the Inno Setup compiler offers a command line interface, ISCC.exe, which will run in Wine without the necessity of having a X server running. So it is ideally suited for automated runs.</p>
<p>Here is a simple wrapper shell script called <strong>iscc</strong>:</p>
<pre name="code" class="bash:nocontrols">
#!/bin/sh
unset DISPLAY
scriptname=$1
[ -f "$scriptname" ] &#038;&#038; scriptname=$(winepath -w "$scriptname")
wine "C:\Program Files\Inno Setup 5\ISCC.exe" "$scriptname" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9"
</pre>
<p>I installed this script in my local bin directory (~/bin) and added it to the PATH environment variable.<br />
This will allow running the Inno Setup compiler from anywhere and it also makes it very easy to integrate into a build script. You can even feed a script via stdin, e.g. something like:</p>
<pre name="code" class="bash:nocontrols">
iscc - < ./myscript.iss</pre>
</pre>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2009/03/16/setting-up-the-inno-setup-compiler-on-debian/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Q&#8230;/Free: Bug in QProcess writeToStdin</title>
		<link>http://katastrophos.net/andre/blog/2008/03/15/qfree-bug-in-qprocess-writetostdin/</link>
		<comments>http://katastrophos.net/andre/blog/2008/03/15/qfree-bug-in-qprocess-writetostdin/#comments</comments>
		<pubDate>Sat, 15 Mar 2008 15:57:14 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Findings]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[Windows]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2008/03/15/qfree-bug-in-qprocess-writetostdin/</guid>
		<description><![CDATA[All right, this post is just to stop somebody else&#8217;s suffering in figuring out why writing to stdin in QProcess on Version 3.3.x-8 of Q&#8230;/Free doesn&#8217;t work on Windows. Well, actually it works but just for the first line you write to stdin. There is a bug in qprocess.cpp at line 730: void QProcess::writeToStdin( const [...]]]></description>
			<content:encoded><![CDATA[<p>All right, this post is just to stop somebody else&#8217;s suffering in figuring out why writing to stdin in QProcess on <a href="http://sourceforge.net/project/showfiles.php?group_id=49109&#038;package_id=42335" target="_blank">Version 3.3.x-8</a> of <a href="http://qtwin.sourceforge.net" target="_blank">Q&#8230;/Free</a> doesn&#8217;t work on Windows. Well, actually it works but just for the first line you write to stdin. There is a bug in qprocess.cpp at line 730:</p>
<pre name="code" class="c++:nocontrols:firstline[727]">
void QProcess::writeToStdin( const QString&#038; buf )
{
    QByteArray tmp = buf.local8Bit();
    tmp.resize( tmp.size() - 1 ); // drop the implicit \0
    writeToStdin( tmp );
}
</pre>
<p>should be:</p>
<pre name="code" class="c++:nocontrols:firstline[727]">
void QProcess::writeToStdin( const QString&#038; buf )
{
    QByteArray tmp = buf.local8Bit();
    tmp.resize( buf.length() );
    writeToStdin( tmp );
}
</pre>
<p>Verision 3.3.7-7 includes the latter method, same as the latest Qt 4.3 sources. So, it&#8217;s actually a regression in 3.3.x-8. If you require the latest Qt 3 / Q&#8230;/Free for your open source application and need to write to some other processes&#8217; stdin, you can just use a wrapper workaround that uses the latter method and directly uses writeToStdin( const QByteArray&#038; buf ) instead of the QString variant.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2008/03/15/qfree-bug-in-qprocess-writetostdin/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QScrobbler</title>
		<link>http://katastrophos.net/andre/blog/2007/12/24/qscrobbler/</link>
		<comments>http://katastrophos.net/andre/blog/2007/12/24/qscrobbler/#comments</comments>
		<pubDate>Mon, 24 Dec 2007 15:44:59 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2007/12/24/qscrobbler/</guid>
		<description><![CDATA[Today I&#8217;m releasing QScrobbler: a Last.fm / Audioscrobbler add-on for Quasar Media Player. As with Quasar, I&#8217;ve been using QScrobbler for almost a year now and finally decided it is ready for the public. ;) For more details please visit the project&#8217;s homepage here.]]></description>
			<content:encoded><![CDATA[<p><a href="http://katastrophos.net/qscrobbler"><img src="http://www.katastrophos.net/zaurus/sources/qscrobbler/qscrobbler_logo.png" class="noframe" border="0" style="border: none" alt="QScrobbler" /></a></p>
<p>Today I&#8217;m releasing <a href="http://katastrophos.net/qscrobbler">QScrobbler</a>: a <a href="http://www.last.fm" target="_blank">Last.fm / Audioscrobbler</a> add-on for <a href="http://katastrophos.net/quasar" target="_blank">Quasar Media Player</a>.</p>
<p>As with Quasar, I&#8217;ve been using QScrobbler for almost a year now and finally decided it is ready for the public. ;)<br />
For more details please visit the project&#8217;s homepage <a href="http://katastrophos.net/qscrobbler">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2007/12/24/qscrobbler/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Quasar Media Player</title>
		<link>http://katastrophos.net/andre/blog/2007/10/06/quasar-media-player/</link>
		<comments>http://katastrophos.net/andre/blog/2007/10/06/quasar-media-player/#comments</comments>
		<pubDate>Sat, 06 Oct 2007 17:10:14 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2007/10/06/quasar-media-player/</guid>
		<description><![CDATA[Finally! Almost a year after the first mentioning of my new media player for the Sharp Zaurus and after several development hiati, I&#8217;m today officially releasing the Quasar Media Player for SharpROM- and pdaXrom-based distributions. For more details please visit the project&#8217;s homepage here.]]></description>
			<content:encoded><![CDATA[<p><a href="http://katastrophos.net/quasar"><img src="http://katastrophos.net/zaurus/sources/quasar/quasar_logo.png" class="noframe" border="0" style="border: none" alt="Quasar Media Player" /></a></p>
<p>Finally! Almost a year after <a href="http://katastrophos.net/andre/blog/2006/12/19/yet-another-zaurus-media-player-done-differently-phase-1-teasing/">the first mentioning</a> of my new media player for the Sharp Zaurus and after several development hiati, I&#8217;m today officially releasing the Quasar Media Player for SharpROM- and pdaXrom-based distributions.<br />
For more details please visit the project&#8217;s homepage <a href="http://katastrophos.net/quasar">here</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2007/10/06/quasar-media-player/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Yet Another Zaurus Media Player”… not dead yet: &#8220;Quasar Media Player&#8221;</title>
		<link>http://katastrophos.net/andre/blog/2007/07/28/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-not-dead-yet-quasar-media-player/</link>
		<comments>http://katastrophos.net/andre/blog/2007/07/28/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-not-dead-yet-quasar-media-player/#comments</comments>
		<pubDate>Sat, 28 Jul 2007 21:07:33 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2007/07/28/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-not-dead-yet-quasar-media-player/</guid>
		<description><![CDATA[Alright, this blog has been very quiet for the last few months. That&#8217;s partially due to me being very busy with other stuff. I&#8217;m slowly picking up pace and getting things done again. So, here is a short update on the media player that I&#8217;m currently developing for my Zaurus. Well, actually it&#8217;s been in [...]]]></description>
			<content:encoded><![CDATA[<p>Alright, this blog has been very quiet for the last few months. That&#8217;s partially due to me being very busy with other stuff.<br />
I&#8217;m slowly picking up pace and getting things done again.</p>
<p>So, here is a short update on the media player that I&#8217;m currently developing for my Zaurus. Well, actually it&#8217;s been in long-term testing mode for ages now&#8230; :)<br />
I finally have a name for it. It will be called &#8220;Quasar Media Player&#8221; &#8211; or shorter &#8220;Quasar&#8221;. Below are some screenshots of the current development version running on Qtopia. I hope to have a release ready soon.</p>
<p><a href="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/quasar001.png" target="_blank" title="{Quasar} Shown is the new toolbar and play list selector." rel="lightbox[61]"><img src="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/thumb_quasar001.png" alt="{Quasar} Shown is the new toolbar and play list selector." width="130" height="97" /></a><a href="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/quasar002.png" target="_blank" title="{Quasar} The new play info screen. Cover art is supported and rendered in this funky view. Any Satch fans out there? ;)" rel="lightbox[61]"><img src="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/thumb_quasar002.png" alt="{Quasar} The new play info screen. Cover art is supported and rendered in this funky view. Any Satch fans out there? ;)" width="130" height="97" /></a><a href="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/quasar003.png" target="_blank" title="{Quasar} More eyecandy." rel="lightbox[61]"><img src="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/thumb_quasar003.png" alt="{Quasar} More eyecandy." width="130" height="97" /></a><a href="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/quasar004.png" target="_blank" title="{Quasar} Normal list view filtered." rel="lightbox[61]"><img src="http://katastrophos.net/andre/blog/wp-content/photos/Quasar/thumb_quasar004.png" alt="{Quasar} Normal list view filtered." width="130" height="97" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2007/07/28/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-not-dead-yet-quasar-media-player/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>“Yet Another Zaurus Media Player”… done differently . (Phase 2.1: Development progress 2)</title>
		<link>http://katastrophos.net/andre/blog/2007/01/06/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-done-differently-phase-21-development-progress-2/</link>
		<comments>http://katastrophos.net/andre/blog/2007/01/06/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-done-differently-phase-21-development-progress-2/#comments</comments>
		<pubDate>Sat, 06 Jan 2007 03:48:38 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gadgets]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Quasar Media Player]]></category>
		<category><![CDATA[Random]]></category>
		<category><![CDATA[Zaurus]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2007/01/06/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-done-differently-phase-21-development-progress-2/</guid>
		<description><![CDATA[Yet another short update on the development of my still untitled media player for the Zaurus. In the meantime it&#8217;s called YAZMP. Again, I&#8217;ve been working on improving performance &#8211; this time on the performance when loading playlists. Before I continue, let me give a brief overview of the structure: Library -> Playlists < -> [...]]]></description>
			<content:encoded><![CDATA[<p>Yet another short update on the development of my <em>still untitled</em> media player for the Zaurus. In the meantime it&#8217;s called YAZMP.</p>
<p>Again, I&#8217;ve been working on improving performance &#8211; this time on the performance when loading playlists.<br />
Before I continue, let me give a brief overview of the structure:</p>
<p><strong><strike>Library</strike> -> Playlists < -> Media Cache</strong></p>
<p>YAZMP doesn&#8217;t manage a library similar to i*Tunes. Instead it solely relies on playlists. Metadata (title, artist, album, etc.) is kept in the database and will be associated to once the playlist is loaded. The reason for this is pretty simple: Scanning audio files (and media files in general) each and every time a playlist is loaded will definitely take a lot of time. So, for every file the gathered metadata will be saved in the DB. Think of it as a cache.<br />
<span id="more-58"></span><br />
<a href="http://atty.skr.jp/zplayer/" target="_blank">ZPlayer</a>, which YAZMP is based on, follows a similar approach. However, in my opinion it&#8217;s ill-conceived in the current version. It keeps the media cache in memory all the time. With lots of files this can get very expensive. Also, ZPlayer isn&#8217;t very efficient at saving the media cache to disk. It does so for the whole cache, not just changed entries. Furthermore, when saving the cache on quitting, ZPlayer sometimes simply truncates the cache file and all metadata is lost. So, next time you open it, it has to scan all files again&#8230;<br />
Perhaps I&#8217;m nitpicking, perhaps I&#8217;m an optimization dork, whatever it is, please forgive my harsh words for the otherwise excellent work atty and Atmark have done in ZPlayer!</p>
<p><strong>Technical ramblings</strong></p>
<p>For YAZMP I rewrote the metadata cache management from scratch and extended it to do a lot more.<br />
As I already mentioned above, YAZMP doesn&#8217;t manage any library, it only knows about filenames in playlist files.<br />
For that to work correctly and efficient especially in combination with the media cache, there are four cases that need to be taken care of:</p>
<ol>
<li><strong>A new file has been added to the playlist which doesn&#8217;t exist in the media cache.</strong><br />
This case is very simple: The player has to scan the file no matter what.</li>
<li><strong>A file has been physically removed and it&#8217;s metadata is still in the cache.</strong><br />
In this case the player has junk entries in its database, which need to be cleaned once in a while.</li>
<li><strong>A file has been renamed, that is, it&#8217;s basename changed</strong></li>
<li><strong>A file or a whole directory / sub-tree of files have moved to another location.</strong><br />
In a naive implementation both cases would trigger a lengthy rescan of the file(s) that are about to be added in the playlist, because new location can&#8217;t be associated with any data in the cache.<br />
For YAZMP I&#8217;ll use several approaches + fallbacks to try to limit the impact. The following messy pseudo-code illustrates this:</p>
<pre>
  <strong>get attributes</strong> <em>filename</em>, <em>directory</em> <strong> from current playlist item to be added</strong>
  <strong>get attributes</strong> <em>filesize</em>, <em>lastmoddate</em> <strong>for file</strong> (<em>directory</em> + <em>filename</em>)

  <font color="#080">// NOTE: check via checksum / hash for faster lookup</font>
  <strong>if exactly one</strong> entry <strong>by hash value of</strong> (<em>directory</em> + <em>filename</em>) <strong>in DB then</strong>
    <font color="#080">// NOTE: did the file change since the last scan?</font>
    <strong>if</strong> entry.filesize <strong>not equal</strong> <em>filesize</em> <strong>or</strong> entry.lastmoddate <strong>not equal</strong> <em>lastmoddate</em> <strong>in FS then</strong>
      <strong>rescan file</strong> (<em>directory</em> + <em>filename</em>) <strong>and update</strong> entry <strong>in DB</strong>
    <strong>return</strong> entry
  <strong>else if exactly one</strong> entry <strong>by tuple of</strong> (<em>filename</em>, <em>filesize</em>, <em>lastmoddate</em>) <strong>in DB then</strong>
    <font color="#080">// Was the file moved to a new directory? (case 4)
    // If so, check for other files in the old directory and change them
    // to the new location...
    // NOTE: this is purely predictive. It might not always yield a benefit.</font>
    <strong>if directory by value of</strong> entry.location <strong>not in FS then</strong>
      <strong>change every</strong> siblingentry <strong>in DB where</strong> siblingentry.location <strong>is</strong> entry.location
        <strong>set</strong> siblingentry.location to <em>directory</em>
        <strong>set</strong> siblingentry.locationHash <strong>to hash value of</strong> (<em>directory</em> + siblingentry.filename)
      <strong>until no</strong> siblingentry <strong>is left</strong>
    <font color="#080">// NOTE: did the file change since the last scan?</font>
    <strong>if</strong> entry.filesize <strong>not equal</strong> <em>filesize</em> <strong>or</strong> entry.lastmoddate <strong>not equal</strong> <em>lastmoddate</em> <strong>in FS then</strong>
      <strong>rescan file</strong> (<em>directory</em> + <em>filename</em>) <strong>and update</strong> entry <strong>in DB</strong>
    <strong>return</strong> entry
  <font color="#080">// NOTE: For case 3 one could check for a smaller tuple of (filesize, lastmoddate)</font>
  <font color="#080">// which would result in the almost the same code as above</font>
  <font color="#080">// The likeness of wrong results is a lot higher though.</font>
  <strong>else</strong>
    <strong>scan file</strong> (<em>directory</em> + <em>filename</em>) <strong>as</strong> newentry <strong>and add</strong> newentry <strong>to DB</strong>
    <strong>return</strong> newentry
</pre>
</li>
</ol>
<p><strong>Conclusion</strong></p>
<p>What that means is pretty simple: You can move your media files to a different location, perhaps a SD-Card, and the player will still be able to associate the new location in the playlist file with the data it has in cache. And that means: No useless scanning of files and fast playlist load times.</p>
<p><strong>Yet another feature&#8230;</strong></p>
<p>I tend to copy several albums to my Zaurus for listening on the road. So, once I&#8217;ve copied new stuff, it&#8217;s always the same mindless and inconvenient procedure in most players: Clear the playlist, add files or directories, play stuff.<br />
And that brings me straight to another new feature: Dynamic Playlists<br />
In general the idea is pretty simple: Instead of just listing every file&#8217;s location in a playlist file, one may also list folders that are automatically scanned for audio or video files. Here is an example:</p>
<p>Music.dynplaylist</p>
<pre>
/hdd3/Music/test1.mp3
/mnt/card/Music/Mozart/
/hdd3/Music/Beethoven/**
</pre>
<p>This will add a single file &#8220;test1.mp3&#8243;, all files in &#8220;/mnt/card/Music/Mozart/&#8221; and all files in &#8220;/hdd3/Music/Beethoven/&#8221; including all files in its sub-directories.</p>
<p><strong>Conclusion</strong></p>
<p>Instead of adding files, you just define what the layout of the playlist should look like and the player does the rest automatically. It can even rescan for changes. It&#8217;s all wrapped up in a nice UI.<br />
Combined with the flexibility of the metadata cache and the fact that one isn&#8217;t forced into this library thing, I think this makes for a pretty unique solution. What do you think?</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2007/01/06/%e2%80%9cyet-another-zaurus-media-player%e2%80%9d%e2%80%a6-done-differently-phase-21-development-progress-2/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>SQLite simple timing profiler patch</title>
		<link>http://katastrophos.net/andre/blog/2007/01/04/sqlite-simple-timing-profiler-patch/</link>
		<comments>http://katastrophos.net/andre/blog/2007/01/04/sqlite-simple-timing-profiler-patch/#comments</comments>
		<pubDate>Thu, 04 Jan 2007 10:27:10 +0000</pubDate>
		<dc:creator>Andre Beckedorf</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Hack]]></category>
		<category><![CDATA[Quasar Media Player]]></category>

		<guid isPermaLink="false">http://katastrophos.net/andre/blog/2007/01/04/sqlite-simple-timing-profiler-patch/</guid>
		<description><![CDATA[Update: SQLite now features an integrated timer which can be activated via the .timer command in the console shell. Details here. As a follow-up to my previous post &#8220;SQLite performance tuning and optimization on embedded systems&#8221; here is a very basic patch that introduces support for timing SQL queries in the sqlite3 console shell. SQLite [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Update: SQLite now features an integrated timer which can be activated via the .timer command in the console shell. <a href="http://www.sqlite.org/cvstrac/chngview?cn=4522">Details here.</a></strong></p>
<p>As a follow-up to <a href="http://katastrophos.net/andre/blog/2007/01/04/sqlite-performance-tuning-and-optimization-on-embedded-systems/" target="_blank">my previous post &#8220;SQLite performance tuning and optimization on embedded systems&#8221;</a> here is a very basic patch that introduces support for timing SQL queries in the sqlite3 console shell.</p>
<p><strong>SQLite 3.3.8</strong>:<br />
<a class="downloadlink" href="http://katastrophos.net/downloads/sqlite/shell.c_sqlite3.3.8_profiling.patch">Patch against shell.c</a> <a class="downloadlink" href="http://katastrophos.net/downloads/sqlite/shell_sqlite3.3.8_profiling.c">shell.c</a></p>
<p><strong>SQLite 3.3.9 CVS</strong> &#8211; shell.c rev 1.157:<br />
<a class="downloadlink" href="http://katastrophos.net/downloads/sqlite/shell.c_sqlite3.3.9pre_profiling.patch">Patch against shell.c</a> <a class="downloadlink" href="http://katastrophos.net/downloads/sqlite/shell_sqlite3.3.9pre_profiling.c">shell.c</a></p>
<p>Two new shell commands are introduced in sqlite3:</p>
<pre>
.profile ON|OFF        Turn profiling on or off
.timer start|show      Measure elapsed CPU time
</pre>
<p><strong>.profile ON</strong> will turn off output to stdout. Instead it will display CPU execution time for every SQL command processed.<br />
Here is an example output:</p>
<pre>
<strong>sqlite></strong> .profile on
<strong>sqlite></strong> .read test1.sql
Exec time  BEGIN;                                       :  0.000 s.
Exec time  DROP TABLE IF EXISTS playlist_view;          :  0.020 s.
Exec time  DROP TABLE IF EXISTS overview;               :  0.000 s.
Exec time  CREATE TEMPORARY TABLE playlist_view AS   ...  :  0.180 s.
Exec time  CREATE TEMPORARY TABLE overview AS        ...  :  0.140 s.
Exec time  SELECT DISTINCT genre, genre IN ("Progress...  :  0.030 s.
...
</pre>
<p>Note: You can still override the output setting with the <strong>.output</strong> command after an <strong>.profile ON</strong> has been issued.<br />
<strong>.profile OFF</strong> will turn off time-based profiling and reenable output to stdout.</p>
<p><strong>.timer start</strong> will start a timer. You can execute a sequence of queries and then print the required CPU time via <strong>.timer show</strong>.<br />
Use <strong>.timer start</strong> again to reset the timer. This .timer patch is based on <a href="http://www.sqlite.org/cvstrac/tktview?tn=1227" target="_blank">SQLite ticket #1227</a> by Bartosz Polednia.</p>
<p>Timing is currently done using clock() which provides only a 10 ms precision for CPU time on most systems. This might be inadequate depending on your requirements. If you know a more precise way, please let me know.</p>
]]></content:encoded>
			<wfw:commentRss>http://katastrophos.net/andre/blog/2007/01/04/sqlite-simple-timing-profiler-patch/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

