Do You Hear That?

Uncategorized Jun 04, 2020

Shortly into quarantine at the beginning of March, I realized I had a problem. My iMac has too many audio devices, and managing them was becoming a pain in the ass. And it was all because working full-time at home again, in this new age of frequent work video meetings, Slack and Discord calls, and dealing with two young, screaming kids with no school to attend, created a perfect storm of audio requirements.

Prior to being stuck at home, I would take all of my standup and other phone calls in my car on the way to work and then handoff to my AirPods to wrap up. And because my coworkers are nice people and we all typically leave each other alone to get work done, I was happy to sit in my quiet office all day and do my thing.

I don’t typically listen to music at work, so my AirPods only got intermittent use throughout the day which worked great.

But I soon found that working at home posed two new problems:

  1. Way more phone calls and video meetings. I was on so many that my AirPods battery life was precariously low at times.
  2. My kids are insane noise monsters. And getting any kind of deep, focused work was nearly impossible without some sort of music playing in my ears. The AirPods ended up getting way more use than normal, and battery life really became a gating factor.

So, I bought a decent pair of noise cancelling, over-the-ear Bluetooth headphones that can also connect to my iMac with a wired audio cable. They’re awesome. The battery life is 40+ hours on a single charge, and they block out my kids so well that my wife gets mad at me because I can’t hear their actual screaming anymore.

But here’s the problem. My iMac now has:

  • Built-in speakers
  • Audio cable line-out
  • AirPods audio out
  • Noise cancelling headphones audio out

And also

  • Built-in microphone
  • AirPods audio in
  • Noise cancelling headphones audio in

But it’s actually slightly more complicated than that. I mentioned above that my new headphones can be wired-in in case their battery dies. That’s great! But, when wired, the microphone doesn’t work. It’s only available while wireless.

Also, if you’ve used combined Bluetooth input/output devices like AirPods before, you’ll know that when the microphone is active, there isn’t enough bandwidth to do high quality audio out at the same time. So when my AirPods are connected listening to music, and I take a call, the audio out degrades. That’s fine. But then when the call is over, my music starts playing again and sounds like crap until I manually switch my iMac’s audio input to another device.

Add to that my new work from home requirements where I frequently bounce between music, Slack calls, Discord video chats, RingCentral meetings, actual phone calls, etc. Basically, it just became incredibly annoying to keep digging into the Sound panel of System Preferences or option-clicking the volume icon in the menubar to make fiddly adjustments.

And, oh my god, don’t even get me started on the nightmare that is sharing AirPods between an iPhone and Mac that are within range of each other. (As a stupid joke, I very nearly bought and filled it with a giant YES just to put into this blog post.)

Anyway, all I wanted was a super-simple, fast audio input/output switcher app. I swear there used to be something out there that did this, but my googling failed me.

I already own SoundSource from the amazing (incredible?) software wizards over at Rogue Amoeba. (Seriously. Go buy it.) And while it will totally perform the audio adjustments I want and then some, it’s a mouse-required type of app. As readers of this blog will know, I’m a keyboard junkie. So if I’m going to be forced to use a mouse, I might as well just go ahead and use the native macOS volume menubar icon.

So I did what I always end up doing, and wrote the app I wanted for myself. It’s called Ears. And you can have it, too.

Ears for macOS app icon

The idea is simple. Press a hotkey and Ears opens. And still without touching a mouse, pick a new audio output or input (or both!) device, and be done. That’s it.

Here’s Ears in action.

In that video you can see me summon Ears with a hotkey, and then move up and down and between the two lists of input and output devices to select what I want, and then press return to dismiss. It’s that simple.

But it can be even faster than that. You don’t have to use the arrow keys to navigate up and down and between the lists. Your output devices are numbered 1 through 9. And your input devices are A through Z. Just type one of those keys and Ears will select each device.

So, if your global Ears hotkey is ^4 (that’s mine), then in this screenshot…

Ears audio device picker window

opening Ears and picking my headphones as output and internal iMac microphone as input is simply:

^4 3 a ↵

But, we can actually make it even faster than that. There’s a setting in Ears Preferences called “Change devices immediately”.

Ears Preferences window

If that’s enabled, then typing a device number/letter will instantly switch to it and dismiss the picker window. So, if I just want to switch to my headphones, my keystrokes become:

^4 3

Boom. Done. ?

Ok, but can we make it even easier still? You betcha.

This isn’t something I had initially planned to add into the app when I built it. My original goal was to make it purely a way to change audio devices. And so this extra feature was added just because it seemed to make sense – even though I feel bad about it because it treads so closely to the great work done in ToothFairy by Michael Tsai and AirBuddy by Guilherme Rambo. (I own both!)

If you enable Ears’s “Auto Connect” feature, you can mark Bluetooth audio devices as favorites. And then pressing the “Auto Connect” hotkey will instruct your Mac to search for a favorite device and attempt to connect.

Auto Connect is flexible, however. Your favorite input and output devices don’t have to be the same ones. You can set your AirPods as a favorite output device and auto connect to them, but your audio input can remain with whichever device was already selected. That way, your AirPods music won’t degrade in quality. You can set any combination of devices with any combination of inputs and outputs.

And, now, finally. One last incredibly nerdy feature of Ears that I’m hoping appeals to at least one other person than myself.

Ears is scriptable.

Both from the command line and via AppleScript.

> Ears --help
USAGE: ears [--input <input>] [--output <output>] [--list-outputs] [--list-inputs]

  -i, --input <input>     The audio input device to make current.
        The name must be an exact match.
  -o, --output <output>   The audio output device to make current.
        The name must be an exact match.
  --list-outputs          Show available output devices.
  --list-inputs           Show available input devices.
  -h, --help              Show help information.

> Ears --list-outputs
*Soundcore Life Q20
External Headphones
iMac Pro Speakers

> Ears --output "External Headphones"
> Ears --input "Tyler's AirPods"
tell application "Ears"
    set audio input "Soundcore Life Q20"
    set audio output "iMac Pro Speakers"
end tell

You can set your active audio devices and also query a list of available devices on the system and read which ones are active.

So that’s Ears. I built it to solve my own, dumb workflow problems and find it super useful every day. I hope you do, too.

Ears is completely free to use, but if you find the app helpful, I would love your support. You can make the nag screen that opens when the app launches go away forever with a one-time, pay-what-you-want purchase.