Wed, 23 Jan 2008

Earlier today, two things happened. First, I wrote about our support of the EFF, noting that none of our products were created to facilitate theft. We'll get back to that in a minute, but it was a timely post. Second, CBS-owned music site Last.fm opened up streaming from their site. Where previously they'd provided 30-second previews of songs (a la iTunes), they're now providing on-demand access to full-length tracks and albums.

This is a very cool thing, as it makes music more accessible. Various individual artists in the past have streamed their new album or a single right from their site, with the idea that you'd take a listen or two and hopefully buy the album. Last.fm is looking to shake that model up and monetize the streaming itself via ads as well as sales of both individual songs and subscriptions. In fact, each play results in a royalty payment to the artist, which is great.

Beta TapThe basic assumption being made here is that streaming is fleeting, non-permanent. Simply put, that assumption is wrong. Tools like our own Audio Hijack Pro, as well as many others, enable you to record any audio. This ability has "substantial non-infringing uses", commonly known as the Betamax Doctrine1. As part of this, it's possible to make a permanent copy of streamed audio.

This incorrect assumption has been around for years, but it was largely harmless. Such streaming was scattered, low-quality, and in the case of online music radio streams, random. Last.fm, however, has made an enormous catalog of music from the major labels available for streaming on-demand, and it sounds pretty good to my ears. Suddenly, this erroneous assumption could well impact the bottom line. If you don't need to stream music, they don't get to count plays or show ads, and artists don't get paid.

Ideally, users will do what's right, and purchase proper access to the music to which they wish to listen. My fear, however, is that potentially infringing uses of recording tools will become widespread. In that scenario, it's possible that instead of adjusting their model, the entertainment industry will just come after developers of recording tools. Should the Betamax Doctrine not hold up, these tools could disappear. That would be bad for us, of course, but it would also hurt the thousands of users using them legitimately.

An even more dire scenario would involve the music studios going after Apple and Microsoft to implement a required "secure audio path" in the OS. Vista has this in the form of the Protected Media Path, but it's currently in limited use. Things could get much, much more restrictive, and that's bad for everyone involved. Even the entertainment industry would likely suffer. They once opposed the VCR, with then-head of the MPAA Jack Valenti famously comparing the VCR to the Boston Strangler. Today, home video accounts for tens of billions in revenue.

This is an exciting development in access to music. Thirty second previews just aren't enough, and terrestrial radio doesn't provide access to new music as it once did. I hope this will work well for Last.fm, artists, and consumers alike. As part of that, I'll urge you to support the artists you love. If you listen to their music, pay for it, whether through albums or subscriptions. Your support is needed to enable them to keep creating the things you love (much like software developers). The iPod wrappers have long said it best - "Don't steal music".

Footnotes:
1. The Betamax Doctrine has been important for 20+ years of innovation in technology. It was established by the Supreme Court in 19842, and it basically says that if a tool can be used for obvious legitimate purposes, it's potential illegal uses do not make the device illegal. In other words, beating someone up with a baseball bat is still assault, but we don't need to shut down the Louisville Slugger factory.

2. From Sony Corp. of America v. Universal City Studios, 464 U.S. 417 (1984) (link). This is the same case that legitimized timeshifting, paving the way for things like TiVo and our own Radioshift. It's amazing the enormous effect this one case has had on both Rogue Amoeba and technology in general.

Posted by Paul | Permalink | View/Post Comments (22)
Wed, 23 Jan 2008

Do you like freedom? Sure, we all do. But the freedoms we enjoy in the USA (and many other countries) didn't come easily, and they aren't guaranteed to stay. That's why organizations like the Electronic Frontier Foundation (EFF) exist - to defend those freedoms.

When we were organizing MacSanta 20071 last November, we decided we needed a way to include only the more serious developers. We considered a participation fee to line our pockets, but opted insted for a charitable donation. And so, every developer who participated in MacSanta 2007 made at least a $50 donation to the EFF (and often, much more). All told, we raised around $10,000 for them in just a couple of days, from over 120 great Mac software companies. Not too shabby!

EFF SwagIn response to this, the EFF sent some delightful swag our way along with a kind thank you note. I particularly appreciate the 4th Amendment packing tape, especially since we just ran out of tape due to all the boxes we shipped to Macworld.

But swag or no swag, we're proud to support the EFF. While everything we create is designed to assist you in working with digital media (and not to facilitate theft), some of our applications are at the edge of changes in digital law. As such, the EFF works to defend our business. Putting that aside, however, I think I can safely say that the entire crew here at Rogue Amoeba personally believes in what the EFF does as well.

So then: do you dislike your fair-use rights being restricted? Do you think warrantless wiretapping is a bad thing? In short, do you value free speech, privacy, and innovation? If you answered yes to any of these questions, you should join the EFF. Any donation or swag purchase helps defend your rights in the digital world. You can tell 'em Rogue Amoeba sent you.

Footnotes:
1. I don't know if there will be a MacSanta 2008 (probably) or when it will start (some time in December). Potential customers should join the MacSanta info list to get email when it goes live (and of course, never any spam).

Posted by Paul | Permalink | View/Post Comments (2)
Sat, 12 Jan 2008

In yesterday's Airfoil 3 tour, Mike talked extensively about Airfoil Video Player (AVP). As he noted briefly, we use Perian to play lots of video formats QuickTime doesn't support by default.

QuickTime is able to play a nice variety of files, but it also misses out on many popular formats. Fortunately, it can be extended with additional components, and the good folks at Perian have provided a free QuickTime component which provides support for a large number of popular audio and video formats. In order to ensure that Airfoil Video Player can play as many files as possible, we've bundled Perian inside it, and it automatically loads it as needed. Ideally you won't even be able to tell it's there, except for how AVP is able to successfully open and play your media.

