Turn Linux into a remote AirPlay speaker

Some time ago Apple game out with the AirPlay feature (an upgraded AirTunes) which enables iOS devices and iTunes play music and videos on a remote device.


In our office we have a Linux box, a set of speakers and a few laptops sporting Mac and Windows. Tonight I set out with a goal to turn that Linux box into an AirPlay speaker so that each of us can play music from their laptop without having to reconnect the cables every time.


First off I stubled upon RougeAmoeba’s Airfoil, which is a $25 sofware piece that, enables half a dozen device classes to be hooked up as remote speakers to a Mac or Windows (yes, that too). And, better yet, instead of only enabling iTunes to play, it can reroute all sound to that remote speaker. Though, it’s Linux speaker software is free download, it still seems to require paid Airfoil to route audio, because bare iTunes couldn’t care less of the wannabe Linux speaker that should have appeared to the WiFi. As the price would have been multiplied by the number of laptops, it was unfortunately out of question.


With a bit of googling around, I next found Shairport, which (if I got it correctly) is based on data found in a hacked and reverse engineered AirPort Express. ShairPort turns a random PC into a fake AirPlay speaker set. The software itself got installed relatively quickly after going through the short docs (perhaps because I had most of the dependencies like avahi etc already in place because of the Airfoil).


Also, for Airfoil, I had already opened firewall to Zeroconf/Bonjour and ports TCP:5000-5005 and UDP:6000-6005  which seemed to apply to Shairport too.

After starting up the daemon, all of our iTunes magically discovered the new remote speakers and allowed us to play music there with a simple mouse click. Even from Windows. And from iPhone. And, if wanted, all at the same time. Voila!

This is definitely much easier than messing with the wires all the time.


iPhone SDK private API

Today I got my Rivals.app rejected from AppStore because it used private API calls. Fortunately nowadays Apple lists the calls in the reject message to make it easier to remove them. I was unfortunate to be using:

  • addTextFieldWithValue:label:
  • textFieldAtIndex:

For anybody wondering about their app prior to submitting to AppStore here is a collection of popular private APIs:

Paid apps vs ad-supported apps

Below is a presentation by PinchMedia that analyzes ad-supported free apps compared to paid apps.

The main summarizing thoughts:
• Average app needs CPM > $8 to beat $0.99 app revenue
• Only give app away free if something in it screams “FREE”
• For paid app, release ad-supported free companion only when actual collected usage data suggests equal revenue.Read More »

iBrick 3G

Well.. not totally iBrick, but just God awfully slow, especially Messages and Settings apps. Googling showed that iPhone 3G pwners have had issues with slow app startup since 2.x times. Few of them blamed Cydia.app, others indicate that restoring a pwned 3.0 phone from 2.x backup is a way to troubles. I am leaning towards the latter.Read More »

UItableViewCell with old content

I had a UITableView that had relatively simple cells. So simple in fact that I didn’t want to bother with subclassing UITableViewCell to draw up content. The cell had two UILabels and one UIImageView.
The problem however derived from reusing the cell – when drawing transparent PNG images into that cell, older data was still present and visible in new cells. This meant that I had to somehow clear the cell from old content.
This is how it can be done. Add the following just before creating new content:

for (UIView *view in cell.contentView.subviews) {
 [view removeFromSuperview];

This clear the contentView from old content and you can start adding new.

image © jeffk42