What fresh eyes can bring

Last week I attended a 5-day training course, and on the last day (Friday) I came back to the office since training ended at about 12PM.  This course of action was frowned upon by some, who insisted that when you attend “this sort of thing” the expectation is that you go home if it finishes early.

That didn’t sit well with me, so like I said, I found myself at work.  I felt strangely refreshed and renewed.  Not sure why, but it was almost like coming back from vacation.  Except better – for me at least, since being away on vacation often carries stressors of its own.

Anyhoo, today I came in and went about my usual routine – which includes connecting to home so that I can stream music from the audio system.  At some point I needed to move some entries around in a playlist, and for whatever reason it hit me that there was some trivial code that I could implement to make that process (moving entries around) nicer.

You may recall that I spent a whole bunch of time in the past coding my own dynamic-reordering solution, which lets me reorder records in a table without having to refresh the whole page.  The concept isn’t novel, but in my case I was never comfortable with using DHTML to simply swap rows around; I wanted to the backend to feed updated info to the frontend, since there’s more happening than just swapping visual elements.  So my solution was to clear the table and have it refresh itself from the backend.

I was never 100% comfortable with this, for a number of reasons, but it dawned on my today that I didn’t need to refresh the whole table; rather, I only needed to refresh those rows that would be affected by the reorder.

So that’s what I did.  And it’s quite nice, if I may say so myself.

This is the sort of thing I hope to bring to web-based projects at work – finding little, novel evolutions to the code that bring noticeable improvements to the UI.

Anyhow, that’s all.

A proper zone in the master bedroom

So here’s the scenario.

We’ve got this handy system called the Whole Home Audio system, and it allows us to play networked music to a number of physical and virtual zones.  We can use it to play music in the basement, or in the family room, or even in a car doing 100+ km/h on the highway.

Without question the physical zones are cool.  The family room zone is the coolest, since I can use my (dying) Harmony universal remote to issue transport controls and the system will respond accordingly.  That’s a pretty nice example of bridging hardware and software; in the family room, the nature of the audio system is completely* hidden.

* (the caveat is that, currently, you can’t select anything to play if nothing is loaded on that zone.  Minor issue, but I’m mentioning it in the interest of full disclosure).

The basement is somewhat unique in that the volume controls exist in the home audio interface, so you mash buttons on the interface page to increase/decrease volume.

In both cases, being physical zones, the requirement exists that we have sound hardware in the server to pump analog audio to the zones, and obviously, that there’s a physical connection between this sound hardware and the amplifying sound hardware at the destination.  This has worked for the basement and the family room, due to their proximity to the server.

The master bedroom, on the other hand, has never gotten to enjoy this sort of seamless/impressive hardware/software bridge.  It has always relied on a streaming client – functionally equivalent to my phone, or WinAMP on my work computer – to stream music through the floors and walls.  The streaming client in this case is GSPlayer running on a no-longer-used-but-still-loved PocketPC PDA, which itself is connected to a 2.1 speaker setup.

So playing anything to the master bedroom has meant:

  1. Play something to a particular zone – usually streaming zone 3
  2. Turn on the PDA and mash the play button repeatedly until WiFi connects and GSPlayer connects to the streaming zone
  3. When your musical enjoyment has ended, power off the PDA

This works, but it’s less than convenient.  And as you can imagine, I wouldn’t be posting about it here if I didn’t come up with a solution.

And so, fresh off of my success with GSPlayer modifications, I once again delved into GSPlayer’s inner workings and gave it the ability to accept incoming TCP/IP connections.  That was part 1.  Part 2, was to give the home audio system the ability to connect to said GSPlayer and tell it to Do The Damned Thing(tm).

Okay, I’ll explain.  The idea here is that the user should only ever have to interact with the home audio interface/system when it comes to selecting joints and loading a zone.  You can use controls at the zone to control playback, once started, but starting playback should itself be a homogeneous process.  So obviously, pressing play on a home audio interface page, then powering on a PDA and pressing play repeatedly… well, that didn’t cut it.

