Open Shelf…

Look at the size of that thing 25May07 | 0

I got my video tutorial done….. almost 20 minutes of it…. and it was 4.3GB in size (uncompressed). So, I proceeded to try & encode it using H.264 into a smaller file size. But it ganked the text too much, so I tried again, with a higher bitrate. And again. And again.

In the end I gave up & just did ‘Export to Apple TV’ instead. It produced a 100.3MB file. Hm.

So, I uploaded it to the Internet Archive, rather than kill my hosting provider. It’s a 1152×720 resolution video, Mpeg-4 using H.264. Right-click the link below to download it, left-click to stream it directly within your browser.

Go straight to the .m4v file

BackRow Developers’ Kit Released 24May07 | 0

So finally I can release to the public what I’ve been working on for the past couple of weeks. It’s been a bit of a labour of love for me, and I wanted to get a few things just so, including proper online help modeled upon Apple’s own, a fabulous Apple Devtools-style icon from BigBaconAndEggs, and incorporating feedback and suggestions from my testers ericIII, xdog, and |bile| on the AwkwardTV IRC channel.

It includes an Xcode project template to get you started, a set of class-dumped header files for the necessary frameworks, and an application which lets you run the Apple TV interface in a window on your desktop.

So, without further ado, I shall direct you towards the official product page itself for more information and a download link.

BackRow DevKit, Episode 2 18May07 | 0

I’ve been doing a little more work on the development kit for BackRow appliance plugins, and so I’ve put together a little video showing what’s new.

At present it can run the main AppleTV interface, although this requires that you copy the PlugIns, Screen Savers, and Patches folders into the DevKit application bundle. It can also optionally work with just a single plugin, using that as the root controller.

There is now an options window allowing you to specify the run mode, along with realtime toggling of some built-in BackRow statistics tools: a framerate counter, a ’safe region’ highlight, and some copious printing to stdout of all layers being rendered.

Along with this comes the useful addition of BackRow running within a proper window, moveable and resizable, and which has a normal window level so you can open your debugger on top of it if you want to.

The video is in QuickTime format, using MPEG-4 video, 890×618, 13.2Mb in size.

Apparently my manual edits to the volume levels aren’t actually saved, even though they claim to have been. So there’s a bit near the beginning where what I say is drowned out by the intro movie. What I say at this point is, basically:

You can resize this window. It’s not very stable when there’s a list on the screen, but with video it seems quite happy. Frames per second appears down here, safe areas appears like that. And there we have it.

Also, it doesn’t appear to want to play anything until it’s downloaded the whole lot, so please be patient. I think I’ll be trying something other than Snapz Pro X for the next one…

Watch it here

AppleTV Main Menu Woes — solved 17May07 | 0

Well, in working on my debugger test harness, I decided this would be a good opportunity to try a little hack I’d been thinking of for getting around the Main Menu issue. Normally, it sets the bottom of the list in a static position, so that as you add more plugins, the list grows off the top of the screen. I figured that this wasn’t ideal, and decided that the superclass’ implementation would be better.

Here’s some code I run in the test harness before the menu gets loaded for the first time, in the +initialize method for my BRAppManager subclass:


Method main, norm;
main = class_getInstanceMethod( [BRMainMenuController class],
                                @selector(listFrameForBounds:) );
if ( main != NULL )
{
    norm = class_getInstanceMethod( [BRMenuController class],
                                    @selector(listFrameForBounds:) );
    if ( norm != NULL )
        main->method_imp = norm->method_imp;
}

And here are some shots of the results; as usual, click on the images for a full-size version:

Top of the main menu

Bottom of the main menu

BackRow Headers Installer 12May07 | 0

So, since I started frequenting the AwkwardTV IRC channel, I’ve had to help a couple of people get their class-dumped headers for BackRow, iPhotoAccess, and QuartzComposer all sorted out in such a way that they can successfully build things. It becomes kinda tricky to explain after a while, so I though I’d do something useful about it. And so, without further ado, may I introduce: The BackRow Headers installer package!

Download Installer Download it here

The package only installs the headers generated by class-dump, although in the BackRow case I have added a few things to them, mostly in the BREvent.h class (event types and definitions, mostly). And I’m not going to redistribute the frameworks themselves, so please don’t ask.

The installer will look for the BackRow and iPhotoAccess frameworks to be present already within /System/Library/PrivateFrameworks, and will not install if they are not found. It will place a PrivateHeaders folder at the root of each of those frameworks, and at the root of the QuartzComposer framework. It will then create symbolic links into the Mac OS X 10.4 Universal SDK — for the AppleTV frameworks it’ll symlink the whole thing, and for Quartz Composer it’ll just link the PrivateHeaders folder itself.

Bear in mind that while the headers will install on a PowerPC Mac, you can’t compile for PowerPC since the BackRow and iPhotoAccess frameworks are Intel-only.

Text Entry in BackRow 11May07 | 0

Potentially one of the most useful features of the AppleTV to plugin authors is its text-entry subsystem. While the Apple Remote is not an ideal tool for the job, there are often occasions where text entry of some kind is useful, such as entering a URL, a password, the address of an AFP server from which to collect content.

As it turns out, basic text entry is actually very simple to implement. In today’s tutorial, we will create a simple layer controller class which allows you to change its title.

Sample code for this tutorial Download the sample code for this tutorial

[…]

Debugging BackRow 10May07 | 0

This will be a proper podcasted groove thang with embedded viewers & such soon, but for now here’s a link to the QuickTime file. It’s MP4, 1044×621 pixels, 9.2MB.

Linky

A Downloader Controller 10May07 | 0

Back in the first article in this series we created a BRControl wrapper around the ProgressBar widget. I said then that we would put this to use shortly, and so we will. In today’s tutorial we will look at a more substantive example of plugin development, including localizations and resources, some preferences, and asynchronous download from the internet. Our end result will be a controller which downloads from a URL stored in our preferences, displaying the progress of the download as it does so. It will also show a method for supporting resumption of an interrupted download.

Download a sample Xcode project Download the sample code for this tutorial.

[…]

Extra Credit — Animations 10May07 | 0

In the the second article in this series, we used a simple animation, the fade-in. The animations available can be more complex than that, however, even without creating a custom BRAnimation subclass. In this short walk-through, we’ll replace the fade-in animation with a grander swooping image animation. As with the last article, a sample project will be included at the end.

Download a sample Xcode project Download the sample code for this tutorial.

[…]

A Custom Layer Controller 10May07 | 0

In our second tutorial we’ll pull back a little and cover the BRLayerController class, and what you can do with it. If this isn’t your first experience with Back Row plugins, then you’re probably already familiar with the BRMenuController or BRMediaMenuController, but those are both fairly specialized subclasses. By creating our own BRLayerController subclasses we can define our own content and layout in a more comprehensive manner.

Along the way we will also take a look at an anciliary class, BRImageManager, which enables us to dynamically download and cache images from the Internet, or indeed from any URL, remote or local, and we will see how to use the BRHeaderControl and BRImageControl classes.

By the end of this tutorial, we will have created a custom controller that will download an image in the background and display it when ready.

Download a sample Xcode project Download the sample code for this tutorial.

[…]