Month: May 2006

Last night I spent a little time updating the Banshee Wiki with a new home page layout and a new screenshots page – it was time for a little change. The screenshots that had been there since August of last year were showing just the bare functionality of 0.9.2, so it was time to show off all the new things Banshee can do!

Speaking of new things, Lukas Lipka started working on a patch to bring child support to sources. This was the first step necessary to make top level sources (like an iPod) support playlists or other children. I committed his patch yesterday, so the next step will be playlist support for iPods. Hopefully I will be able to do more new development against HEAD soon, but I am still primarily focused on making the stable branch more stable

The library now organizes local playlists as its children; these can now be sorted in the source view in either direction by size or name.

I patched the Mini Mode plugin to show child sources as well.

On the MonoDevelop front, Lluis has done some awesome work on the new menu designer. What’s extra, extra special about this is that it uses the UIManager/Action/ActionGroup model instead of dumping a bunch of widgets into code like Glade does.

Way down in native land…

In the last couple of days, I’ve committed some shiny new GStreamer code to Banshee HEAD that has been “in the works” for quite some time (close to 4 months :-(). HEAD now features support for using GStreamer for tag reading, instead of Entagged. I think I am going to fall back on Entagged for certain potential failures in the GStreamer layer (no demuxer for a certain format, like WMA), but for now I’ve disabled Entagged to focus on testing the new GStreamer code.

This means that in libbanshee there is a new GstTagger API that is dedicated to synchronously parsing metadata. I’ve never done any synchronous operations in GStreamer 0.10, so I may not be doing something correctly, but I think it’s mostly right. Nevertheless, this code needs a lot of testing (hint, hint).

I also landed what is currently a static GStreamer element, mbtrm. This is a simple element that uses the MusicBrainz TRM API to calculate an acoustic fingerprint of a raw audio stream. Currently I am using the element in the CD ripping pipeline, like this:

cdparanoiasrc ! mbtrm ! ...

When a fingerprint has been calculated (currently only after EOS, which needs fixing), the element raises the ‘have-trm-id’ signal. I would like to make this happen before EOS so the TRM ID could possibly be set as a tag on the stream, but I’m mostly happy for now. At least the fingerprinting is decent. Currently the TRM ID is just printed to stdout, but eventually it will be used to query MusicBrainz for more track metadata, making it possible to fetch metadata for partial or mixed audio CDs. This too needs more testing.

Of course the element can be adapted in any pipeline to perform fingerprinting on any raw audio stream, not just for CD ripping (wouldn’t it be cool to have a “first pass” kind of option to fingerprint an entire imported library that may suffer from mangled or missing metadata ;-)).

And on the managed front…

I also moved HEAD to use gmcs! This means I will slowly introduce generics into newly written code where it makes sense. The keyword is slowly. Banshee has been running against the .NET 2.0 class libraries for over a week for me and I’ve yet to run into any unexpected problems. The GstTagger managed wrapper features the first snippet of generics, and it’s working great.

I’m really looking forward to introducing code that uses generics, nullable types, etc. where it makes sense and, over much, much, much time possibly migrating existing code to use generics.

Hopefully Banshee against gmcs/.NET 2.0 will re-enforce all of the great development and stability that has been going on in that front in Mono, and maybe we’ll start to see other applications migrate as well.

Without any further delay, I bring you the Podcast plugin for Banshee, thanks to the arduous work of Mike Urbanski.

Interested parties should definitely check it out and test. Banshee HEAD is required, so update your checkouts. The plugin code has been merged into the banshee-official-plugins module in Banshee Subversion. Congratulations Mike!

In related news, I released Banshee 0.10.10 last week, which was the first official release from the stable branch. And speaking of the stable branch, I guess I should actually mention that too. I branched from HEAD shortly after 0.10.9 to create the stable branch. Any more releases from the 0.10.x series will be based on this branch (BANSHEE_0_10_9_SL in CVS). The first from HEAD will be 0.11.0, but I have no time frame set for that. In SUSE/SLED, we are keeping up with the stable branch, so no new features will be introduced. I urge other packagers to do the same. I think 0.10.10 is now at least available in Ubuntu Dapper; not sure about FC5, et. al.

Really beefed-up CD burning; I think three or four fairly serious bugs were closed here

A nice handful of other bugs resolved

I also wrote up a quick roadmap for 0.11.x for the curious. It needs some organization and review, but my basic ideas are layed out there.

Now, regarding banshee-official-plugins, here’s how it breaks down: currently everything in this module is under development, unstable, and unreleased. Some plugins work against the stable branch while some require the latest and greatest from HEAD, but the module itself will configure and build against anything 0.10.10+. For 0.11.x, some of the plugins (or at least DAAP) will be split out from core into this new module. Currently it contains:

Mike’s podcast plugin

Felipe’s Mini Mode plugin

Fredrik’s Recommendation plugin

Gabriel’s Smart Playlists plugin

My iRadio plugin

Once a release is made of this module (probably for the 0.11.0 core release), these plugins should be stable and supported. Right now, however, not everything is completely ready to come out and play.

Switching gears: Evan (my brother), Jeff, and I drove down to Raven Rock for a little hiking on Saturday. Evan and I had been there a few times when we were younger, so it was nice to confirm that the rock was just a large as I thought it wouldn’t be anymore (makes sense, right?) The weather was absolutely perfect and the hike was great. It’s only a 45 minute drive from Raleigh, so if you’re in the area, it has my seal of approval.

On the way back to Raleigh, I found myself driving behind the sweeet car pictured above. What’s so peculiar? Look at the license plate. Either it’s really awesome and original or the owner it is a total prick with a fake plate. Oh, and I raced a Lotus in my Jeep. And by race I mean accelerated past him, and immediately took the next exit, which did happen to be my intended exit. Still, I raced a Lotus. Right?