The fact is that it’s the home audio system which receives your request to load a zone, so armed with that knowledge, it should be able to do Whatever Is Necessary(tm) to complete that request.  For the family room and the basement, this culminates in WinAMP being loaded with relevant song data and audio suddenly starts to stream out of the respective speakers.  Streaming zones will always* require a two-step process, and that’s to be expected given their nature.

* (there may be exceptions to this in the future; see this post for one example)

So yes, it’s true that the master bedroom needs to rely on a streaming zone since its physical proximity to the server can’t be (easily) overcome.  However, as a user of the system, your perception is that you’re at home, you’re in a static environment (ie, a room) and therefore you consider it a physical zone and hence you want it to behave as such.

Back to the technical stuff.  The GSPlayer modification allows the home audio system to tell the PDA to connect to the streaming zone and start playing.  And in a nutshell, that’s the crux of it.  You load the master bedroom zone using the home audio interface, and the system loads WinAMP and tells the master bedroom to connect.  The PDA must stay powered on all the time in order for this to work, but that’s trivial – much as the basement amp must be powered on to play music in the basement (it’s always left turned on).

Now, in practice, there were many considerations that had to be dealt with in order for this to work as expected.  A third component had to be modified – specifically, the WinAMP general purpose plugin that’s currently used to give certain feedback to the home audio system.  That plugin, being intimately tied to the guy that actually plays music, is the ultimate source for information on what’s happening.  And for the master bedroom, I decided that we wanted the “start playing darnit!” notification to be event driven and fired by the guy who knows when playback has actually started – ie, WinAMP, ie – the WinAMP plugin.

There are timing issues that help to lead one to this logical conclusion as well – as I said, there were many considerations.  But conceptually, the event-driven (ie, WinAMP-plugin-driven) approach it makes the most sense.  And the things that make the most sense are usually the things that are easily capable of resolving related, niggling issues.

So here’s what happens.  You select some Brian McKnight and send it to the Master Bedroom zone.  The home audio system goes through the motions of sending a playlist down to WinAMP.  WinAMP may churn and burn for a while, but we don’t care – nothing happens until WinAMP starts playing.  Once WinAMP does start playing, the plugin fires an event back in to the home audio system.  The system parses this, determines that the Master Bedroom has an “RPC-capable” client, and sends a suitable command to said client.  The client – GSPlayer in the master bedroom – gets the command to start playing and connects to the appropriate streaming zone.

And Bob is your uncle.

Once playback stops on the zone, GSPlayer will disconnect since the stream has stopped.  Or, if you’re no longer jonesing for Mr. McKnight, you press stop in a home audio interface page, and the system sends a command to GSPlayer to stop playback immediately – vs. waiting for the streaming buffer to empty.

So most of this has been tested successfully.  Today I cleaned it up and “properized”  it, so I’ve still got to make sure it works exactly as expected.  I may – or may not – post back here with my results 🙂

WinMo power hog strikes again!

Gosh darnit!

You may recall that my TyTN exhibited power-sucking tendencies once upon a time. After some consternation I successfully tracked that issue down to some misbehaving virus-infected PC’s on my carrier’s 3G network, coupled – IIRC – custom power-state changed that I had made.

Well the TyTN was retired some time last yea in favour of a used HTC Touch Pro, and wouldn’t you know it, the power vampire decided to awaken a few days ago.

I figured that perhaps I had cooked this battery, but the theory wasn’t holding up. Next, I thought that perhaps the latest Google Maps update had a power-drain issue. But after some trial and error I was also able to dismiss that theory.

As it turns out, some dasterdly application (also known as HTC’s WiFi tethering app) had set my WiFi module in max performance mode, vs. max battery. The result, in my estimation, was that the phone was never hitting suspend mode – the same sort of problem that had befallen the TyTN.

So all is once again (mostly) well in my mobile world.

