Macrowave v1.1 for macOS

loading views

Mac App Store

A few days after we released version 1.0 on the Mac App Store, we got featured on the 'Discover' page, which brought tens of millions of impressions and a flood of new users. At that moment, I was in Germany preparing my brother's wedding and didn't have the opportunity to work on the issues all the new users were reporting. And there were plenty.

The most annoying issue for most was that when using Macrowave, the system would automatically lower the system volume on Macs (a behavior called ducking), making it less fun to share what you are listening to because it would worsen your own listening experience. Another issue occurred when people were accessing their Macs remotely and started a broadcast. MacOS would crash our app because it also used the screen sharing API to get system audio.

Our Vision

When Neco and I started to work on Macrowave we had a strong vision of how the macOS app should look and feel. While other internet radio setups require technical skills to configure and set up an Icecast server or similar, we wanted to have a solution that provides everything out of the box to get started. It should be a simple app that everyone could use, with a single button to go on air, and once activated, it would just fade into the background and do its thing without impairing your Mac's performance.

We were unable to execute that vision in the way we wanted to because of some initial limitations of our upstream provider, LiveKit. Eventually we reached out and asked them for help. They came through a couple of weeks after the launch and updated their SDK for us.

New Engine

With all the required pieces in place, I got to work in early October and started to rewrite our audio engine from scratch. Instead of having to rely on LiveKit's SDK to get system audio via the screen recording API and use their sub-optimal implementation to get audio from a microphone, we were free to build what we needed.

It was the first time I worked directly with audio frameworks on macOS, so it took a while, and I learned a lot.

A screenshot of the Kinopio Space showing the new audio engine graph

To get system audio, we now use Core Audio Taps, which means we can tap into audio from specific apps directly without having to ask to record parts of the screen, which felt invasive and unnecessary. This comes with an added performance benefit, as the video part of the recording was always dismissed.

The resulting engine doesn't require screen recording permissions, consumes fewer resources, and allows to have multiple app audio sources. Additionally, we now have more fine-grained control over each audio input, which, for example, means that in a future update you will be able to control the input volume for each connected microphone and app separately.

A screenshot of the macOS Activity Monitor showing that Macrowave only uses ~60% CPU and 78.5 MB memory

Minor Improvements

In addition to the audio engine, we also improved some smaller aspects around the app. We got rid of the flipping animation when switching between broadcaster and receiver that didn't really work on macOS Tahoe and replaced it with a sliding animation. This comes with the added benefit that we were able to add the window border and shadow users were missing.

We also added a minimal troubleshooting screen to help users fix their permissions in case they accidentally disabled the microphone or audio recording permission.

You can find the full list of changes in our Kinopio Space.

Demo

As an experiment, I recorded a quick video showcasing the benefits of the new audio engine. I can see myself doing this more often if this is something you like. So please reach out to me.

Discord

Because of the increasing amount of broadcasters and users that ask for stations they can listen to we created a discord community that you can join here:

Join Discord →