AVP uses its own internal version of Perian (we don't install it, to minimize hassle and problems). If you have a newer version, however, AVP will pick that up and use it. So if you're interested in using Perian with QuickTime Player, just install it globally. You can find everything you need at http://www.perian.org.

In the spirit of Donald Knuth, we sent 0x200 hex bucks to Perian on the day we released Airfoil (That's $512 USD for those on a more normal monetary system). Apparently, in so doing, we shattered the single-donation record previously held by Michael Crichton (who also happens to own Audio Hijack Pro). You don't have to work at a bizarrely-named software company or be a Hollywood big shot to enjoy Perian, though. Check it out at the Perian site, and if you use it, make a donation.

Posted by Paul | Permalink | View/Post Comments (0)
Thu, 10 Jan 2008

We've just released Airfoil 3 and it has a lot of great new features we've been hard at work on for over a year. So join us on a tour of all the stuff that's been added in Airfoil 3.

Airfoil Speakers

The first thing you'll notice when opening the download is this little app called Airfoil Speakers:


Airfoil Speakers

Airfoil Speakers works as a virtual AirPort Express. You can run this little application on any computer you have connected to your local network. Once you do, that computer will show up as a remote speaker in Airfoil 3 and you can send audio to it.

Now your extra Macs can share the fun alongside your AirPort Expresses to get your audio into even more places. Airfoil Speakers can show the nice window seen above with spec meters and a volume control, or you can just tuck it away as an icon in your menu bar for minimal intrusion.

Airfoil Speakers works pretty much like an AirPort Express from the point of view of Airfoil. It advertises its services over Bonjour, then uses the same AirTunes 2 protocol that Apple uses. However, despite using the same protocol, iTunes won't talk to Airfoil Speakers. iTunes uses cryptographic authentication to ensure that it only talks to real AirPort Expresses, and we weren't able to mimic that. Until Apple removes those checks, Airfoil Speakers will only work with Airfoil 3 and Airfoil for Windows.

Local Playback

This feature is pretty obvious when you open Airfoil 3 and see the first entry in the main window:

That "Computer" speaker is always there, and represents your local computer. Airfoil 2 could do local playback, but it didn't delay the audio at all. Thus, everything played locally several seconds before it was heard remotely, making for a jarring experience. Now in Airfoil 3, the "Computer" speaker is delayed by exactly the same amount as the remote speakers, allowing your main computer to become a seamless part of your audio system.

Airfoil Video Playback

Another great new addition in Airfoil 3 is the shiny new Airfoil Video Player:

You can find Airfoil Video Player right in the source popup in Airfoil, or you can just drag a movie file right onto Airfoil and it will start Airfoil Video Player for you. AVP uses QuickTime and Perian to play all sorts of media files, and all with perfect synchronization between audio and video. AVP can't play everything - it needs to control the files, so they need to be local, not web-based. Likewise, Apple's FairPlay DRM prevents playback, which means AVP can't play movies purchased from iTunes. But thanks to QuickTime and Perian, we support dozens of popular video formats. Now you can watch your favorite movie files through your nice stereo system without needing any wires from your computer. And although support is still preliminary, Airfoil Video Player can play DVDs, also perfectly synchronized.

If you pop open Activity Monitor, you might notice that Airfoil Video Player takes up a bit more RAM and CPU than your usual video player. You might also notice that when you press Play, the movie doesn't actually start to move for about two seconds. Both of these are due to how Airfoil Video Player works inside.

The AirTunes 2 protocol has some delay built in to it, and when sending to remote speakers with Airfoil 3 the audio is delayed by two seconds. AVP has QuickTime play the movie as usual, but doesn't display it to the screen. While the audio heads out to Airfoil and your remote speakers, the video gets buffered internally to AVP. Once two seconds' worth of video has been buffered, AVP starts to draw them to the screen, resulting in perfect synchronization between video and audio output. This is a bit more resource intensive since AVP has to keep two seconds of video frames in memory at all times, but it turns out that on modern machines this doesn't have much of an impact. Even playing back a smooth 1080p video trailer downloaded from Apple's movie trailers uses under 200MB of RAM for the buffer, and other types of video generally use much less.

Perfect Sync

Airfoil 2 introduced the ability to send to multiple remote speakers simultaneously, and it did a pretty good job of keeping playback synchronized while doing it, but there were limitations on just how good it could be. Thanks to a new network audio protocol (AirTunes 2), Airfoil 3 is able to keep all remote speakers playing in perfect sync with each other.

This new protocol is also what allowed us to add all of the other new features discussed above and keep local audio and video playback in perfect sync with remote audio coming both from the AirPort express and from Airfoil Speakers.

Get It While It's Hot

So there you have it, the four big new features in Airfoil 3. I hope you enjoyed this tour and I hope you enjoy the app! You can learn more on the Airfoil site or just download directly.

Posted by Mike | Permalink | View/Post Comments (8)
Wed, 09 Jan 2008

While I was organizing the 2007 MacSanta promo, I put a call out to Brent Simmons, of NetNewsWire fame. Brent was interested, but needed to check it out with the higher-ups at NewsGator (owners of NetNewsWire). Ultimately he couldn't join in, citing reasons that were "quite good and non-evil", prompting me to query:

Alrighty, no worries. Is NNW about to become freeware? 8)

Brent dissuaded me from these ideas, but just over a month later NetNewsWire is indeed freeware, along with all of NewsGator's consumer level RSS clients. Brent and I talked briefly about it1 and I'm happy for him. This move means his software will be even more widely disseminated than it has been to this point. In the short term, this is also good for users - we already had a great solution for RSS reading, and now it's free.

There's are a couple of fairly large problems though, and I think they must be considered. First, it's a very good bet that a free NetNewsWire has killed the paid RSS reader market on the Mac. Two, in the grand scheme of things, the perceived value of software on the Mac just went down.

The Value Of Software

I'll address this second point first, as I think it's the more important of the two. Unlike physical goods, software has little in the way of built-in value - there's no cost of base materials, no manufacturing cost per unit, and so on. Software is thus worth what the market says it is, instead of the sum of its parts plus a reasonable markup. Developers may set a price, but the market determines if that price is reasonable.

There's certainly a place for free software. But when a fully-featured product such as NetNewsWire is suddenly free, it effectively reduces the value of other for-pay software products. "Why should I have to pay for quality tools, when this quality tool is free?", the thinking goes. When something is given away for free, its perceived value is lowered. If software is treated as valueless, it becomes much, much harder to sell. One need only look at a quote from news coverage discussing the move to freeware to see this in action: "And thank [NewsGator] for this grand gesture...While you're at it, do pray that a few other software companies get inspired by this move and follow suit."

While I understand the sentiment, as someone who makes his living selling software, this is a disheartening thing to read. Yes, it might seem great if all software was free. But while NewsGator has the financial resources to accomplish this move, most companies do not. Very rapidly, you'd see a shrinking of the market, a loss of innovation, and ultimately, a decrease in quality. There's no market for commercial software on Linux, and the quality of solutions simply isn't on par with what's available on the Mac. By attaching a value to software, we give it value, in a self-fulfilling prophecy.

RSS Readers In The Past...

It's also worth considering the impact of this move on the specific market NewNewsWire occupies, RSS readers. NetNewsWire has long been the clear winner on the Mac for RSS readers, but there have been lots of other great clients available. Competing with a great product like NetNewsWire is tough. It's well-made, so the alternatives must be too. It's popular, so it's got a great head start in terms of mindshare. And it was competitively priced, making it hard to compete on price. It's tough, but not impossible to compete with all that. Make a well-designed, reasonably priced product, and you'll have a fighting chance. Excel in one area (customer service, advertising, a specific RSS feature), and you might capture an entire niche. Simply put, when NetNewsWire was for sale, there was a market opening in which to sell competing RSS readers on the Mac.

...The Present...

Now that NetNewsWire is free, that market just got rocked. It may well cease to exist, at least in any viable way for a full-time developer. If competing with a popular, well-designed product is tough, competing with a popular, well-designed product that happens to be free (while remaining fully-funded) is damned near impossible. And that's unfortunate, because ultimately, it's likely to lead to stagnation. The developers at NewsGator have done great work, but the more minds there are attacking a problem in different ways, the more great solutions we see. Look no further than the late nineties, when IE effectively killed Netscape. Web browsers stagnated shortly thereafter - Microsoft, with browser share at or above 90%, had little incentive to innovate, and smaller players just couldn't break in.2

...And The Future

I don't know what will happen from here. I think NetNewsWire will continue to be great for many years to come, and I hope those who worked on paid RSS readers will either be able to continue selling them (a prospect I find unlikely) or move on to more successful projects. Further, Brent's a good friend, and I don't want to come down on him. His hope is that the increased penetration will lead to improved attention data3, saving time for everyone as far as getting us the news we want to read, and things may well play out that way.

Ultimately, however, this strikes me as an overly aggressive move by NewsGator that has (presumably unintentional) negative side effects. If developers are upset when Apple kills a market (iTunes and the MP3 market, Watson v. Sherlock, and many more), can we hold major developers on the Mac OS X platform to any less of a standard?

Footnotes:
1. Brent also explained that he had to misdirect me from my lucky guess, as it was very private knowledge at the time. When he told me he hadn't even told his family, I figured I could forgive him.

2. It's certainly true that we've enjoyed a recent renaissance in browsers, thanks in no small part to Safari on the Mac and Firefox on all platforms. That's far from a guaranteed result, however.

3. Greg Reinacker, of NewsGator, explains attention data quite well:

"And second, we want to collect "attention" data (actually I like to call this activity data, but everyone else in the world calls it attention) and use it to make everyone's experience better. If there is a specific feed you love, and you're constantly emailing its articles to friends or saving articles in your clippings, that's interesting...and if there are a lot of people doing this, it's probably a good indicator about the "relevancy"" of that content for other users. Similar with individual articles that are getting a lot of attention from users. Basically, by using your data, in combination with aggregate data from other users, we can deliver a better experience for everyone. And that's a good thing - both for us and for you."

Excerpted from his aforelinked blog post.

Posted by Paul | Permalink | View/Post Comments (39)
Thu, 03 Jan 2008

Every time we exhibit at Macworld Expo, we hand out CDs with trial copies of all our software on them. And every time, we face the same problem, of how best to create these discs such that the software on them is up to date with the latest we have.

At our first Macworld in 2004, we had 5,000 discs professionally pressed, placed in CD sleeves with product information printed on them, and delivered directly to San Francisco. This is the easiest option, but turns out to be the worst in terms of having up-to-date discs. Pressing has many weeks of lead time, particularly due to Christmas and New Years (with Macworld in early to mid-January), so we ran a high risk of discs being out of date by time we got to the show. It also makes it impossible to do something like release a product at the Expo, as it would have to be done weeks or months in advance to get it onto the disc.

So for our second Macworld in 2006, we devised an alternate system. We ordered 5,000 pre-printed blank CD-rs, as well as 5,000 blank paper sleeves, and a CD duplication robot. We then waited until two weeks before the show, at which point Paul then burned, sleeved and finally shipped out our 5,000 CDs. A lot of work, but with just two weeks of lead time, we were able to have all the latest versions of the applications on the disc. We were able to release Airfoil 2 at the show, while still getting it onto the disc. That said, the discs all became out of date two weeks later when we released Airfoil 2.0.1.

This year we're employing a modified version of this same system - pre-printed blank CD-rs, with professionally printed CD sleeves (the fabled infosleeve) so we don't have to give out a flyer as well. However, we've improved the CD itself with a solution to prevent the discs going stale after the show. Instead of just burning our applications directly to the CD, we display them through an application we wrote called Live Disc:

LiveDisc

Live Disc presents a window much like a customized Finder window, with application icons that you can drag for copying or double-click for launching. The magic is, if a newer copy exists on our web server, it will copy or launch that version instead, seamlessly.

When Live Disc launches, it compares each application from the disk, to what our web server reports is the latest. If you then copy or launch an out of date application, it automatically downloads the newest copy from the web server, extracts the .zip or .dmg (thanks to SUUArchiver from Sparkle), and finally presents that version instead. From the user's perspective, you drag an the icon for an application such as Fission, drop it on your Desktop, and get the latest version, every time.

That said, it isn't a truly perfect solution. If there is no internet connection available, Live Disc has no choice but to use the versions it has on the disc. Even when there is an internet connection, there are progress bars to watch as downloads complete and are extracted. But otherwise it works pretty nicely.

If you are attending Macworld this year, be sure to come by our booth (#2738 in the South Hall), say howdy, and grab a disc to see Live Disc in action.

Posted by Quentin | Permalink | View/Post Comments (28)
Mon, 17 Dec 2007

A little over a month ago, we were able to resurrect MakeiPhoneRingtone, with version 1.3, coupled with iTunes 7.5 and iPhone OS 1.1.2. We're now at version 1.3.1, and it's still going strong and working well. However, until late last week, we still feared Apple would again change course and lock out custom ringtone.

We fear that event no longer, however, thanks to this support document. As you can see, it details how to use GarageBand to create and send custom ringtones to your iPhone. This lends an increased legitimacy to a process that should have been available from the get-go, and I think it's safe to say that custom ringtones will be with the iPhone from here on out.

What's interesting to note is that currently, this feature is Mac-only. Having this functionality right in iTunes might make more sense, as it would fit with the existing ringtones editor, and it would make it cross-platform. However, it would also make it much simpler to add copyrighted music as a ringtone, which would cut into iTunes Store revenues. Hiding this away in GarageBand puts the focus on personally-composed ringtones.

This move also provides a nice assurance that custom ringtones are here to stay. As such, we'll see about integrating MakeiPhoneRingtone's functionality into Fission in the near future. As you can see to the left, this will likely take the form of a simple menu option, so you'll be able to use Fission then save to iTunes with one click. Coupled with automatic AAC conversion if required, making custom ringtones from any audio will be easier than ever.

For now, you can keep using Fission and MakeiPhoneRingtone together. And while MakeiPhoneRingtone is likely to be kept around as a Freebie, we'll be working to make things even faster, so that Fission is all you need. Stay tuned!

Posted by Paul | Permalink | View/Post Comments (1)
Sun, 30 Sep 2007

We released our newest product Radioshift last Monday, after almost a year and a half in development. In one form or another, Radioshift has been brewing for years. This concept has long been known internally as AHT, short for Audio Hijack Timeshifter. The aim of AHT was always to improve the experience of recording radio. A large chunk of Audio Hijack Pro users record internet radio and we've gradually added features to make this easier. However, it was never the focal point of the application, and it's never been as simple as we'd imagined it could be.

The way to truly make recording easy is a guide which contains information on available radio. Part of how TiVo has improved upon the VCR is through its guide. This guide makes it possible to set a recording by browsing and clicking. No longer do you need to know when a show is on, what channel, and so on. But a guide for internet and AM/FM radio? It's huge, there are thousands of stations, they're always changing - it's way more complicated than TV. No one could ever organize it all, could they?

RadioTime LogoIt turns out someone could and someone did. RadioTime has been working to catalog the world of internet and AM/FM radio since 2002 and their guide now tracks over 50,000 different listings. Bill Moore, the visionary founder of RadioTime, had actually made us aware of the guide way back in 2003. However, it wasn't a good fit for us at the time (technologically or economically), so it simply lingered in the backs of our brains.

It wasn't until 2006 that we realized we wanted to make a new product dedicated solely to recording radio content. We wanted to simplify this task and take it out of the hands of the technophiles and into the hands of to the masses. With this vision, we went to Bill and RadioTime. We found that the guide had matured greatly and now featured an excellent SOAP API. Quentin rapidly cooked up a demo application to test it out and within a week we were talking to the RadioTime guide.

We've been working concretely on Radioshift ever since, with our newest employee Guy leading development. A little less than a year after we worked out our agreement with Bill, we finally have that new product with which we hope to change the world of radio on the Mac. Radioshift is finally here, thanks in no small part to RadioTime.

Posted by Paul | Permalink | View/Post Comments (3)
Sat, 29 Sep 2007



The new Apple keyboards now have "media keys" for Previous, Next and Play/Pause. As of yet there doesn't appear to be any public API for developers to use these keys in your own application. But this post to the CocoaDev mailing list from Peter Maurer reveals a way.

Firing up Xcode, we start by subclassing NSApplication and listening in on -sendEvent. We can see applications are actually passed events for these new keys. The event has a type of NSSystemDefined, and a subtype of 8.

Here is a code snippet showing how to trap them:

- (void)sendEvent: (NSEvent*)event
{
if( [event type] == NSSystemDefined && [event subtype] == 8 )
{
int keyCode = (([event data1] & 0xFFFF0000) >> 16);
int keyFlags = ([event data1] & 0x0000FFFF);
int keyState = (((keyFlags & 0xFF00) >> 8)) == 0xA;
int keyRepeat = (keyFlags & 0x1);

[self mediaKeyEvent: keyCode state: keyState repeat: keyRepeat];
}

[super sendEvent: event];
}

I'm not completely sure on the "keyState" code, it appears the value alternates between 0xA and 0xB depending on if the key is up or down. There may be other values I don't know about though.

Moving on, once we got the event, the code for handling would be something like as follows:

- (void)mediaKeyEvent: (int)key state: (BOOL)state repeat: (BOOL)repeat
{
switch( key )
{
case NX_KEYTYPE_PLAY:
if( state == 0 )
; //Play pressed and released
break;

case NX_KEYTYPE_FAST:
if( state == 0 )
; //Next pressed and released
break;

case NX_KEYTYPE_REWIND:
if( state == 0 )
; //Previous pressed and released
break;
}
}

The key codes constants come from the header IOKit/hidsystem/ev_keymap.h. One other thing to note is that these keys act as "global hot keys", every application receives events for them, not merely just the foreground application. This whole public domain sample code is available in a file here.

And while we are on the topic of coding: Don't use strnstr.

Posted by Quentin | Permalink | View/Post Comments (6)
Thu, 13 Sep 2007

Continuing in our seeming obsession with iPhone ringtones, we've got MakeiPhoneRingtone 1.1 available for download now. Version 1.1 uses the more stable "stik" method of turning AAC files into ringtones, as discovered by Cleverboy.

Click to download
Click to download MakeiPhoneRingtone 1.1

As noted earlier this week, you can create ringtones with Fission, and you can turn non-AAC files into ringtones with the right Export settings in Fission. Once you have the file, just drag and drop onto MakeiPhoneRingtone, and you'll be set. We hope you'll check out Fission for ringtone and general audio editing, but of course MakeiPhoneRingtone works with AAC files from any source.

MakeiPhoneRingtone has been tested on many different setups, but we can always use more details to improve it. If you have any problems, issues or questions, email us directly so we can see what's up.

Posted by Paul | Permalink | View/Post Comments (24)
Wed, 12 Sep 2007

So far we've talked about using Fission to create iPhone ringtones, and using MakeiPhoneRingtone to get those ringtones to the iPhone. Both these articles have received great responses, and we're working on fixing a couple issues that have cropped up with MakeiPhoneRingtone, so stay tuned for an update.

We've also heard from people who want to edit non-AAC files in Fission and save them for use with MakeiPhoneRingtone and the iPhone. Though it's not immediately obvious, Fission can turn any file it can open into an iPhone Ringtone-compatible file, through the use of QuickTime.

To start, open the file you want to convert in Fission and edit it as desired. When you're ready, click "Save Audio". In the Save dialog, choose the "Export With QuickTime" option and set it to MPEG-4, then click Settings.

This will bring up a Settings panel which you'll want to configure as below:

File Format: Set this to MP4

Audio Format: Set this to AAC-LC (Music)

Data Rate: Set this to 128 kbps.
This can be set to any value. The higher it is, the better the ringtone will sound.

Channels: Set this to Stereo

Output Sample Rate: Set this to 44.100 kHz

Encoding Quality: Set this to Better.
Like Data Rate, the value here doesn't matter much. The higher it is, the better the ringtone will sound, but it will take longer to create.

When you're done, click OK, then save. This will produce a file with an .mp4 extension, which you need to rename. Change it from FileName.mp4 to FileName.m4a and approve the change. Once you've done that, you'll be able to pass it off to iTunes with MakeiPhoneRingtone.

MakeiPhoneRingtone 1.1 and higher will accept .mp4 AAC files and handle them, so there's no need to change the extension.

So there it is, getting Fission to save any file format it can open into a format MakeiPhoneRingtone and the iPhone can handle. You can now make iPhone ringtones from MP3, AIFF, and dozens of other audio formats.

Posted by Paul | Permalink | View/Post Comments (5)
Tue, 11 Sep 2007

Yesterday I posted about using Fission to create ringtones for the iPhone. Editing with Fission is straightforward, but getting the resulting files onto the iPhone is a bit tricky. The processes for both iTunes 7.4 and iTunes 7.4.1 work, but they're not simple.

So we thought, why not make this easier? Enter MakeiPhoneRingtone, a free download available right now. Simply drag and drop AAC ringtones (made with any editor, though we hope you'll use Fission) onto this tiny app, and they'll show up in the iPhone Ringtones tab. Sync your iPhone and they'll ready for use.

Click to download
Click to download MakeiPhoneRingtone

Apple may release iTunes 7.4.2 in the next few days and change how this works all over again. They were quick to update from version 7.4 to 7.4.1, and ultimately, if Apple wants to lock out home brewed ringtones, they can. That said, we'll do our best to keep MakeiPhoneRingtone working with iTunes updates. Further, if MakeiPhoneRingtone does turn out to be a tenable solution, we'll see about integrating it right into Fission.

For now though, check out Fission to create iPhone ringtones and then use the free MakeiPhoneRingtone to get them onto the iPhone! If you have any problems, issues or questions, email us directly so we can see what's up.

Update (9/11/07 1:30 PM): Apple has now turned on the Ringtones feature in the Store. Once you visit the store, you should see a Ringtones category in your Library (if not, open up Preferences and turn on the newly-visible Ringtones checkbox in the General preferences). Now you can manage all the ringtone files that have been added to iTunes with MakeiPhoneRingtone!

Update (9/13/07 3:00 PM): We've updated MakeiPhoneRingtone to version 1.1 (and changed the download links above). Version 1.1 uses the more stable "stik" method of creating ringtones - read about it or just download the latest.

Posted by Paul | Permalink | View/Post Comments (107)
Mon, 10 Sep 2007

Because Fission can losslessly edit AAC and MP3 files, it's always been great for creating ringtones. Using Fission, you can crop audio down to your desired snippet, fade the ends in and out, and save, all in just a few clicks. Add the files to any phone that accepts MP3 or AAC audio files for ringtones, and you're all set.

Sadly, Apple's iPhone didn't accept custom ringtones for the first two months of its life. Apple shipped the iPhone with a nice selection of built-in ringtones, but unless you were willing to use one of the assortment of unsupported third-party hacks, the iPhone wouldn't accept other files as ringtones.

Since iTunes 7.4 last week, the iPhone has allowed the use custom ringtones, purchasable from the Apple store. These ringtones are purchased on top of the audio file, for $1.98 total - no small price.

However, it's also possible to make your own home brew ringtones. iTunes 7.4 accepted files with the extension .m4r as ringtones, a trick I first saw all this reported on The Unofficial Apple Weblog. Version 7.4.1 broke this, but this workaround performs just fine. In short, any AAC file can be an iPhone-compatible ringtone, and Fission can help you edit those AAC files.

Using Fission 1.5.1 To Create A Ringtone From An AAC File

Creating a ringtone from an AAC file is quite simple with Fission. Just follow along with these steps (click thumbnails for full-sized screenshots):

Step 1: Open and zoom in
Highslide JS
To start, I rip an AAC file of the song Sam's Town from the latest Killers CD. The first 30-60 seconds of the song features a nice intro, so I open it in Fission and zoom in to the first minute.

Step 2: Cut down the audio
Highslide JS
I play to where I want the ringtone to end (where the vocals come in at around 45 seconds), pause playback and set a split point (with command-T for Split at Playhead). I then select the second clip (representing the rest of the song) and remove it with the Remove button.

Step 3: Audio adjustments (Fades and gain adjust)
Highslide JS
My file's now down to where I want it lengthwise, so it's time for some audio adjustments. Thanks to the loudness war, I need to decrease the gain, so I select the clip by clicking it and use the Gain Adjustment slider to make the song quieter.

Highslide JSThe audio already fades in nicely with a drum roll, but I want to fade out the end, so I select the last few seconds and click Fade Out.

Step 4: Save the file

Highslide JSMy audio is all set, so I click the Save button and save out my AAC file. I've got my ringtone!

Step 1: Opened and zoomed in
Step 2: Cutting down the audio

Step 3a: Adjusting audio adjustments
Step 3b: Fading out the end
Step 4: Saving the file

Getting Ringtones Into iTunes 7.4.1 (And Onto The iPhone)

Update (9/11/07 2:00 PM): We heard from people that this part was a pain in the butt, and we realized we could make it better. You can skip all the steps below by using our MakeiPhoneRingtone freebie.

I've got my ringtone file, but I still need to get it into iTunes and onto the iPhone. To do this, I'll follow the aforementioned workaround.

Step 1: Change the file's extension
Highslide JSTo start, I select the file in the Finder and choose Get Info from the File menu, then change the extension there to .m4r.

Step 2: Approve the change
Highslide JSI've got to approve this change in the Finder warning by clicking "Use .m4r".

Step 3: Add the file to iTunes
Highslide JSI drag and drop the file to the iTunes Library, and it copies it to a "Ringtones" folder at the Artist level. The file isn't visible anywhere in the iTunes Library but it does show up in the iPhone's Ringtones tab - we're getting somewhere!

Step 4:Turn on the ringtone
Highslide JSNow I can turn on the ringtone in the iPhone Ringtones tab. With iTunes 7.4, I'm all set. However, with iTunes 7.4.1, I'll get an error when I sync saying that the file can't be played by the iPhone.

Step 5 (iTunes 7.4.1 only): Rename the file (again)
Highslide JS
To avoid this, I need to change the file's extension back to .m4a. It's absurd, but it works. To do this, I go to my Ringtones (in my Home folder -> Music -> iTunes -> iTunes Music, by default). I find "Sam's Town.m4r", and rename it back to "Sam's Town.m4a" in the Get Info window.

Highslide JSJust as before, I need to approve this change, this time by clicking "Use .m4a" in the resulting dialog.

Step 1: Changing the file extension
Step 2: Approving the change
Step 3: My ringtone in iTunes
Step 4: Bogus error with iTunes 7.4.1
Step 5a: Renaming the file again
Step 5b: Approving the change (again)


Once I do this and sync again, the ringtone shows up on my iPhone - huzzah! It may seem like a lot of work, but the combination of editing the file and getting it onto the iPhone really only took a couple minutes. In far less time than it took to read this post, you'll be able to edit ringtones in Fission and get them synced to the iPhone. Enjoy!

Posted by Paul | Permalink | View/Post Comments (13)
Wed, 15 Aug 2007

Macworld logoWhile at C4[1] this weekend, I had several developers thank me for the posts on Macworld San Francisco I wrote up back in January. I'm happy to help and provide this information. It can be hard to find without doing it yourself and I know I wish we'd had these sorts of details when we first started exhibiting.

If you're saying to yourself, "What Macworld articles?", or if you're considering exhibiting at Macworld in 2008 ('tis the season to be considerin'), then this post is for you.

The Should I Exhibit At Macworld? Series

Part 1: Costs - This first article is perhaps the most useful, as it provides an overview on just what it costs to exhibit at Macworld. Floor space alone is expensive, but there are plenty of other less visible costs that are worth knowing about.

Part 2: On The Show Floor - The second article in the series provides an overview of what to expect from your time on the Macworld show floor.

Part 3: Decisions, Decisions - Booth or kiosk? What about handouts? Deals with some of the decisions that need to be made when signing up for Macworld.

Part 4: Odds & Ends - The final article in the series ties things up with several scraps that didn't make it into the first three article.

I hope the series helps a few more developers make informed decisions about exhibiting at Macworld.

For all our non-developer readers, Rogue Amoeba will be at Macworld 2008 in booth #2738 of the South Hall. I believe we'll have free passes to give out in the near(ish) future, so be sure to watch this blog or sign up for our mailing list. The show will be January 15th through the 18th, and we hope to see you there!

Posted by Paul | Permalink | View/Post Comments (4)
Fri, 06 Jul 2007

It seems the Derik DeLong over at MacUser ran with my off-the-cuff comment about MailKit before I even got to post Restarting Innovation. Derik, at 5:23 AM, you should be asleep, not blogging.

Ultimately, I don't care specifically about "MailKit". What I think is important is the idea of Apple providing more backend engines, upon which front-ends can be built. MailKit is a great example of that, but a FinderKit (for replacing the Finder), a MediaKit (for audio), and so on, could also be quite useful.

On Restarting Innovation

Michael Tsai has an in-depth response posted on his blog. To be honest, even I'm not sure frameworks are the solution. It does seem that there are problem spaces like mail and the web, however, where the core problem can be addressed once. Currently, we get multiple developers spending months re-inventing the wheel, or no developers working on the problem at all.

On Competing With Mail

Matt Ronge has been working on MailCore, the heart of Kiwi. The idea here is similar to the MailKit concept I mentioned. It's coming from a third party, however, which means it lacks Apple's resources, and it also doesn't seem to do POP. Nonetheless, it's certainly an interesting start. Matt has some comments on email. 

As far as a commercial email client goes, I don't believe selling one to be impossible, though I do think it's a tough road. However, believing a market exists for a "Mail Pro" isn't the same as such a market actually existing.

Competing with free and bundled Mail is only part of the problem. Perhaps more importantly, there's a history of failed/no-longer-active third-party commercial mail clients. Taking a look at the current landscape, I have to ask one question: If there's no viable commercial email client now, what's going to change in the future to make it possible?

Posted by Paul | Permalink | View/Post Comments (3)
Fri, 06 Jul 2007

For a long time, there's been debate about just how much functionality the operating system should encompass. As I noted in The Rise Of The OS, the operating system has gradually been acquiring more and more functionality that was once the domain of third-party software. In many cases, this is a necessary step to advance general computing, but it can be unfortunate for those developers who pioneered new markets.

This issue has come up many times in the Mac community, when Apple has taken over a market. iTunes and Mail have put a hurt on the MP3 and mail markets, respectively. In some cases, such as Sherlock 3 or Dashboard Widgets, Apple's effectively recreated existing third-party software and included it in the OS, sparking debate on what constitutes a rip-off.1

Today, I'm not interested in debating what Apple has or has not ripped off from third party developers. The simple fact of the matter is that when Apple releases a major new application and bundles it free with the OS, it has the potential to be a game changer.

Indeed, when Apple2 absorbs a market into the OS, several major events occur. Most obvious, the functionality in question generally becomes much more widespread. By virtue of receiving Apple's blessing, this functionality is suddenly mainstream. Good for users, who gain new functionality. However, there are also two different parties who wind up losing out when a market closes down.

Group 1: Developers

Most obvious, the developers who first settled that market generally get forced out. Competing with a free and bundled application, as a third-party developer, is incredibly tough.

But while we certainly have a self-interest in developer relations, the developers who get locked out are a very small group, and tend to land on their feet. I don't have a broad solution for this problem, besides advising third parties to stay nimble and adapt fast.

Group 2: Users

The far larger group losing out when Apple absorbs a market is the end users of the OS . How can that be, when Apple has provided an Apple-branded solution for a given need? The problem arises from the fact that Apple is not married to any particular new market. As such, the provided solutions are seldom deep. They do the job for many, perhaps even most users, but as with all software, they're seldom complete.

In the comments for The Rise Of The OS, Rory Prior of ThinkMac notes:

"You end up in a situation where the bundled apps aren't necessarily that great but the environment has been starved of enough oxygen that a healthy ecosystem of 3rd party alternatives can't really survive. It would be nice to see Apple recognising this and working more with the wider developer community instead of trying to go it alone so much."

How About Frameworks?

It seems to me that there is a solution and it's one we've seen before, from Apple even - frameworks. Apple released the WebKit framework back in 2005, and it's now in use in dozens of applications, from browsers to RSS readers to other seemingly unrelated apps. WebKit has been a boon for OS X, making it a richer platform.

So perhaps a MailKit framework is in order, and maybe others as well. Just as they've done with rendering the web, Apple's already done the heavy lifting on email. Mail.app has the POP, IMAP, and SMTP backend that's required for every modern email client, but currently only Mail has access to the code. Rewriting this from scratch would take months, and when it was all done, you'd be effectively at square one. Only with this backend in place can you really begin to build new features on top of an email client.

If Apple decides to release such frameworks, developers will still be in a tough spot. A framework wouldn't change the reality of competing with a free and bundled first party solution. It would, however, lower the barrier to entry. With MailKit, and other similar frameworks, innovation could be restarted in previously stagnant areas. Adventurous developers could take a chance on both freeware and commercial applications, with less investment required. When that happens, everyone wins.

Footnotes:
1. To be sure, not all claims of appropriated IP have equal merit.

2. This applies to any OS vendor, of course, but current reality means that's just Apple and Microsoft. As a Mac company, we're focused on Apple.

Posted by Paul | Permalink | View/Post Comments (6)
Thu, 05 Jul 2007

Brent has a good post about Mail clients and OS X, which you should read. When I was in Seattle last week, Gus and I discussed email clients with him over beers. We also tried to talk him out of actually developing a mail client. Don't get me wrong, I'm sure Brent could do a fantastic job - I just think it's a terrible market. Thankfully, Brent knows this.

In his post, he said one thing that strikes me as particularly insightful:

"The thing is, there is little economic incentive to create an email app when one comes free with the system and that free one is good. For most people it s easily good enough, if not great...But if there is little incentive for other folks to create an email client, that means that the needs of keyboard adepts will go wanting, since Apple (rightly) concentrates on other things."

This echoes the first two laws of Rogue Amoeba, Don't compete with free and Don't compete with Apple.

We established these rules after working on a string of MP3 players for much too long after iTunes came out. Really, we never had a chance, and neither did anyone else.

Since its rather meek 1.0 release back in January of 2001, iTunes has turned into a juggernaut. To beat it you'd either need to replicate all of its functionality and then add more features, or go the other way and create a very simple player. That first option just isn't tenable. You'll never have your own music and movie store and you'll spend all your time playing catch-up on support for the latest iPod. And AirPort Express. Oh, and Apple TV. But, uh, good luck to you Songbird.

That leaves the "beautiful simplicity" route, and while there's something of a user base there, there's no market. You might argue that simplicity sells; the iPod, which lacks plenty of the features found tacked on to other players, such as FM radios, wireless communication, and more, not only sells, it dominates. But the iPod doesn't sell based on austerity or simplicity of design, it sells based on simplicity of use. You just can't sell simplicity when it really means "a lack of desired features". A free competitor to iTunes could quickly gain users, as there's almost no barrier to switching between audio players. But when there's no money to be made, there's no market.

Safari, on the other hand, really hasn't slowed browser development. There are a wide variety of browsers on OS X - Camino is widely used and Firefox is also popular. Omniweb and Opera are still kicking, and there are even new browsers, like Shiira and Flock. One key difference here is the use of open source (shared) code, which makes development easier. More important to note is that the paid browser market, which never had much of a footing, does seem to be pretty well dead.

So, web browsing, music playback, and email, three of the most important and widely used operations on a current computer. Apple offers built-in solutions for all of these tasks. To be sure, quality solutions need to be available right out of the box, or the Mac would appear incomplete. By providing these solutions, however, Apple has made it impossible to sell software in these markets, and in some cases slowed innovation. This isn't just Apple either, as Microsoft offers the same free functionality in Windows, via Internet Explorer, Windows Media Player, and Windows Mail.

Put simply, the OS is taking over. Third-party (or paid first-party) software used to be a requirement to get your computer to do much of anything, and the OS was little more than a GUI on top of a file system. The balance has been inexorably shifting, however, and now tasks that were once the realm of third-party software are considered basic features. By including these features as part of the OS, mainstream computing advances, and that's a very good thing. However, putting more in the box also causes third-party development to be, well, boxed out. That's certain to leave out more than a few users like Brent, who desire more niche solutions.

Posted by Paul | Permalink | View/Post Comments (21)
Thu, 22 Mar 2007

Minutes after they were announced on January 9th, we at Rogue Amoeba ordered two AppleTVs to test out. Just as we extended and improved the AirPort Express with Airfoil, we're evaluating what we can do for the AppleTV. Today our AppleTVs have finally arrived and I've been testing them out.

Surprise #1: The AppleTV doesn't ship with any connection cables

Printer manufacturers started shipping printers sans cables a few years back, and it was lame, but many of us have an excess of USB cables anyhow. However, I don't have any HDMI or component cables, let alone spares1. So when the AppleTV arrived, I had a very pretty, very expensive brick. I could power it on, but not much else. It's ultimately a small thing, but I expect better from Apple.

After a quick trip to Radio Shack, I hooked the AppleTV up to my TV.

Surprise #2: The AppleTV doesn't require a "Widescreen TV" or an HDTV

This is a pretty damned big deal, and I haven't seen it reported anywhere. The usually reliable David Pogue's review states:

"The heartbreaker for millions, however, is that Apple TV requires a widescreen TV - preferably an HDTV. It doesn't work with the squarish, traditional TVs that many people still have." See updates at the end of this article

I don't blame David for this. After all, it's what Apple's documentation and marketing talks about, using the phrases "Widescreen TV" and HDTV. The Connect page of the AppleTV web page says:

Apple TV works with widescreen, enhanced-definition or high-definition TVs capable of 1080i, 720p, 576p, or 480p resolutions, including popular models from these manufacturers.

And yet there I was, with a 480i (that's "standard definition", what non-HD TVs have) option right in the Apple TV settings. See for yourself:


(Click for a close-up)

That's a "squarish" CRT TV2, just like most people still have (specifically, it's a Magnovox 27" model #27MS4504R). I don't know what percentage of standard-def TVs have component inputs, but mine does and it's about 3 years old. So let's dispense with one myth right now - the AppleTV does not need a widescreen TV. AppleTV does have a 480i mode, which works with standard-def TVs.

My guess is that Apple would rather lose a few customers than confuse everyone. Only standard-def TVs made in the past few years will have component inputs, so most of the fifty years worth of standard-def TVs out there still won't work with the AppleTV. By referring to Widescreen TVs, they may prevent people with standard-def TVs from buying only to find out they need a new TV. But if you've purchased a new, non-HDTV in the past few years, the AppleTV may well work for you (provided you have component input jacks).

Once it was plugged in, setup was incredibly smooth. In the past I've tested several devices to get video from the computer to a TV, and this is by far the simplest. I selected my language, told it what network to join, entered my network password, and that was it. It took about 45 seconds, and there were no problems - I couldn't have asked for anything simpler there.

Once set, you then need to either associate it with a machine, or set it up for streaming from a machine. Either way, the AppleTV appears in your iTunes' Devices tab, just like an iPod. When you set it up for streaming, it appears, you click to set it up, and then it disappears, visible only in the Preferences. When you set it up to Sync, it looks exactly like an iPod.

The difference is that for some reason, the Apple TV only allows for Syncing. With an iPod you have the choice between syncing everything or manually managing. The AppleTV does not allow for manual management. This means it's not possible to drag and drop select songs to the AppleTV. I'd love to use syncing, but my music library alone is over 40 gigs, so that won't work3.

My first experimentation was using the device for audio playback. I don't watch much TV, but I listen to a lot of music, and I wanted to see how AppleTV fared here.

Surprise #3: The AppleTV works pretty well with your music library

The device is obviously built for TV, but it does a pretty good job with audio playback. Obviously it sounds great, and looks good, particularly if you have album art for your music. There are a few snags, however.

Navigating music can be a chore, particularly when you have a couple thousand different artists. The Apple Remote allows for just two operations in each direction. You can move by one by pressing the + or - keys, or you can scan quickly by holding down + or -. The longer you scan, the faster the scan goes, which is good. However, when you let go, the scan doesn't stop immediately. If you see what you're after, it's already too late. As well, the ends of the list don't bounce like the iPhone does. The stop is abrupt and jarring. Overall, the navigation is less than ideal. For video, you're likely to have much shorter lists, but I think this points to problems with the concept of a six-button remote.

As well, leaving a section (such as Music, Podcasts, or TV Shows) stops playback. For video, this makes sense, but it means you can't play audio and browse around. A minor issue, but when playing around I hit it often.

Oddly, there's no Party Shuffle, which seems like a natural fit for such a device. You can choose Shuffle Songs as in iTunes, but that doesn't show upcoming or recent songs, nor allow you to add songs to the list. Likewise, you can not create "On-The-Go playlists" as with an iPod, which seems even more obvious.

I tested out photos briefly, and slideshows look great on a big screen. Now there's finally a reason for all those megapixels. When selecting background music for your slideshows, I highly recommend The Band. One note, as far as I can see, it's not possible to stream photos from a remote machine - they must be synced locally to the AppleTV.

Surprise #4: If iTunes can play it, AppleTV might be able. Or maybe not.

The line I'd seen around the web was "If iTunes can play it, AppleTV can play it." This is not the case. Certainly, AppleTV can play any audio or video you purchase from the iTunes Store. However, iTunes can play other formats through the use of third-party QuickTime plugins, while AppleTV can not be extended in this manner.

If you try and sync unsupported video content from iTunes to AppleTV, the files won't sync over. You'll get an error, indicated by a tiny /!\ symbol next to the AppleTV in the Devices list.

If you instead try to stream from a remote computer, you'll see that the files simply aren't listed. They're in the iTunes Library on the remote machine, but they don't show up as options on the AppleTV. iTunes is simply transferring the file (if supported) over to AppleTV which then handles the actual video playback. This means that support for video formats needs to be on the AppleTV itself.

Surprise #5: Video playback, including streaming, works well

"Why wouldn't it work well?", you're saying to yourself. If you've never used a media center device before, this won't be a surprise. But if you've used other devices (most of which don't have hard drive), you know about the poor quality of streaming video. Skips and glitches were common, and seeking in a file was often not possible.

With the AppleTV and its 802.11n, however, this works great. As mentioned above, the file isn't really streaming from your machine, it's being copied over and then played back locally. This means it's possible to fast-forward and rewind through the file. This seeking isn't perfect as you need to hold the button down, and it's a bit tricky. It does work, however, unlike every other media device I've seen.

When playing video on a computer, I find I prefer to jump forward or back, instead of seeking. Clicking Forward or Back does indeed jump in the file. However, this jump amount is not consistent. In an 60 minute file, it jumps 3 minutes, while in a 2 and a half minute file, it jumps 30 seconds. I often find myself wanting to skip back or forward by ten seconds, but skipping an indeterminate amount of time is not particularly useful. See updates at the end of this article

These are minor things that will hopefully be corrected, but overall the video playback is quite good. 802.11n transfer speeds are very fast, and both local and streaming video play flawlessly.

Wishlist For The Future

1) A bigger hard drive or support for external HDs

As noted, my music library alone is over 40 gigs, and video is much larger. As such, I can't use the AppleTV in a fully automated Sync mode and still have access to all my content. A bigger hard drive would be nice, but why not just let me plug in a USB hard drive? Service reasons is a pretty crummy reason for such a thing. The guess around the RA offices is that it'll be used for an input device, for gaming.

2) Personal Video Recording (PVR) abilities

I have an EyeTV, and it's great. However, as it stands, I need to take my EyeTV content from my desktop and get it to my AppleTV to play it. From a technical standpoint, adding PVR capabilities to the AppleTV seems obvious. Of course, Apple doesn't want you to - they want you to buy those shows from them. Which brings me to number three on the wishlist.

3) Purchasing from the couch

Seeing the top iTunes TV Shows, Music, and so on is fine. Now why the heck can't I buy them from the AppleTV? A 30 second preview is exactly enough to convince me to buy. Once convinced, I've got to get off my duff and go to the computer to purchase and then sync the new content over? Since I first saw the device out at Macworld, this has seemed like a very rough edge.

4) Support for more video formats

The specs page for AppleTV shows the rather paltry support the device has for other video formats. Again, Apple wants you to buy video content from them, but plenty of people get content from other places. By now QuickTime Player can play much of it, and Apple recently added a "Movie to AppleTV" Export option to QuickTime, but it's slow as molasses. Right now, if you have an unsupported video file, it's a chore to get it playing on the AppleTV.

Quo Vadimus?

For those who aren't Latin scholars or Sports Night fans, that means "Where are we going?". As far as Rogue Amoeba is concerned, we're currently evaluating how we can enhance the AppleTV. Enabling it to play any audio makes sense, and we'll be looking at that, as well as video. Whether as an update to Airfoil or a new application, we hope to improve the AppleTV experience just as we did with the AirPort Express. Join our low-traffic announcement list and stay tuned!

Updates:
3/23/07 12:30 PM There's confusion about component vs. composite, and I don't blame anyone - the words are far too similar. So, how about pictures?


Component

That's component input. Video comes in on three cables (red, green, and blue), and audio (again) comes in on red and white cables. The AppleTV does have component output. This is the input you need on your TV.

Meanwhile, this is composite input:


Composite

Video comes in on one yellow cable (or over s-video), and audio comes in on red and white cables. The AppleTV does not have a composite output, and this input jack will not help you (at least not directly).

As well, some have asked about picture distortion. As I noted in the comments, I watched multiple video sources, including an episode of Andy Barker, PI and Luxo Jr. both from iTunes, a couple TV episodes from EyeTV that were converted by EyeTV, and a couple other music video files. These all looked fine to me, but your mileage may vary.

3/23/07 2:00 PM I emailed David Pogue about this yesterday, and he was kind enough to email me back. He says:

Hey Paul--Apple says that this setup would only work IF the standard-def screens have a "simulated widescreen" mode...

If that's the case, then my 3 year old TV (Magnavox 27" model #27MS4504R) has such a mode. I see no mention of it in the manual, but it may be automatic. I'd wager a good number of other TVs have such a mode do too.

The most basic thing here is that I was able to hook up the AppleTV to a standard tv and watch video, without obvious distortion or scrunching. Your experience may differ, so caveat emptor.

3/23/07 3:00 PM Sometimes, it helps to RTFM. When video is paused, pressing back or forward skips by, drumroll please, 10 seconds. Perfect. I still think a proportional skip is bizarre and wrong, but at least it's possible to do what I'm after.

3/24/07 11:00 AM Because my living room isn't famous enough, I snapped some pictures of this all in action, which you can see by clicking below.

iTunes-Purchased Andy Barker episode restarting

iTunes-Purchased Andy Barker episode playing

EyeTV (EyeTV 200) recorded and converted content

The Get Up Kids "Man Of Conviction" Video pulled from TGUK website

Photo slideshow MWSF 2006 image

Handbrake-ripped h.264 content Strongbad Email Disc 3 FBI warning

3/27/07 11:30 AM A list of TVs known to work properly with the AppleTV. Please leave more in the comments, and I'll update the list:

• Magnavox 27", model #27MS4504R

• Sony WEGA 32" model #KV-32FV15

• Sony WEGA 27" model #KV-27FS13 (requires manual switching to 16:9)

Link directly to this list: http://www.rogueamoeba.com/utm/posts/Article/appleTV-2007-03-22-21-30#up5-2007-03-22

Footnotes:
1. As you might expect, I do have plenty of RCA audio cables lying around.

2. And next to it is my Guitar Hero guitar, as mentioned in the interview I did with Ars.

3. My workaround is to do this in two steps. I created an AppleTV playlist and set the Apple TV to sync just that. Now, I drag my desired music there, then sync. It's clunky, but it allows me to get selected portions of my library over to the device.

Posted by Paul | Permalink | View/Post Comments (110)
Wed, 07 Mar 2007

Prior to submitting my entry to a certain infamous contest, I discovered that even after reducing all possible identifiers to one or two characters, my source code was still far over the limit required by the contest. Needing to make up something like a 30% margin on my already insanely compressed code, I thought I was doomed. After several days of on and off effort, however, I just squeaked in under the limit. The ultimate limit is a count of 2048 characters excluding whitespace, or the characters {, }, or ; followed by whitespace. The final version of my entry came in at 2017 such characters.

Today I'm going to show you how to shrink your C source code like a real professional. Pay careful attention, and you can put these skills in to use at your next job.1

1. Use short identifiers
This one may seem obvious, but it's the most effective if your code isn't already using it. C has 53 legal one-character identifiers (yes, _ is a legal identifier too), and you should use every single one of them.

2. Optimize the use of short identifiers
If your program is large enough then you probably have more than 53 different identifiers in your program, meaning that you'll be forced to use some two-character identifiers. For best effect, you want to spend your 53 one-character identifiers on the symbols that are used the most frequently.

To that end, I wrote a small python script that will tell you about underused short identifiers. Pipe your program into its standard input, and as its standard output it will print a list of all identifiers in your application, sorted by frequency of use. It will also print all legal one-character identifiers even if you aren't using some of them. Then you can rename things so that all single character identifiers are at the top of the list.


#!/usr/bin/python

import re
import sys

def hasprefix(str, prefix):
return len(str) >= len(prefix) and str[:len(prefix)] == prefix

def readin(f):
str = ''
for l in f.readlines():
if not hasprefix(l, '#include'):
str += l
return str

def makedict(str):
dict = {}

for c in '_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ':
dict[c] = 0

ident_re = re.compile(r"([a-zA-Z_]([a-zA-Z0-9_]*))")
for match in ident_re.findall(str):
ident = match[0]
if not dict.has_key(ident):
dict[ident] = 0
dict[ident] = dict[ident] + 1
return dict

def sortedarray(dict):
array = []
for k in dict.keys():
array += ((k, dict[k]),)
array.sort(lambda x, y: len(x[0]) - len(y[0]))
array.sort(lambda x, y: -x[1] + y[1])
return array

str = readin(sys.stdin)
dict = makedict(str)
array = sortedarray(dict)
for item in array:
print '%02d --> %s' % (item[1], item[0])

3. Reuse identifiers
You've run out of precious one-character identifiers but you still need to save more space, what to do? Shadowing is your friend. Any one-character function that isn't called in the current function, or one-character global that isn't used, can be reused as a local variable name with no ill effect.

If you want to take this further, you can directly reuse global variables for local storage as long as the types match, and you can be absolutely certain that nothing you call will manipulate that global. This not only lets you reuse a name, but also saves on lengthy declarations.

4. typedef
Type names get used a lot, and they're pretty long. Make them shorter with typedef. Of course you have to pay for the typedef statement itself, but if the type name is used enough then this can easily pay off. For example, the string typedef int i; is 12 non-whitespace characters, but will save you 2 characters in each use of int, so you only need 7 uses of int in your code to make this a win.

5. #define
This is like the typedef tip, but more general. Use #define to shrink common bits of code. For example, if you use the typedef trick more than a couple of times, you can #define t typedef and save even more.

You can get even fancier and take advantage of macro arguments. If you have a bunch of code that's similar but not identical, you can #define it to get it shorter. For example, if you have a bunch of functions with the same signature, you can save on space:


#define f(n) void n(int a, float b, char *c) {

f(q)
int aLocal;
...
}