In-car USB flash drive vs. in-car A2DP

Last time I was here I talked about a custom modification that I had made to GSPlayer – an MP3 player on my WinMo smartphone – to allow limited, transparent control of a Home Audio streaming zone from within GSPlayer itself.  And it has proven quite handy.  The first trial went well, but then I was dismayed to discover that the stream was skipping.  It wasn’t happening regularly, and it would only skip for about 0.5 seconds each time… but it was enough to be noticeable.

I was beginning to wonder if perhaps this was the main reason why I had switched from GSPlayer to PocketMusic.

Perhaps I’d have to dig into the code.  But after thinking about it overnight it dawned on me that this may be a simple buffering issue.  It wasn’t behaving strictly like a buffering issue – the display wasn’t showing that the player was rebuffering, and it wouldn’t make sense that it would take 0.5 seconds to rebuffer each and every time – but what the hey, I figured it was worth a shot.

So I up’d the buffer from 128k to 1024k (1MB) and that seems to have fixed it 🙂  The prebuffer is still 32k so playback begins just as quickly as before.

Anyhow, everything up to this point has been a digression.  But I mentioned it all because; 1) it’s related, and (2) when taken with the real intent of this article, it serves as a nice illustration of the logical progression of this sort of project.

So… here’s what happened last Friday.

I left work, and decided to play some songs off the flash drive.  But after 5 minutes or so I decided that I would rather listen to the queued tracks on a streaming zone.  So I connected my phone to home and started playback, only to realize that music was coming out of the phone’s speaker itself…???  As it turns out, the USB drive was still plugged in under the armrest meaning the Bluetooth music gateway was not.

Well that certainly sucked.  And while it would have been physically possible to remove one and insert the other, there were two overriding thoughts which nagged me incessantly:

1) Those cables are inconvenient to reach, especially when driving

2) Why should I have to physically switch anything???

So on that Friday I decided to listen to nothing at all for the duration.  But the experience served to solidify and accelerate an idea I had from the very moment I decided to power the gateway off the USB port – which was, to split the port so I could power the gateway and leave a flash drive connected at the same time.

Normally you’ll find USB cables that wire two ports in parallel for the purposes of drawing combined current from both ports.  Only the power wires are connected together; the data wires are connected to one port only.  This allows you to connect devices that might exceed the 500mA that a single USB port can provide.

In my case, I needed a cable that could take one port and split the power to two USB devices, while again providing data connectivity to only one of those devices.  And I figured I’d be okay in the power department, since people regularly power USB hard drives off their BMW USB ports without issue; certainly a lowly flash drive and bluetooth A2DP adapter would be less power-hungry than a hard drive.

After looking around for a suitable cable it became apparent I wouldn’t find one.  I would have to make one myself.  And while I had a spare USB-to-mini-USB cable that I could hack (which would provide power to the A2DP adapter via mini-USB) I had no USB cable with a male plug on one end and a female receptacle on the other.

As luck would have it, I found just such a cable this weekend… for $2!  Perfect price.

So I spliced in my other cable and I’ve now got a 6″ USB extension with a spliced-in 2.5′ cable ending in a mini-USB connector.  I did multiple tests along the way to make sure that everything would work.  And once in the car, everything worked.

One comment I have to make – the wires inside said cables are t-i-n-y.  I had to use an X-acto knife to slice the sheathing off, and in 10 cuts I think I managed to sever one strand.  And because the wires were made up of 5 or 6 such tiny strands, I had to tin them with solder.  After twisting them together I soldered them again to solidify the splices, wrapped each splice individually in electrical tape, and then wrapped the whole shebang with more tape.

So there it is – I can play tunage off the flash drive or off the phone without having to reach under the armrest.

The particular flash drive I’m using – an 8GB Kingston C10 that I scored for $20 off Dell – is loaded with all the tracks from my “fav’s” list on the Home Audio system.  Syncing the two is fairly trivial, and in the process the system generates genre playlists since… well, I’ll explain.

