Code-Project: Virtual 5.1 Soundcard (Mac)

2015-12 Addendum: See SoundPusher for an update to (and new name for) this project.

As far as I’m aware there very few real-time 5.1 (Dolby Digital / AC-3) encoders for the Mac that integrate into the default CoreAudio HAL (and can thus be used by any application); I’ve only stumbled upon ac3jack, which builds on the multi-platform JACK Audio Connection Kit.
I thought it’d be interesting to learn something about CoreAudio and low-latency coding and thus decided to write such a system. Currently, this is split into 3 components:

  • CoreAudio AudioCodec for transforming LPCM into encoded AC-3. I’m using libavcodec as the encoder for this.
  • Audio driver presenting a virtual sound output to the system, and forwards that data as a provided sound input. The idea is to select the virtual output as default / system output, and then encode from the virtual input into the compressed format and forward that to a physical optical output.
    In 10.8 “Mountain Lion” you can write these sorts of plug-ins as sandboxed user-space components, which is quite neat (but not well documented at the moment).
  • A normal application / menu extra that takes raw sound from the virtual sound input, passes that to the AC-3 audio encoder, and then forwards the resulting stream to a physical digital output port.

The encoder seems to work; I’m currently working on the driver and then comes the user-space connector / configuration application.

Fun times! 😀

How-To: Headless transmission-daemon on OS X

As MacPorts is rather unhappy with Xcode 4.3 (understandably, with all those changed paths), I invested a fair amount of effort to get it recompile rTorrent (which I’d been running in a screen-session on my Mac mini). I got it work (xcode-select + setting the Developer-folder in /opt/local/etc/macports.conf to either “/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain” or “/”), but while searching around, I also came across Transmission‘s headless daemon and web-interface.

So, here’s how I built and configured the headless daemon on OS X (with Xcode 4.3):

  1. Get the source-package, e.g. transmission-2.50.tar.bz2
  2. Copy the source of libevent2 into “third-party/libevent” (“mv ../libevent-2.0.17-stable third-party/libevent” inside the Transmission-directory).
  3. Build via “xcodebuild -project Transmission.xcodeproj -target transmission-daemon -configuration Release”.
  4. Run the daemon so it creates its initial config in “~/Library/Application Support/transmission-daemon”.
  5. Edit the configuration in settings.json (whitelist, watchdir, ports, speeds, …).
  6. If you want to use the web-interface, copy its files: “cp -R web ~/Library/Application Support/transmission-daemon/”
  7. Re-start the daemon.

This worked well for me and I’m quite impressed with both the web-interface and Transmission itself.

Obituary (WoW addon, Patch 4.2 compatible)

Here’s a another version of Obituary (which I have labelled 1.0.6) updated to work with World of Warcraft Patch 4.2 (“Firelands”) from Timewasted’s version on WoWInterface. It is not the same as the addon of the same name found on Curse, but they are rather similar (and might stem from the same source).
This one has more options, for example detailed reports in pop-up windows, and more configuration for the output.

Obituary (WoW addon, Patch 4.1 compatible)

Here’s a version of Obituary (which I have labelled 1.0.5) updated to work with World of Warcraft Patch 4.1 from Timewasted’s version on WoWInterface. It is not the same as the addon of the same name found on Curse, but they are rather similar (and might stem from the same source).
This one has more options, for example detailed reports in pop-up windows, and more configuration for the output.

Dear iPhone Developer

I’m sure all your existing customers really appreciate the incremental upgrades and new features you’ve integrated into your app over time. What started out as a simple thing is now a veritable feature-fortress.
But please, keep in mind the new-user-experience, for dudes like me who discovered your app 6 months later and who didn’t scrutinize the change-log from upgrade to upgrade and have no clue what the “Smooth” option in the menu actually does.
Go back to your introductory user experience / tutorial and make sure it actually does cover all the cool stuff you added in v1.1 – v1.3.1 instead of being eternally stuck at v1.0. Discoverability and help / documentation is a big deal for every release, even if it is at times difficult to have to ask Art Guy to come up with a new design instead of simply shoving a new, tiny, undocumented button into that free space on the bottom-right corner.

Sincerely, me.