f(r)
...
}

You can get really fancy using the ## preprocessor operator to glue strings together. For example, here is a bit of code from an earlier version of my entry:


v D()
{
tcgetattr(0, &B);
A = B.c_lflag;
B.c_lflag &= ~ICANON & ~ECHO;
tcsetattr(0, TCSANOW, &B);
}

v C()
{
tcgetattr(0, &B);
B.c_lflag = A;
tcsetattr(0, TCSANOW, &B);
}

All of those tcget/setattr calls take up valuable space, and I can't rename them because they're library functions. And I only call each one twice, so there's not much gain with a #define on them. But with a bit of cleverness I can make a pair of #defines that will cover all four calls, and cover much more than just the function names:


v D()
{
#define O(x) tc ## x ## etattr(0,
#define TD O(s) TCSANOW, &B);
O(g) &B);
A = B.c_lflag;
B.c_lflag &= ~ICANON & ~ECHO;
TD
}

v C()
{
O(g) &B);
B.c_lflag = A;
TD
}

6. Avoid character constants
A character constant uses three characters in code. But most characters have an ASCII value less than 100. Save one character per use by writing out the ASCII value directly instead. Instead of 'A', write 65. This is a small savings but it can really add up.

7. Use - instead of !=
In nearly every situation, the != operator can be replaced with the - operator with no change in functionality. This is not true when you have code that relies on the result of the comparison to be either 0 or 1, if you're assigning the result to a variable of a type where a non-zero result might be converted to 0, or if you're simply assigning the result to a variable of an incompatible type. Again, you save one character per use.