Some of my tracks have “compound” genres.  For example: “R&B/Reggae”.  While the car has the ability to read these genres, the problem occurs when such a track is not listed in the R&B genre or the Reggae genre.  Personally, I’d want it to be listed in both.

The solution therefore was to gen my own playlists – which the car can read – and make sure that the track is listed in both playlists.  Done – this occurs during the syncing process.  This also allows me to group other genres – Dance, House, Techno, Electronica all get grouped as Dance – so that I can play them all while still keeping the original genres intact (and indeed, the sync will gen playlists for the original genres but name the playlist as, say, “Dance (House)” for house tracks)

So that’s cool.  But you know me, always wondering what the next step can be.

Here’s the thing – the car can control iPod’s and, apparently, certain other MP3 players.  How does this work, this “control”?  For the iPod I believe it’s a special set of code specifically designed to work with the iPod and act as an interface for the iPod.  But for all other devices, the car looks at the device as a storage container housing tracks.  Those devices can either be a Mass Storage device – so, a USB flash drive – or they can be a Media Transfer Protocol compliant device.

The difference between the two is  down to semantics, at the higher level at least.  Again, the car sees both as a storage of files.  In the case of Mass Storage, the device is a drive that the car mounts.  When you want to play a track the car opens the file and reads the data off the drive.  In the case of MTP, the car queries the device via MTP commands; when you want to play a track, the car asks the device for the data and the device sends it over.

So you can see that, to the end user, they both seem to operate the same way.  And indeed, the iPod appears to as well.  But the iPod’s interface is proprietary, and there may be more going on than I’m aware.

Actually I’m guessing about MTP as well, but it’s an educated guess.  And here’s where the magic would happen:

Unlike Mass Storage, there’s no reason why the files on an MTP device have to be on the device itself.  When the car queries for a list of tracks, or genres, or whatever, the MTP device can act as a mere proxy and query some other device for that info, then report back to the car.  When the car wants to play a track, the MTP device proxies the file from some other device and feeds the data back to the car.

Surely you see where I’m heading.  A full blown, customized implementation of this protocol would have me plug my phone into the USB port, then have an application that talks to the car via MTP on one “side” and on the other “side” it talks to my Home Audio system via VPN over 3G.  All of the constructs – albums, songs, playlists – exist on the Home Audio system.

That’s not the approach I’d take though, if only because I can just imagine what would happen trying to proxy metadata for 30,000 tracks.  Rather, you’d likely proxy metadata for a single playlist, or perhaps for the playlists only.  Something like that.

But the whole point of the exercise would be to provide a seamless way to connect back to the Home Audio system and use the car’s media system to playback songs and browse the collection.  Imagine seeing my list of fav tracks on my I-Drive screen, being pulled in realtime from my network at home.  With MTP this would be possible!

How much work is required?  Well, I can wrap my head around the concept and interaction of all the moving parts.  The good news is that we wouldn’t need to worry about decoding/encoding MP3 in the app, since we’d just be proxying song data.  The great unknown is the amount of work (or feasibility) of coding a WinMo app that can take over the USB port.

Whole Home Automation – what’s new?

Time sure is flying.  Sometime in spring I made tentative plans to see “The Expendables” with a friend in August.  At the time I thought that the date – August 13th – was soooo far away.

Ya, right.

I’m not here to bemoan the rapid passing of Time though; I’ll leave that for another entry – which may or may not ever get written btw.  No, I’m here to continue the chronicle that is my Whole Home Automation journey.

Now, I can’t say that the scope of the project has changed.  It’s still limited to audio and surveillance.  On the surveillance side there’s not much to report; occupant detection is working, and although I haven’t hacked any USB Bluetooth dongles I can also say that the system is working acceptably as-is so I’m in no rush to change things.

