<?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>Songbird Blog &#187; Matt</title>
	<atom:link href="http://blog.songbirdnest.com/author/Matt/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.songbirdnest.com</link>
	<description>Play music. Play the Web.</description>
	<lastBuildDate>Thu, 09 Feb 2012 00:55:55 +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>1.1 Memory Update</title>
		<link>http://blog.songbirdnest.com/2009/03/02/11-memory-update/</link>
		<comments>http://blog.songbirdnest.com/2009/03/02/11-memory-update/#comments</comments>
		<pubDate>Tue, 03 Mar 2009 02:48:30 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Announcements]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=1040</guid>
		<description><![CDATA[In the past, the &#8216;Bird has been known to eat more than its fair share of memory. Many people asked us to put Songbird on a tighter diet, and this was a big part of our focus for the 1.1 release. Fortunately, Mozilla spent the last few years working on the same problems, and created [...]]]></description>
			<content:encoded><![CDATA[<p>In the past, the &#8216;Bird has been known to eat more than its fair share of memory. Many people asked us to put Songbird on a tighter diet, and this was a big part of our focus for the 1.1 release.</p>
<p>Fortunately, Mozilla spent the last few years working on the same problems, and created some great <A href="https://wiki.mozilla.org/Performance:Leak_Tools">tools</a> and <a href="http://people.mozilla.com/~dbaron/leak-screencasts/">tutorials</a> to get us started. </p>
<p>For example, this is a <a href="http://en.wikipedia.org/wiki/Treemap">treemap</a> we <a href="http://wiki.songbirdnest.com/Developer/Articles/Debugging/Using_TraceMalloc_with_Songbird">generated</a> using a <a href="http://www.mozilla.org/projects/footprint/live-bloat.html">TraceMalloc</a> snapshot and the <a href="http://blog.thejit.org/javascript-information-visualization-toolkit-jit/" >JavaScript Information Visualization Toolkit</a>, showing a simplified view of who allocated what: </p>
<p><img src="http://blog.songbirdnest.com/wp-content/uploads/2009/03/treemap.png" alt="treemap" title="treemap" width="500" height="300" class="alignnone size-full wp-image-1041" /></p>
<p>Initially this view was just depressing.  It looked like our only hope was to get rid of the XBL bindings, JavaScript, CSS, database engine and everything else that makes Songbird cool.  Eventually, after many hours exploring memory allocation logs, we found areas that could be easily improved.</p>
<p>Here are some results:</p>
<p><img src="http://blog.songbirdnest.com/wp-content/uploads/2009/03/memory.png" alt="memory" title="memory" width="500" height="394" class="alignnone size-full wp-image-1042" /></p>
<p><small>Details: For this comparison we used a Windows XP SP2 machine with 1GB of RAM, and a library of 20,000 mp3s.  By &#8220;Add-ons or Helpers&#8221; we mean the default add-ons for Songbird, the Winamp taskbar agent, iTunesHelper.exe, and WMP&#8217;s Media Guide.</small></p>
<p>And the winner is&#8230; Windows Media Player? Unexpected.  </p>
<p>The point is we managed to reduce basic memory use with a large library by about 40%.  Even more important, Songbird will no longer take all your RAM if you leave it playing for a week.</p>
<p>Specifically, we:</p>
<ul>
<li>Cut CPU usage during playback by half</li>
<li>Fixed some serious playback memory leaks</li>
<li>Drastically <a href="http://wiki.songbirdnest.com/Docs/Power_User_Preferences/Tuning_Songbird_Memory_Usage">restricted database caching</a></li>
<li>Tuned the media item property cache</li>
<li>Added batching to the media importer, reducing memory use by 60%</li>
<li>Reduced Mac download size 45% by stripping debug symbols (oops)</li>
<li>Fixed minor memory leaks when switching feathers</li>
<li>Extended our performance monitoring farm to track memory usage and prevent regressions</li>
</ul>
<p>There is still a lot to do though, and we&#8217;ll continue to focus on memory and performance in the future. The iTunes importer, add-ons like mashTape, or lots of browser tabs significantly increase memory usage, and deleting a lot of tracks at once still takes a long, long time. </p>
<p>If you haven&#8217;t yet, please grab the <a href="http://wiki.songbirdnest.com/Developer/Articles/Builds/Nightly_Builds">latest 1.1 beta</a> and give it a try. <a href="http://getsatisfaction.com/songbird" />Let us know</a> what is working, and what is still painful.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2009/03/02/11-memory-update/feed/</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>SQLite Memory Preferences</title>
		<link>http://blog.songbirdnest.com/2009/01/30/sqlite-memory-preferences/</link>
		<comments>http://blog.songbirdnest.com/2009/01/30/sqlite-memory-preferences/#comments</comments>
		<pubDate>Sat, 31 Jan 2009 01:19:35 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=962</guid>
		<description><![CDATA[Quick update: Closing Bug 14442 made it possible to fine-tune how much memory Songbird uses to load and display your library. Up to this point Songbird has allowed SQLite to cache whatever it wants, meaning that over time your entire library database can end up in RAM. We&#8217;re changing this with 1.1, and are in [...]]]></description>
			<content:encoded><![CDATA[<p>Quick update:</p>
<p>Closing <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=14442">Bug 14442</a> made it possible to fine-tune how much memory Songbird uses to load and display your library.  </p>
<p>Up to this point Songbird has allowed SQLite to cache whatever it wants, meaning that over time your entire library database can end up in RAM.  </p>
<p><img src="http://blog.songbirdnest.com/wp-content/uploads/2009/01/01_hungry_0.png" alt="01_hungry_0" title="01_hungry_0" width="420" height="220" class="alignnone size-full wp-image-963" /></p>
<p>We&#8217;re changing this with 1.1, and are in the process of coming up with some heuristics.  If you&#8217;d like to help out, or want explicit control over SQLite memory usage, try the <a href="http://wiki.songbirdnest.com/Docs/Power_User_Preferences/Tuning_Songbird_Memory_Usage" >new preferences</a> in a <a href ="http://wiki.songbirdnest.com/Developer/Articles/Builds/Nightly_Builds" >nightly build</a> after January 30th.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2009/01/30/sqlite-memory-preferences/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Performance Improvements for 1.0</title>
		<link>http://blog.songbirdnest.com/2008/11/26/performance-improvements-for-10/</link>
		<comments>http://blog.songbirdnest.com/2008/11/26/performance-improvements-for-10/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 01:42:20 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[performance development 1.0]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=690</guid>
		<description><![CDATA[Optimization requires taking a step back to observe, measure, and experiment. Somehow it seems like a luxury, and features or bug fixes are always the priority. This release though, thanks to the survey and GetSatisfaction feedback you&#8217;ve been sending, speed was a primary focus. dbradley, pvh, jacklu, kreeger and myself had a lot of fun [...]]]></description>
			<content:encoded><![CDATA[<p>Optimization requires taking a step back to observe, measure, and experiment. Somehow it seems like a luxury, and features or bug fixes are always the priority. This release though, thanks to the survey and GetSatisfaction feedback you&#8217;ve been sending, speed was a primary focus.  </p>
<p>dbradley, pvh, jacklu, kreeger and myself had a lot of fun working on performance problems that had been annoying us. Our goal was to improve basic every-day library management, and the results are a huge step forward.</p>
<p>Scrolling is much much smoother, searching is thousands of times faster, databases are 60% smaller, and importing is nearly twice as fast and many times more efficient.  Songbird is much more pleasant to use, and can now easily handle 20,000+ track libraries.  In fact, it seems to scale about as well as other popular players.</p>
<h4>OBLIGATORY INFOPORN</h4>
<p><a href="http://files.songbirdnest.com/wp-content/uploads/2008/11/graph.png"><img src="http://files.songbirdnest.com/wp-content/uploads/2008/11/graph.png" alt="" width="500" height="468" class="alignnone size-full wp-image-691" /></a></p>
<p>This is (mostly) the output from a new performance lab that marcc and toks set up.  Every night we get performance reports for the library API, allowing us to verify progress and avoid regressions.  Don&#8217;t worry about the times, these are stress tests, not actual user use-cases. The lower the time, the better the performance.  </p>
<p>Read on if you&#8217;re interested in how these improvements were made.<br />
<span id="more-690"></span></p>
<h4>SCROLLING</h4>
<p>The main library view is a XUL Tree widget, just like the bookmarks in Firefox and mail view in Thunderbird, so we were concerned that Songbird used nearly twice as much CPU and scrolled much more slowly than these applications. Simply moving the mouse in a circle over the tree would consume up to 80% CPU.</p>
<p>Profiling with <a href="http://developer.apple.com/tools/sharkoptimize.html">Shark</a> showed a lot of wasted effort reading item metadata and firing events while painting the tree.  A little work to adjust how the selection is maintained and refactor the caching code significantly improved library scrolling.</p>
<p>Next was a paging hiccup every 1000 items when scrolling large libraries. Logging and timing queries showed that secondary sorting was to blame (first sort by artist, then by album, then by disc number and track number).  Getting sorted media item IDs for 1000 rows could require hundreds of queries, each with a cost proportional to the library size. </p>
<p>Since secondary sorting is not user configurable we now pre-compute another sort value for each property. For example, when album metadata for a track changes, the secondary sort value for the artist property is rebuilt and indexed, making sorting by artist, album, disc, track number essentially free.</p>
<h4>SEARCH + FILTERING</h4>
<p>In 0.7 we moved to <a href="http://ft3.sourceforge.net/">SQLite Full Text Search (FTS3)</a>, and found that in most cases it was extremely fast. Unfortunately though search time grew exponentially with the number of match results, and searching for &#8220;a&#8221; in large library could hang for up to 30 seconds.  Lame.</p>
<p>Half of the problem was the secondary sorting issue that had been slowing down scrolling.  Each query had to include the search and filter constraints, so a slight cost increase would be multiplied by 50 to 100x. Removing this multiplier helped a great deal.</p>
<p>The other half turned out to be the way we were joining the FTS3 table to the properties. Query optimization is mysterious, so testing and measurement are critical.   Query logging, our performance test harness, and the SQLite &#8216;EXPLAIN QUERY PLAN&#8217; command helped us determine that joining the FTS table, then the properties, then the media items is an order of magnitude faster than equivalent queries.</p>
<p>Finally, since library filter lists only show a small number of values, we now fetch all rows at once, removing the need for a separate count query of approximately the same cost.   </p>
<p>Lessons learned:</p>
<ul>
<li>Table joining order is extremely important.  As a rule, join the most restricting or most expensive to join table first. Whatever you do, test a few permutations. </li>
<li>Joining with virtual and temporary tables prevents the use of an index for both joining and sorting.   &#8216;EXPLAIN QUERY PLAN&#8217; shows that an index can still help with a join, but sorting has to be done the hard way. </li>
<li>Occasionally the query optimizer will make bad decisions, and forcing it to use a specific index can help quite a bit. Placing the unary plus operator (+) in front of a column name indicates that an index should not be used.  </li>
</ul>
<p>Recommended links:</p>
<ul>
<li><a href="http://www.sqlite.org/optoverview.html">SQLite Query Optimizer Overview</a></li>
<li><a href="http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html">SQLite Optimization FAQ</a></li>
<li><a href="http://katastrophos.net/andre/blog/2007/01/04/sqlite-performance-tuning-and-optimization-on-embedded-systems/">SQLite performance tuning and optimization on embedded systems</a></li>
</ul>
<h4>ADDING TRACKS</h4>
<p>Importing large libraries was slow, and required an obscene amount of memory.  With 1.0 it still isn&#8217;t ideal, but it&#8217;s fast, and the memory usage is 10% of what it was in 0.7.  Some of the improvement came from the database changes described below, but significant progress was made simply by avoiding unnecessary work.</p>
<p>The first pass removed unnecessary code paths.  0.7 computed an MD5 hash for every track, doubling IO costs, and would frequently loop over and copy the list of tracks.  This behaviour was redundant, and required a huge amount of memory when importing 50k+ tracks. </p>
<p>The second pass cleaned up library change listeners.  Tracing with the <a href="http://blogs.sun.com/brendan/entry/dtrace_meets_javascript">DTrace JavaScript probes</a> and profiling with <a href="http://www.hacksrus.com/~ginda/venkman/profiles/">Venkman</a> revealed that the smart playlist system and album art scanner ignored batching hints.  Batch notification was added after the initial listener API was created, and for backwards compatibility it is opt-in, making it easy to forget that a single JavaScript listener called 50,000 times can hang the UI.   The listeners were fixed, but we need an API that is easier to use correctly.</p>
<h4>DATABASE ENGINE</h4>
<p>Experimenting with <a href="https://developer.mozilla.org/en/Debugging_memory_leaks">BloatView </a> and <a href="http://developer.apple.com/documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/chapter_1_section_1.html">Instruments</a>, we established that the large library memory problems in 0.7 were mostly caused by our database engine. </p>
<p>Any time Songbird operates on a large set of media items (adding, deleting, enumerating) it builds multiple queries per item, enqueues them, and then executes them.  In 0.7 these queries were constructed as strings, which, multiplied by a library of 50k+ tracks, could require hundreds of megabytes. </p>
<p>The problem was solved by adding <a href="http://www.sqlite.org/c3ref/stmt.html">prepared statement</a> support to the database engine and library code.  Now a single compiled query instance can be used with a large set of parameters, and the number of media items involved is barely a factor. </p>
<p>Discoveries along the way:</p>
<ul>
<li>NS_ProxyRelease should be treated with caution, since it can cause objects to pile up.</li>
<li>A string query or prepared statement with a &#8220;column IN (?, ?, &#8230;)&#8221; clause is much faster than an equivalent set of &#8220;column = ?&#8221; prepared statements. </li>
<li>The SQLite &#8216;ANALYZE&#8217; command doesn&#8217;t need to be run all the time. Dump values from a typical database and include hardcoded results with the schema.</li>
</ul>
<h4>DATABASE SIZE</h4>
<p>The easiest way to improve database performance is to just have less data.  Seems obvious, but it&#8217;s easy to overlook.</p>
<p>In 0.7, a 10,000 track library required a 50MB database, of which 60% went to storing indices (according to the sqlite analyzer).  Indices store a complete copy of the indexed data, and are expensive to maintain.  They are also difficult to remove, as you have to be sure you wont hurt performance.  Using &#8216;EXPLAIN QUERY PLAN&#8217; to figure out which indices were used, and the performance test suite to avoid regressions, we dropped three indices for an overall size reduction of 40%.   </p>
<p>We also noticed that many values were stored as UTF-16, despite never containing Unicode (since our generic property schema stores everything as strings).  With a little experimentation we discovered that using UTF-8 databases did not impact performance, even for large libraries of entirely Unicode metadata.</p>
<p>Switching to UTF-8 gave another 40% reduction, and an average 10,000 track library in 1.0 is now 18MB.</p>
<h4>UP NEXT</h4>
<p>Where are the new pain points?  If you&#8217;ve been using the 1.0 RC builds please let us know how things are working, and where you think we should focus.  Songbird can never be &#8220;too fast&#8221; or &#8220;too lean&#8221; and we&#8217;re committed to improving performance in every release going forward.  </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2008/11/26/performance-improvements-for-10/feed/</wfw:commentRss>
		<slash:comments>50</slash:comments>
		</item>
		<item>
		<title>More Faster</title>
		<link>http://blog.songbirdnest.com/2008/09/15/more-faster/</link>
		<comments>http://blog.songbirdnest.com/2008/09/15/more-faster/#comments</comments>
		<pubDate>Mon, 15 Sep 2008 19:28:25 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[performance development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=490</guid>
		<description><![CDATA[Large library performance is a major theme this release, and the first few fixes are in: On my Mac Pro I&#8217;m seeing a 45% improvement over 0.7 when importing 10,000 tracks from a local folder. The win came mostly from removing the boring/terrifying &#8220;Identifying and Removing Duplicates&#8221; phase of the media import process. This phase [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://files.songbirdnest.com/wp-content/uploads/2008/09/importgraph.png" alt="Time to import 10,000 tracks" width="500" height="146" class="alignnone size-full wp-image-491" /></p>
<p>Large library performance is a <a href="http://wiki.songbirdnest.com/Roadmap">major theme this release</a>, and the first few fixes are in:  On my Mac Pro I&#8217;m seeing a 45% improvement over 0.7 when importing 10,000 tracks from a local folder.  </p>
<p>The win came mostly from removing the <a href="http://getsatisfaction.com/songbird/topics/finding_removing_duplicates_hanging_osx_network_area_storage">boring</a>/<a href="http://getsatisfaction.com/songbird/topics/does_the_remove_duplicates_function_remove_files_from_your_hard_disk">terrifying</a> &#8220;Identifying and Removing Duplicates&#8221; phase of the media import process.   This phase was added around 0.6 to protect finicky MTP devices, but didn&#8217;t turn out to be that important.  </p>
<p>Don&#8217;t worry about being overwhelmed with duplicate files, there is always stevel&#8217;s <a href="http://addons.songbirdnest.com/addon/216">The Exorcist add-on</a>. </p>
<p>Next week, faster search?</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2008/09/15/more-faster/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>New Metadata APIs</title>
		<link>http://blog.songbirdnest.com/2008/07/24/new-metadata-apis/</link>
		<comments>http://blog.songbirdnest.com/2008/07/24/new-metadata-apis/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 21:58:10 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[metadata]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=450</guid>
		<description><![CDATA[--- sbIMetadataJobManager.idl +++ sbIFileMetadataService.idl Last night&#8217;s build includes an all new faster, smaller, thread-safe(r) implementation of the metadata component. It hasn&#8217;t been broken in yet, so please give it a try and report any problems. If you are a developer and use sbIMetadataJobManager or sbIMetadataJob, you&#8217;ll need to update to the new sbIFileMetadataService.]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.songbirdnest.com/files/images/tehbugz.png" alt="Singing Bugz" /><br />
<code><br />
--- sbIMetadataJobManager.idl<br />
+++ sbIFileMetadataService.idl<br />
</code><br />
<a href="http://wiki.songbirdnest.com/Developer/Articles/Builds/Nightly_Builds">Last night&#8217;s build</a> includes an all new faster, smaller, thread-safe(r) <a href="http://timeline.songbirdnest.com/client/changeset/10092">implementation</a> of the metadata component.  It hasn&#8217;t been broken in yet, so please give it a try and report any problems.</p>
<p>If you are a developer and use sbIMetadataJobManager or sbIMetadataJob, you&#8217;ll need to update to the new <a href="http://src.songbirdnest.com/source/xref/components/mediacore/metadata/manager/public/sbIFileMetadataService.idl">sbIFileMetadataService</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2008/07/24/new-metadata-apis/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Metadata Progress</title>
		<link>http://blog.songbirdnest.com/2008/05/19/metadata-progress/</link>
		<comments>http://blog.songbirdnest.com/2008/05/19/metadata-progress/#comments</comments>
		<pubDate>Tue, 20 May 2008 03:47:48 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/?p=395</guid>
		<description><![CDATA[As Daniel mentioned, lots of work has gone into metadata support lately. The new editor is looking good, file writing unit tests are passing, and there are only a few bugs left for this release. Thanks for all your help! Here is a quick summary for fellow metadata nerds: &#160; FORMATS Songbird uses TagLib 1.5 [...]]]></description>
			<content:encoded><![CDATA[<p>As Daniel mentioned, <a href="http://bugzilla.songbirdnest.com/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;component=Metadata&amp;target_milestone=Eno&amp;long_desc_type=substring&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=&amp;deadlinefrom=&amp;deadlineto=&amp;bug_status=RESOLVED&amp;bug_status=VERIFIED&amp;bug_status=CLOSED&amp;resolution=FIXED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=&amp;emailassigned_to2=1&amp;emailreporter2=1&amp;emailqa_contact2=1&amp;emailcc2=1&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">lots of work</a> has gone into metadata support lately.  The new editor is looking good, file writing unit tests are passing, and there are only a <a href="http://bugzilla.songbirdnest.com/buglist.cgi?query_format=advanced&amp;short_desc_type=allwordssubstr&amp;short_desc=&amp;component=Metadata&amp;target_milestone=Eno&amp;long_desc_type=substring&amp;long_desc=&amp;bug_file_loc_type=allwordssubstr&amp;bug_file_loc=&amp;status_whiteboard_type=allwordssubstr&amp;status_whiteboard=&amp;keywords_type=allwords&amp;keywords=&amp;deadlinefrom=&amp;deadlineto=&amp;bug_status=UNCONFIRMED&amp;bug_status=NEW&amp;bug_status=ASSIGNED&amp;bug_status=REOPENED&amp;emailassigned_to1=1&amp;emailtype1=substring&amp;email1=&amp;emailassigned_to2=1&amp;emailreporter2=1&amp;emailqa_contact2=1&amp;emailcc2=1&amp;emailtype2=substring&amp;email2=&amp;bugidtype=include&amp;bug_id=&amp;votes=&amp;chfieldfrom=&amp;chfieldto=Now&amp;chfieldvalue=&amp;cmdtype=doit&amp;order=Reuse+same+sort+as+last+time&amp;field0-0-0=noop&amp;type0-0-0=noop&amp;value0-0-0=">few bugs left</a> for this release. Thanks for all your help!</p>
<p>Here is a quick summary for fellow metadata nerds:<br />
&nbsp;</p>
<p><strong>FORMATS</strong></p>
<p><img src="http://files.songbirdnest.com/wp-content/uploads/2008/05/meta.jpg" alt="" width="200" height="162" class="alignright size-full wp-image-396" align="right" hspace="10" />Songbird uses <a href="http://developer.kde.org/~wheeler/taglib.html">TagLib 1.5</a> on all platforms to read from FLAC, Ogg Vorbis, MP3, M4A, MusePack, TrueAudio, and WavPack files.  This includes all versions of ID3, APE, and Vorbis comments.  </p>
<p>On Windows/Mac the <a href="http://addons.songbirdnest.com/extensions/detail/23">QuickTime extension</a> adds AMR, M4P, and M4B reading.  </p>
<p>On Windows only, Windows Media Player adds WMA, WMV, ASF, ASX, and AVI reading support. </p>
<p>As of this release our TagLib wrapper also supports writing the following formats:</p>
<ul>
<li>MP3 &#8211; ID3v2.4, leaving existing ID3v1 as-is.</li>
<li>FLAC &#8211; Vorbis comments, updating ID3 tags if they exist.</li>
<li>MusePack &#8211; APE, updating ID3 tags if they exist.</li>
<li>Ogg Vorbis &#8211; Vorbis comments.</li>
<li>TrueAudio &#8211; ID3v2.4, updating ID3v1 tags if they exist.</li>
<li>WavPack &#8211; APE and ID3v1.</li>
</ul>
<p>Further support can be added with <a href="http://developer.kde.org/~wheeler/taglib/api/classTagLib_1_1FileRef_1_1FileTypeResolver.html">TagLib plugins</a>, and the clunky but functional <a href="http://hq.songbirdnest.com:8080/source/xref/components/mediacore/metadata/manager/public/sbIMetadataHandler.idl">sbIMetadataHandler</a> interface.  At the moment there are open bugs to add <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=8768">Ogg FLAC, Speex</a>, and <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=8812">M4A</a> support.</p>
<p>Note that writing is currently disabled by default, and a prompt is shown on first edit.  The plan is to enable writing by default in the final released build.<br />
&nbsp;</p>
<p><strong>TAGS</strong></p>
<p>Currently Songbird tries to write <em>title, artist, album-artist, album, comment, lyrics, genre, producer, composer, conductor, lyricist, record label, language, key, license, license URL, year, track number, total tracks, disc number, total discs,</em> and <em>BPM</em> tags.</p>
<p><img src="http://files.songbirdnest.com/wp-content/uploads/2008/05/taglib.png" alt="" width="200" height="134" class="alignright size-full wp-image-397" align="right" hspace="10" />Rather than add custom logic mapping Songbird properties to various metadata tags, Peter, aka pvh, has been <a href="http://www.nabble.com/WIP-patch-to-extend-taglib-interface-to17088588.html">working</a> on enhancing the generic interface provided by TagLib.  The <a href="http://hq.songbirdnest.com:8080/source/xref/dependencies/vendor/taglib/taglib/tag.h">new interface</a> exposes all common tags, and leaves format specific handling to each implementation.  Where possible, he&#8217;s been following the <a href="http://wiki.musicbrainz.org/PicardTagMapping">mappings used by PicardQt</a>.</p>
<p>While this functionality is working quite well, there are a few peculiarities worth mentioning:</p>
<ul>
<li>The non-standard <em>part of compilation</em> flag is not yet supported (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9090">9090</a>).</li>
<li><em>Total tracks</em> and <em>total discs</em> are not supported by some formats, and are being written as a single string of number/total.</li>
<li>Songbird currently only supports one <em>genre</em> tag per item, where some formats support multiple.</li>
<li><em>Play count</em> and <em>rating</em> are not written by default, but may be available with a preference option (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9084">9084</a>,  <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9236">9236</a>).</li>
<li>Reading and writing album artwork is not yet supported (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9033">9033</a>).</li>
<li>Some properties cannot be unset at the moment (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=8530">8530</a>).</li>
<li>The <em>producer</em> tag is not handled correctly in ID3v2 (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9086">9086</a>).</li>
<li><em>Lyrics</em> and <em>lyricist</em> tags are not handle correctly in ID3v2 (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9091">9091</a>).</li>
<li>Comments are truncated in some cases when writing ID3v2 (Bug <a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=9088">9088</a>).</li>
</ul>
<p>&nbsp;</p>
<p><strong>EDITOR UI</strong></p>
<p><img src="http://files.songbirdnest.com/wp-content/uploads/2008/05/editor.png" alt="" width="200" height="240" class="alignright size-full wp-image-398" align="right" hspace="10" />This release will ship with a basic, but extensible, modal metadata editing dialog.  To try it out, select some tracks, then press CTRL/CMD-E, or select Tools -&gt; Metadata Editor from the main menu.</p>
<p>While a modal dialog is less than ideal for power users, it significantly reduces user experience complexity.  If you are outraged by this decision, don&#8217;t worry, we&#8217;ll also be releasing an extension with a non-modal editor and display pane.</p>
<p>It is now much easier to overlay new functionality into the editor, so if there is something you&#8217;d like to see, stop by irc.mozilla.org#songbird.  If time permits, we&#8217;ll add some additional panes such as an advanced property viewer, lyrics editor, and summary page.</p>
<p>Finally, yes, you&#8217;re right, nobody wants to edit tags by hand.  Now that we have writing support and an extensible editor though, <a href="http://musicbrainz.org/">MusicBrainz</a> support shouldn&#8217;t be too far off (Hint:  <a href="http://bugzilla.gnome.org/show_bug.cgi?id=351309">gstofa</a> in <a href="http://webcvs.freedesktop.org/gstreamer/gst-plugins-bad/ext/ofa/">gst-plugins-bad</a>).</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2008/05/19/metadata-progress/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Developer Tools Update</title>
		<link>http://blog.songbirdnest.com/2007/12/21/developer-tools-update/</link>
		<comments>http://blog.songbirdnest.com/2007/12/21/developer-tools-update/#comments</comments>
		<pubDate>Sat, 22 Dec 2007 01:33:25 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/2007/12/21/developer-tools-update</guid>
		<description><![CDATA[<a href="http://addons.songbirdnest.com/extensions/detail/68"><img src="http://s3.amazonaws.com/addon-screenshots.songbirdnest.com/public/screenshots/102/wizard.jpg" border="0"/></a>

We have a solstice present for developers:  a <a href="http://addons.songbirdnest.com/extensions/detail/68">0.4 Extension <strike>Wizard</strike> Druid</a>.

<a href="http://www.songbirdnest.com/add-on-api/articles/getting-started" >Getting started</a> with extension development can be time consuming, so we've built a tool to let you skip past the first two hours.  They are boring hours anyway.  Now you can pick a title, enter your name, select some UI sample code, and start hacking.  Eventually you'll need to <a href="http://developer.mozilla.org/en/docs/Building_an_Extension">understand the details</a>, but in the meantime you can still have fun.

Download the latest <a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds" >0.4 release candidate</a>, then install the <a href="http://addons.songbirdnest.com/extensions/detail/68" >Developer Tools Add-on</a>.  Once installed, select Tools -> Create Extension from the main menu.

Cheers!]]></description>
			<content:encoded><![CDATA[<p><a href="http://addons.songbirdnest.com/extensions/detail/68"><img src="http://s3.amazonaws.com/addon-screenshots.songbirdnest.com/public/screenshots/102/wizard.jpg" border="0"/></a></p>
<p>We have a solstice present for developers:  a <a href="http://addons.songbirdnest.com/extensions/detail/68">0.4 Extension <strike>Wizard</strike> Druid</a>.</p>
<p><a href="http://www.songbirdnest.com/add-on-api/articles/getting-started" >Getting started</a> with extension development can be time consuming, so we&#8217;ve built a tool to let you skip past the first two hours.  They are boring hours anyway.  Now you can pick a title, enter your name, select some UI sample code, and start hacking.  Eventually you&#8217;ll need to <a href="http://developer.mozilla.org/en/docs/Building_an_Extension">understand the details</a>, but in the meantime you can still have fun.</p>
<p>Download the latest <a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds" >0.4 release candidate</a>, then install the <a href="http://addons.songbirdnest.com/extensions/detail/68" >Developer Tools Add-on</a>.  Once installed, select Tools -> Create Extension from the main menu.</p>
<p>Cheers!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2007/12/21/developer-tools-update/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>We </title>
		<link>http://blog.songbirdnest.com/2007/12/20/we-3-feathers/</link>
		<comments>http://blog.songbirdnest.com/2007/12/20/we-3-feathers/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 22:07:54 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[feathers]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/2007/12/20/we-3-feathers</guid>
		<description><![CDATA[<p style="visibility:visible;"><object type="application/x-shockwave-flash" data="http://widget-c9.slide.com/widgets/slideticker.swf" height="320" width="426" style="width:426px;height:320px"><param name="movie" value="http://widget-c9.slide.com/widgets/slideticker.swf" /><param name="quality" value="high" /><param name="scale" value="noscale" /><param name="salign" value="l" /><param name="wmode" value="transparent"/> <param name="flashvars" value="cy=ms&#038;il=1&#038;channel=1585267068834444233&#038;site=widget-c9.slide.com"/></object></p><p><a href="http://www.slide.com/pivot?cy=ms&#038;ad=0&#038;id=1585267068834444233&#038;map=1" target="_blank"><img src="http://widget-c9.slide.com/p1/1585267068834444233/ms_t021_v000_a000_f00/images/xslide1.gif" border="0" ismap="ismap" /></a> <a href="http://www.slide.com/pivot?cy=ms&#038;ad=0&#038;id=1585267068834444233&#038;map=2" target="_blank"><img src="http://widget-c9.slide.com/p2/1585267068834444233/ms_t021_v000_a000_f00/images/xslide2.gif" border="0" ismap="ismap" /></a></p>

We love <a href="http://addons.songbirdnest.com/feathers/list/recently_modified?max_version=0_3" >all the feathers</a> that have been coming in lately.  Since the 0.3 pre-release lots of people have been customizing their birds, and the results have been pretty cool.

With 0.4 coming out though it's time to make sure the existing feathers continue working.  Fortunately not too much has changed, and updating is almost as easy as modifying the version compatibility metadata.

If you designed feathers for 0.3, take a look at our <a href="http://www.songbirdnest.com/feathers/articles/updating-0.4" >Updating to 0.4 HOWTO</a> (Thanks to Pino for helping with this).  

If you'd like to create new feathers for 0.4, grab the <a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds" >latest nightly</a> and check out the <a href="http://developer.songbirdnest.com/feathers/" >developer center</a>.]]></description>
			<content:encoded><![CDATA[<p style="visibility:visible;"><object type="application/x-shockwave-flash" data="http://widget-c9.slide.com/widgets/slideticker.swf" height="320" width="426" style="width:426px;height:320px"><param name="movie" value="http://widget-c9.slide.com/widgets/slideticker.swf" /><param name="quality" value="high" /><param name="scale" value="noscale" /><param name="salign" value="l" /><param name="wmode" value="transparent"/><param name="flashvars" value="cy=ms&#038;il=1&#038;channel=1585267068834444233&#038;site=widget-c9.slide.com"/></object></p>
<p><a href="http://www.slide.com/pivot?cy=ms&#038;ad=0&#038;id=1585267068834444233&#038;map=1" target="_blank"><img src="http://widget-c9.slide.com/p1/1585267068834444233/ms_t021_v000_a000_f00/images/xslide1.gif" border="0" ismap="ismap" /></a> <a href="http://www.slide.com/pivot?cy=ms&#038;ad=0&#038;id=1585267068834444233&#038;map=2" target="_blank"><img src="http://widget-c9.slide.com/p2/1585267068834444233/ms_t021_v000_a000_f00/images/xslide2.gif" border="0" ismap="ismap" /></a></p>
<p>We love <a href="http://addons.songbirdnest.com/feathers/list/recently_modified?max_version=0_3" >all the feathers</a> that have been coming in lately.  Since the 0.3 pre-release lots of people have been customizing their birds, and the results have been pretty cool.</p>
<p>With 0.4 coming out though it&#8217;s time to make sure the existing feathers continue working.  Fortunately not too much has changed, and updating is almost as easy as modifying the version compatibility metadata.</p>
<p>If you designed feathers for 0.3, take a look at our <a href="http://www.songbirdnest.com/feathers/articles/updating-0.4" >Updating to 0.4 HOWTO</a> (Thanks to Pino for helping with this).  </p>
<p>If you&#8217;d like to create new feathers for 0.4, grab the <a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds" >latest nightly</a> and check out the <a href="http://developer.songbirdnest.com/feathers/" >developer center</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2007/12/20/we-3-feathers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>INVISIBLE BIRD!</title>
		<link>http://blog.songbirdnest.com/2007/10/19/invisible-bird/</link>
		<comments>http://blog.songbirdnest.com/2007/10/19/invisible-bird/#comments</comments>
		<pubDate>Sat, 20 Oct 2007 04:39:57 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/2007/10/19/invisible-bird</guid>
		<description><![CDATA[<a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds"> 
<img src="http://www.songbirdnest.com/files/images/77_invisiblebird.png" /></a>

<a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=3687">Bug 3687 (Nuke the titlebar, plzkthx)</a> is finally fixed.

Thank you thank you thank you to Håkan Waara, Steven Michaud, <a href="http://iamthewalr.us/blog/">Colin Barret</a>, and <a href="http://weblogs.mozillazine.org/josh/"> Josh Aas</a>.  Their hard work has restored XULRunner support for chromeless translucent windows on OS X.

<a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds">Tonight's build</a> should be much less embarrassing on both Mac and Linux.  Look for custom window chrome and a miniplayer with nice curves. Mmmmmmm.
]]></description>
			<content:encoded><![CDATA[<p><a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds"><br />
<img src="http://www.songbirdnest.com/files/images/77_invisiblebird.png" /></a></p>
<p><a href="http://bugzilla.songbirdnest.com/show_bug.cgi?id=3687">Bug 3687 (Nuke the titlebar, plzkthx)</a> is finally fixed.</p>
<p>Thank you thank you thank you to Håkan Waara, Steven Michaud, <a href="http://iamthewalr.us/blog/">Colin Barret</a>, and <a href="http://weblogs.mozillazine.org/josh/"> Josh Aas</a>.  Their hard work has restored XULRunner support for chromeless translucent windows on OS X.</p>
<p><a href="http://publicsvn.songbirdnest.com/wiki/Nightly_Builds">Tonight&#8217;s build</a> should be much less embarrassing on both Mac and Linux.  Look for custom window chrome and a miniplayer with nice curves. Mmmmmmm.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2007/10/19/invisible-bird/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Attention Add-on Developers: We Done Broke Your Shit</title>
		<link>http://blog.songbirdnest.com/2007/10/17/attention-add-on-developers-we-done-broke-your-shit/</link>
		<comments>http://blog.songbirdnest.com/2007/10/17/attention-add-on-developers-we-done-broke-your-shit/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 04:38:43 +0000</pubDate>
		<dc:creator>Matt</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://blog.songbirdnest.com/2007/10/17/attention-add-on-developers-we-done-broke-your-shit</guid>
		<description><![CDATA[It's now or never. Songbird’s menubar, toolbar, and statusbar have been updated to be compatible with Firefox extensions.  

This means that porting existing Firefox extensions could be as easy as modifying install.rdf and chrome.manifest configuration files.  If you give it a try, please stop in to irc.mozilla.org#songbird and let us know how it goes.

It also means that existing Songbird extensions may have to be updated.  In particular, if you’ve written an extension that uses any menu other than Tools, we just broke it.  Sorry, but it’s for the greater good. Onward and upward!

See <a href="http://publicsvn.songbirdnest.com/changeset/6808" >Changeset 6808</a> for details. ]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s now or never. Songbird’s menubar, toolbar, and statusbar have been updated to be compatible with Firefox extensions.  </p>
<p>This means that porting existing Firefox extensions could be as easy as modifying install.rdf and chrome.manifest configuration files.  If you give it a try, please stop in to irc.mozilla.org#songbird and let us know how it goes.</p>
<p>It also means that existing Songbird extensions may have to be updated.  In particular, if you’ve written an extension that uses any menu other than Tools, we just broke it.  Sorry, but it’s for the greater good. Onward and upward!</p>
<p>See <a href="http://publicsvn.songbirdnest.com/changeset/6808" >Changeset 6808</a> for details. </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.songbirdnest.com/2007/10/17/attention-add-on-developers-we-done-broke-your-shit/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