8. Use & and |
In many situations, the use of && and || is unnecessary, and they can be replaced with their one-character bitwise cousins. Be careful that you preserve the semantics of your program when doing this substitution, particularly if you use the advice in #7. Bitwise or will always give you the same result, truth-wise, as logical or, but bitwise and will not; use bitwise and only when you know that the truth values on both sides will always have at least one 1 bit in common. If you can't guarantee this then you may be able to get away with using the * operator, but beware of overflow. You can take advantage of the fact that C's comparison operators will always give either a 0 or a 1 as their result, so there's no problem in doing (a < b) & (c > d).

9. Use the ternary operator and short circuiting
?: is shorter than if/else and is equivalent in most situations, so use it when you can. For situations without the else, you may also take advantage of the short-circuiting properties of && and ||.

10. Adjust your constants
Using constants can help reduce code size by substituting a short identifier for a longer number. Watch carefully how your constant is used. If you discover that most code using the constant is immediately subtracting one from it, for example, you can simply subtract one from the constant itself, then modify the minority code to add one, saving valuable characters. In the extreme case, you may discover that the manipulation drops a digit from the constant, making it use less space to simply inline the new, shorter number in your code.

Putting it into practice
To demonstrate these principles, I wrote a short calculator program. It takes input on stdin in prefix notation, and prints the results of the calculations. You can give it input such as + * 5 5 7 and it will give you the answer of 32. This original non-shrunk version is 411 significant characters:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int getnum(int c)
{
int n = 0;
do
{
n *= 10;
n += c - '0';
c = getchar();
}
while(c >= '0' && c <= '9');

return n;
}