On the audio front it’s been a case of small updates and bugfixes here and there.  One of the bigger useability updates has been to allow the download of a .zip file of select tracks.  This makes it easy to download a selection of tracks to a local device, or download an entire album to Shelly’s phone.  It’s not something that I’ll use often, but it’s nice to have.

Something that should be more useful for me, however, is a project I just completed that’s physically removed from the system at home – but interacts with it nonetheless.  I’m talking about playback of streaming zones, and in particular, playback of streaming zones using _my_ Windows Mobile smartphone.

Here’s the scenario.  I’ve got some tracks queued on a streaming zone.  I hop in the car, connect to home, and start playing that zone through my phone (and obviously through the car stereo).  Then I hit a joint that’s bangin’ – or lame – and I want to repeat that joint or skip it altogether.

Traditionally this has been possible, but it meant having a browser open on the phone and connected to the zone page for the streaming zone in question.  You press a transport control on the webpage, and some seconds later (up to 15 seconds in some cases) the streaming buffer gets around to reflecting the changes.

“Wouldn’t it better”, I wondered, “if you could use the player’s transport controls to control the zone directly?!?”

Yes, it would.  And so now it is.

I toyed with the idea of writing an app from scratch.  And while this is something I may still do, the opening lines of this entry are quite clear in this respect: Time is at a premium.  Sometimes you have to settle with something that works rather than something that’s perfect.  It’s not a mantra that I usually adopt, but in some cases – as with the Bluetooth dongle – it’s acceptable.

So as it turns out, GSPlayer is open-source.  It’s a player I’ve used in the past, and I think that I passed it over in favour of PocketMusic because the latter is purtier and has bigger buttons.  But if the buttons aren’t useful, then who cares?  That, and PocketMusic has some stability issues – to the tune of often requiring a soft-reset of the entire phone.

Anyhow, I modified GSPlayer and captured transport control events so that it will send RPC commands to the backend server.  So if I press the “next track” button in GSPlayer, it will tell the backend to move to the next track.  It will also disconnect/reconnect the stream to make sure the streaming buffer is cleared.

And of course, it only does all of this if a stream is active *and* that stream appears to be connected to my server.

So ya, that’s that.  I did a quick test on my phone and it seems to work.  I’m off to run a few errands shortly and I’ll do the trial-by-fire at that point.

Formula1 Montreal Grand Prix 2010

Shelly surprised me this past weekend and told me that we were going to Montreal.  This happened to coincide with the return of F1 to Montreal, after having been dropped off the calendar for the 2009 championship.

Yes, that’s two racing events in two weekends.  Except this time I drove the 5+ hours there and back with nary an adult to say “Yo, keep it between the white lines dawg”.

But that’s the means to the end.  And the end was the event itself.  For some time I had deliberated about attending an F1 race.  Montreal seemed like the most logical choice, given its proximity, but I always balked at the cost.  Grandstand seats seemed to be in the $500+ range, and by all accounts the general admission option was to be avoided unless you felt like becoming a sardine to see a sliver of race track.

So pricing kept me away.  But in this case Shelly set up the surprise, and it’s not often that she gets to surprise me – so I figured that this would be my one and only time attending an F1 race and, therefore, it was deserving of a grandstand seat.  Fortunately said seat was <$300 – which included Friday, Saturday and Sunday.

And I must say, I’m very happy that I was able to see, in person, this spectacle that I’ve been following on TV.  It puts things into a very different perspective.

The first thing that took me aback is the raw noise that F1 cars generate.  I had scoffed at the need for ear protection, but quickly ate crow as I felt that inner-ear pain was imminent every time a car drove by.  They’re crazy loud.

The second thing that surprised me is how narrow and close the Montreal track is.  And in fact, the Montreal facilities as a whole are something like 30 years old.  Canada is one of the “traditional” stops in the championship, and being there in person you completely lose the glamour factor that the sport tries  hard to promote.  I don’t know what to make of that, to be honest.  On the one hand it became very evident that F1 is motor racing, like any other form of motor racing.  On the other hand, the idea of F1 being the “pinnacle of motor racing” was diminished somewhat when you see these high-tech marvels in such a low-key environment.

