TapeDeck and Capo Updates for the Mac

• Chris Liscio

This week I shipped Capo 2.1.10 and TapeDeck 1.5.2.

Capo 2.1.10 addresses a few major issues that were found in the 2.1.9 update, as well as some longer-standing ones. For instance, the default keyboard shortcuts failed to operate properly and displayed the additional fn modifier key in the Control menu.

It turns out that either Lion or Mountain Lion started to render the fn key as a modifier key, and I had inadvertantly stored a set of modifier flags with the default keystrokes that had that flag set. Oops.

Also, I wasn't hooking the user-defined key equivalents to the menu items until the menu was shown (in the validateMenuItem: call), because I was catching those keystrokes using other means. However, that other method isn't foolproof and I needed to forcefully (rather than lazily) set those menu key equivalents at launch time.

For existing users to benefit from this fix, run the following command at the terminal:

defaults delete com.supermegaultragroovy.capo CapoPlaybackCommands

If you purchased using the Mac App Store, use this one instead:

defaults delete com.supermegaultragroovy.capo.macappstore CapoPlaybackCommands

I also found an OpenGL-related race condition that stumped me for some time. It turns out that a Core Animation-backed NSOpenGLView cannot make any assumptions about owning its context. I was creating textures (i.e. calling glGenTexture()) at the same time that CoreAnimation was disposing them on another thread (i.e. calling glDeleteTexture()). Locking the CGLContextObj fixed that issue up good.

TapeDeck 1.5.2 was a much quicker update to put together. When I rewrote the tape box view to use a view-based NSTableView, I didn't carry over the ability to drag .m4a (MPEG-4 audio) files into the list. It was partially a copy/paste job from my old tape box view class, but I ended up rewriting much of that code using new (and much nicer!) APIs for drag and drop.

Other than the above, I've been crunching on a whole lot of new development lately. I've split my time between reading papers, writing up tests using MATLAB, and coding up prototypes for the past few months. It's been busy, but I hope to have something to share soon.