int calc(void)
{
int c = getchar();
if(c == EOF)
exit(0);

if(c == ' ' || c == '\n')
return calc();

if(c == '*')
return calc() * calc();
if(c == '+')
return calc() + calc();
if(c == '-')
return calc() - calc();
if(c == '/')
return calc() / calc();

// read a number
return getnum(c);
}

int main(int argc, char **argv)
{
while(1)
printf("%d\n", calc());
return 0;
}

By putting these principles into practice, I was able to shrink it to a mere 284 characters. There was a certain loss of readability, but I'm sure you will all agree that the tradeoff is well worth it:


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define r return
#define h c = getchar();
typedef int i;

i _(i c)
{
i _ = 0;
do
{
_ = _ * 10 + c - 48;
h
}
while(c > 47 & c < 58);

r _;
}

i d(void)
{
i h
if(c + 1)
{
r
c - 32 && c - 10 ?

#define o(x, y) c == x ? d() y d() :
o(42, *)
o(43, +)
o(45, -)
o(47, /)

_(c) :
d();
}
exit(0);
}

i main(i x, char **y)
{
while(1)
printf("%d\n", d());
r 0;
}

Footnotes:
1. If you haven't caught on yet, this article is intended to be humorous. It's not truly helpful, unless you too are entering a contest whose goal is to write horrible code.