And you hear the noise, and you smell the fuel… and you realize that regardless of how Bernie and co. promote the sport, on race day F1 really is about cars racing around a track.  That’s not a damning thing – it’s a fact of the matter.  And in some ways it’s good because the guys at the track – mechanics, drivers, team bosses, etc. – are in a competition.  They’re not worried about celebs, they’re not trying to prove anything to lesser formulas.  They’re racing, period.

So that’s cool.  You see the driver’s parade, you see Lewis hop out of his car on track and start pushing it, and ya, all of a sudden Formula1 actually seems accessible – despite its stuffy airs.  It puts various driver comments in perspective, when they talk about not caring about the politics and what-not and instead just wanting to race, on the track.

I imagine that some of the modern circuits might have a different spectator feel to them.  Something closer to what you witness on TV.  Abu Dhabi, Yas Marina… the bonus is that the cars are more in their element, what with aero efficiency becoming more important in long sweepers.  The downside is that the plush and pomp starts to creep back in and I suspect you lose that close connection to the race and the drivers.

But what do I know – given the chance to attend, I might find them just as enjoyable as Montreal.

The short of it all is that I enjoyed attending the race.  And even though the 3 CF-18’s also did two low speed passes over the track at the start of the event, I was definitely happier in Montreal than I was in Windsor.

Pics to follow.

Red Bull Air Race, Windsor 2010

I attended the Red Bull Air Race this past weekend.

Notwithstanding the unpredictable weather – complete with a tornado warning the previous night and 3-days worth of torrential downpours – the event itself was very ho-hum compared to my 2008 experience.

When I think Red Bull events, I think “extreme” and “spectacle”.  And so it was with great shock and awe that I witnessed a near-Mach1 demonstration by a fighter jet in the 2008 pre-race show… greater shock and awe when the filming helicopter ran the course and did things No Helicopter Should Do.  And finally, continual shock and awe as these propellor-driven planes raped the challenging course mere meters above the Detroit River.

I mean, that event was the s–t.

By comparison, this year’s event was s–t.

Even without the lame course adjustments that were made, the course layout itself paled in comparison to 2008.  The pre-race show had fighter jets, oh yes, but they did two low-altitude low-speed passes and bugged the heck out.  The helicopter didn’t run the course, and even the RB105 acrobatics seemed tamed down a few notches.

For a Red Bull event, I was not impressed.  Which really sucked, since I dragged my friend out to Windsor and he spent an unholy amount of money on a jacket to protect him from the elements.  Elements which, by the way, decided to remain at bay for the duration of the event.

So that will likely be it for my Red Bull Air Race attendance career.  This weekend I’m off to Montreal, rather unexpectedly too, to partake of the Canadian Formula 1 GP.  This will likely be the one and only time I ever go to a Formula 1 event, and I am looking forward to it – rain or shine, it will be fun just to be there and feel the atmosphere that goes along with an F1 race weekend.

Respect for the single mothers

Andrew and I kicked it bachelor-style for a couple of days last week while Mommy was out of town.

And while we had a good time together, I can’t begin to imagine how mothers raise a child on their own.  It’s not so much that the tasks themselves are difficult; rather it’s the repetition and the demands of the child that just sap you of your energy.  At least that’s what happened with me.

Oh sure, you can throw in a walk here or a park visit there just to spice things up.  But that’s when you’re not working – and therein lies the problem.  One, is that you might as well write-off any time you have after work, since that’s all about making dinner and giving a bath and getting things ready for the next day.  Two, is that a single mother may very well have to work two jobs just to make ends meet, meaning free time on the weekends is at a premium.

So like I said, ’nuff respect!

Are you Home? Scratch that, I have the answer!

Yessir, as the title suggests – occupant-awareness of functional!