Posted by Mike | Permalink | View/Post Comments (4)
Mon, 26 Feb 2007

Major hosting provider Dreamhost.com had a scheduled but overly-long downtime this weekend, and conversations on web hosting have come up several times since. At Rogue Amoeba, we've gone through a several web hosts over the years, and seen at least two die off in the process. As such, I thought I'd detail our own experiences with web hosting, and provide a bit of advice.

Web Hosting Rule #1: You get what you pay for.

This rule is true of most things in life, but it is perhaps less obvious in webhosting. Most hosts can offer you 99% or even 99.9% uptime, and that amounts to being down just a few hours per year. That sounds great on paper. In practice, however, it's a whole different matter.

When Rogue Amoeba got started, we found a dirt-cheap web host, iSuperWeb.com. "iSuperWeb"? What the hell were we thinking? But it was the carefree days of 2002 and we were young and foolish. Within our first month, we had to upgrade our account twice as we went over bandwidth limits. This host actually shut down our account the first time this happened, posting a "Bandwidth exceeded" message, instead of simply charging us for the overage. That probably should have been a hint to us. Within three months (early 2003) they were dead, and we'd switched to a new host.

That new host was Eryxma, who gave us plenty of bandwidth. Erxyma was run by a couple guys who were in over their heads, but it was fine for us. We were a small company with very little in the way of traffic and we had better problems to consider1.

In our case, Eryxma gave us a Virtual Private Server (VPS), basically a slice of a full machine made to look like a real machine. You have full control of your virtual machine, and can reboot it, access it as root, and so on. You're the administrator of this VPS, so you can do whatever your like. My email records show me happily recommending Eryxma to at least one person (Sorry Tim!).

Eryxma was great, it was very inexpensive, and it met our needs. Until one day, in early 2004, when it didn't. In a short period of time, we started seeing many problems with Eryxma as the company crumbled2. We decided to start look for a new host. Quentin was fed up with a string of crappy web hosts going back to well before we founded Rogue Amoeba and convinced me to take a second look at Pair networks.

Web Hosting Rule #2: Everyone loves their current host until the server is down.

Pair's been around since 1995 and many of their servers have been up almost as long. Their prices have always had a premium attached to them compared to other hosts, and this had turned me off for a long time. But we've been using them for three years now, so when I was recently asked "Is Pair's network and overall reputation so great that they can command those prices?", my answer was simple: "Yes".

As noted, everyone will recommend their current host, until their site goes down. With Pair, we've been down once, when our HD died. This was fixed within about two hours, with no data loss. If our server never goes down, our love for Pair never stops. We trust them to provide rock-solid hosting, and that's the most important thing to us.

Pair locks down your account, meaning you don't get the same level of control as with a VPS, or even with many other similar hosting providers. But here's the rub: that's generally a good thing. Less power leads to increased stability across the board, and when you're sharing a machine with others, that's a very good thing.

Web Hosting Rule #3: Have A Contingency Plan