It works, surprisingly.  The gotcha now is that range is limited – it will happen multiple times overnight that the system will switch from Home to/from Away, as it has trouble finding our phones.  But I knew that that might happen – part 2 of this project is hardware in nature, to modify my USB Bluetooth dongle with an external antenna (and hence, greater range).

But ya – it’s uber-cool.  As always there were/are some bugs to work out.  Not with the detection steps per-se, as that seems to be rock solid.  Rather, with the tie-in of the surveillance system.  I had to think for a while about what and when a state change should occur.

Here’s the thing.  While it may be sufficient to poll to see when occuapants have left, it’s not really sufficient to poll to see when occupants have arrived.  By the time that a polling run occurs, the system may have already detected me or my wife coming home and send an alert.  And it may continue to send alerts until the polling run determines that our phones are home and – hence – the system state should change to Home.

That’s one.  Two, is that it’s very possible for either myself or the wife to forget our phones at home when we leave (you can determine who’s more likely to do this…)  It’s possible to set the system to an explicit Away state during which it will not poll for Bluetooth radios… but the problem is that the system (as currently designed) can’t expose this state to the polling process.

That means that the polling process is only used to determine when we’re away.  To determine when we’re home, the system relies on a surveillance event.

Which is fine – in theory that’s a great solution.  In practice we’ve got some implementation issues.  One, is that the limited range of the USB Bluetooth dongle means that an audio event will likely be the one to switch the system to Home – and audio events are most likely to fire for sounds inside the house (this isn’t always the case, but is a guaranteed case).  So an alert will still be generated due to exterior motion detection.

That problem can be solved with an increased Bluetooth detection range.  So we’re good there.

BUT… the reliability of the cammies’ detection events must be high if we’re going to use them to set the Home status.  That’s what I’ve been struggling with.  Not that they’re not reliable – rather, it’s the age-old problem of some required process going into La-La-Land(tm) and messing everything up.

And let me tell you, I’ve struggled with those problems over and over and over.  I thought things were pretty stable, until I found out that audio monitoring likes to… stop… …. .  Anyhow I think I’ve got that one worked out now.

So ya, once I get that external antenna hacked together we should be good!

HTTP streaming done right

Oh Microsoft, why do you make the choices you do???

Fortunately in this day and age, Microsoft dominance isn’t what it once was – meaning we the little guys now have choice.  But unless you’re vigilant, it’s still so easy to caught up in the M$ trap and not realize there’s a Better Way(tm).

I’ve been using WinAMP as an MP3 player for eons, and one of the things I appreciate about WinAMP is that you can point it at a URL and stream an MP3 directly off of an HTTP server.  Wow, no big deal there.  But the big deal is that you can seek within that MP3 because WinAMP is smart enough to use HTTP/1.1 commands to tell the server what part of the file it wants to stream.

Contrast that to Windows Media Player, which insists on streaming a file from beginning to end.

While I don’t tend to use WinAMP much these days to play MP3 files directly (that’s what the Whole Home Audio system is for, what with its streaming “zones”), I do use Windows Media Player to play recorded TV shows on my lunch break every now and then.  Particularly these days, when downtime at home is at a premium and I don’t get to keep up with my favorite TV shows.

So it’s irked me that using Windows Media Player to stream WMV files from home has meant no seeking ability, since WMP will only stream the file from beginning to end.  I think WMV files store some key or index info in the end of the file as well, but still, I have to believe that it’s possible to start streaming from the middle of a WMV file in order to start watching from the middle of the WMV file.  It’s just not that hard.

VideoLAN Client to the rescue.  My goodness, talk about refreshing!  Like WinAMP, VLC can use HTTP/1.1 commands to tell the web server exactly what part of the file it wants to stream.  So yes, seeking is possible.

No more having to queue up a show first thing in the morning to ensure it’s fully downloaded (and seekable) by the time lunch rolls around.  Nope – now I can just copy the URL over to VLC and skip commercials at my heart’s content!