So we set up an inexpensive Pair account to host our main web site (rogueamoeba.com), while keeping our downloads on Eryxma. This two-pronged approach meant that we didn't need a very high-end account with Pair, as our downloads account for the vast majority of our bandwidth usage. That kept costs down at Pair, and let us pay for what we call a "bandwidth sink" elsewhere.

Having two hosts probably seems a bit odd, but it's worked out very well. If our less reliable host fails, we flip over and let Pair handle our downloads. In a true worst-case scenario, if Pair fails, we have an account all set up and can transition our site to the other host machine. See below for more on this setup.

Meanwhile, Eryxma was still falling apart, so we went looking for a more reliable VPS host and found ServInt. They too provided us with a VPS, and while the price was more expensive they were (and remain) far more stable. We played around on the VPS, using it to run our automated processes such as order processing.

Web Hosting Rule #4: Run your software company, not your web server.

As noted, this two-pronged approach worked quite well for us and we continue to use it now. However, having a VPS just proved to be a hassle for us. We all know our way around a command line, but while the VPS gave us as much power as we could want, we paid the price when we had to administer it ourselves. So a year ago, we looked at upgrading our Pair account.

Pair offers dedicated hosting (your own rented machine) through their QuickServe plans. These are quite expensive, a couple hundred dollars a month, so this was a big step up for us. However, we took advantage of their discounted QS-X plan, which offers an over-stock machine at a reduced price. With the QuickServe, we have a full machine to ourselves, and lots of bandwidth. We shut down our VPS and moved everything over to Pair.

Even with our own machine, we're still locked down pretty well. We don't have root access, and we can't install new packages, which means Pair nickels and dimes us for add-ons like installing Subversion ($50). That's a lot of money for something we could do ourselves if we just had the access, and this used to grate on me. Now, however, I have a different mindset: we're paying a sysadmin in discrete chunks. He gets $50 for his task and we know it will be done right. Meanwhile, we don't have to pay a full salary to someone who spends most of the day reading Slashdot.

Here We Are Now

I said that we still use a two-pronged approach, but when we got our QuickServe, we moved everything there. Around the same time, we realized that we would still do well to have more bandwidth if needed, and it might be nice to be able to noodle around a bit more than we can on Pair. On recommendation from Mike, we checked out DreamHost, whose prices are rather unbelievable. They offer plans with what is effectively unlimited bandwidth and storage for just a few dollars a month.

How do they do it? I don't really know. Perhaps it's all a house of cards. The important thing for us is that it doesn't matter. Dreamhost hosts only one important public-facing site for us, BigBlueAmoeba.com3 (BBA). BBA is our download server, as long as it's alive.

We have a mirror checker script that runs on our main site every six minutes. It checks the local files and makes sure BBA has the same copies. If it can't reach BBA, or if the files don't match, our Pair.com site (rogueamoeba.com) takes over handing out downloads. Worst case, we have 6 minutes of downtime for our downloads, and this has never been an issue. The upshot is that we again have a bandwidth sink, and it's very inexpensive.

So that brings us up to our current setup. Pair.com hosts rogueamoeba.com, our main website, as well as rogueamoeba.net, which handles our order processing and other internal needs. This hosting costs us something like $1500 a year, but we know we can count on it 100%. Meanwile, DreamHost handles our downloads and other various needs (I put MacSanta.com there, for instance). This costs us around $100 a year.

Closing Advice

We had a lot of experience with inexpensive but unreliable hosting, and it was just never worth it. I certainly would recommend not using a host like DreamHost or one of the many other cut-rate hosts for a website that you want available 24/7. We love DreamHost, but if we cared about reliability there, we'd be gone in a heartbeat.

I firmly believe that everyone would do well to use Pair, or a company with a similarly bullet-proof track record4. I wouldn't suggest a QuickServe to every software company, but Pair's simpler web hosting plans are quite affordable. They cost more than some other hosts but you really do get what you pay for. For us, that piece of mind is worth a few dollars more per month.

If you're interested in switching web hosts, you can click these shameless and self-serving referral links:

 
Pair.com Dreamhost.com

As well, if you're switching to Pair, use coupon code REFUGEE to pay $0 on setup fees.

Footnotes:
1. Important questions such as "Can we sell a tool that lets you record any audio without getting sued out of existence?"

2. Maybe we need a parallel rule set. Web Hosting Rule #A: Never go with a host whose name looks like a skin disease

3. 10 AmmoPoints* to the first person who can tell me (here in the comments) what the domain BigBlueAmoeba.com is parodying.
* Even with the weak US Dollar, 1 AmmoPoint is equal to $0.00001, and may thus only be exchanged in blocks of 1000 AmmoPoints

4. Another host often mentioned in the same breath as Pair (pair.com) is Hurricane Electric (he.com). They've been around since 1994 and have a similarly-excellent track record (despite the name). This leads me to another parallel rule, Web Hosting Rule #B: The shorter your host's domain name, the better.

Posted by Paul | Permalink | View/Post Comments (17)
Wed, 07 Feb 2007

The Should I Exhibit At Macworld? Series
Part 1: Costs
Part 2: On The Show Floor
Part 3: Decisions, Decisions
Part 4: Odds & Ends

And so we've come to the end of our series. We've laughed, we've cried, we've looked at
funny pictures of David Pogue. I gathered a bunch of small items that didn't fit well into the other articles, and lumped them together here.

Gimmicks

Cheap gimmicks are unlikely to work as a way of attracting people. Booth babes are a popular concept at trade shows, but you won't find many at Macworld, with good reason. When you're showing off something simple like a video game, a booth babe is an easy way to get guys to your booth. Personally, I wouldn't want anyone working at our booth who didn't have a firm handle on exactly what our products do and how they work. If you have attractive, personable people working for you, by all means get them to the show. Hiring a pretty face to pitch your technical product, however, seems like a bad idea.

Likewise, using candy to attract people didn't work for us. Our first year at Macworld we went out and bought a fishbowl and a huge bag of candy. Within an hour or two, we had an empty fishbowl, lots of trash, and not much else to show for it. In order to have enough candy to go around, we'd need to have spent hundreds of dollars. As you might guess, we quickly gave that up.

If booth babes and candy aren't the way to attract people, what is the right way? Sad to say, I don't know the perfect answer here. Our own formula of a weird name and logo coupled with interesting artwork works well enough for us. There are certain to be gimmicks that do work, and if you hit on one, great. But be cautious and don't spend too much money. People are at Macworld to see you and other companies. They'll come, no gimmicks required.

Protect your feet

Your best friends at a trade show are a comfortable pair of shoes and a man named Dr. Scholl. You'll be on your feet for hours at a time, and anything you can do to reduce the pain will be a very good thing.

Take notes!

The most valuable thing about exhibiting at Macworld is the fantastic amount of interaction it provides, with both your current and potential customers. Keep a notebook with you at all times to write down ideas and suggestions.

Don't worry about the unions

When you sign up to exhibit at Macworld, you'll get all kinds of documents and a scary contract. Perhaps most frightening of all will be the regulations surrounding labor unions. For instance, regarding materials:

You may hand carry only what you can manage by yourself (one person) in one trip, using no equipment.

and regarding booth setup:

By definition, the installation or dismantling of exhibits that requires the use of hand tools, or takes one person more than 30 minutes, or exceeds ten feet in any direction, falls within the jurisdiction of the Local 510 of the Sign Display and Crafts Union.

Fun stuff, eh? Scary as it all sounds, it's not really anything to worry about. These rules are designed to pry open the wallets of major exhibitors (like Apple). The small fish slip through the net, and that means you don't need to worry much. Your setup should certainly be simple enough, and you can carry in a box or two at a time over several trips.

Now I just have to worry about getting Hoffa'd at the next show.

Infoboards

For Macworld 2006, we created infoboards that showed off our products. These featured a huge, high-quality print of the icon for the product as well as a brief description of its functionality.

These infoboards are very useful to draw the eye and bring people over. In just a few seconds, attendees can scan your products and hopefully realize they're worth checking out. In fact, I'd say this is one of the simplest ways to get people to your booth, and we'll definitely be using them again.

These infoboards are also great because many times people know your products, but not your company. Plenty of people know Audio Hijack Pro, but don't know Rogue Amoeba. When they see Audio Hijack Pro's icon and name, they come over and talk to us about our other products.

Use coupon codes

Last week we talked about selling on the show floor, and that's certainly the most effective way of tracking sales. However, if you choose not to sell on the floor, you can still track sales. In order to track sales, we provide a unique coupon code for each show.

For Macworld San Francisco 2004, our code was MWSF2003IS, because we made it in 2003 and we were too dumb to realize that Macworld wasn't until after the new year (the "IS" stood for Infosheet, where the coupon was located). With this coupon code, we can track the minimum number of sales directly realized from exhibiting at the show. It's far from a perfect metric, but it's simple and worth doing.

Free CDs

We've provided CDs with demos at all our shows, and it's been an effective way of getting the software in the hands of potential customers. The biggest problem has been letting people know that these CDs are free.

Numbers

I'll say it one last time, because it's worth repeating. Around 2500 to 5000 trial CDs is a good bet for the show, as well as between 5000 and 7500 flyers. Plan to run out of CDs, the more expensive handout, and fall back on flyers.

Ladies and gentleman, I give you...Infosleeves

We've previously talked about two different types of handouts: flyers (or infosheets) which provide rich detail on all our products, and CDs which contain trial versions of our software. W