Automatic sample-rate switching for Mac music players, so your DAC follows every track and lossless plays bit-perfect.
It works with Apple Music and Tidal, adds a volume stage for DACs that ignore the Mac’s volume, and has a headphone EQ you switch on per output device.
Why
macOS runs each output device at one sample rate and resamples everything else to it, so a 96 kHz track on a DAC left at 48 kHz plays as 48 kHz. Players work around this with an exclusive mode, but Tidal’s takes the whole device away from other apps, and on some setups drops audio or locks the volume. Hertzwise keeps exclusive mode off and switches the DAC’s rate to each track instead.
| Hertzwise | SyncHz | LosslessSwitcher | |
|---|---|---|---|
| Players | Apple Music, Tidal | Apple Music | Apple Music |
| Volume for DACs that ignore the Mac’s volume | Yes | No | No |
| Headphone EQ | Any app, per device | Apple Music | No |
| macOS | 15+ | 15+ | 11.4+ (2.0 beta for 15.4+) |
Status
| Player | Rate switching | Status |
|---|---|---|
| Apple Music | Yes | From SyncHz |
| Tidal (exclusive mode off) | Yes | New |
| YouTube Music | Planned | Later |
Per-device volume and EQ
Each output device’s submenu has two switches, on by default only for the Lotoo PAW S1:
- Control volume: for a DAC that accepts the Mac’s volume but ignores it. Hertzwise applies that volume to the samples; at full volume they reach the DAC unchanged.
- Equalizer: the headphone EQ processes everything playing to that device, from any app, while the EQ is on.
Both run in one muted process tap per device, so each device is processed once.
How it works
- Tidal: Core Audio logs the decoded track’s format from inside Tidal’s player to the unified log, in real time. Hertzwise reads it there, and reads Tidal’s own
player.logat start-up. It switches the device Tidal plays to, which can differ from the system output. - Apple Music: Music’s messages in the unified log, read through
log stream, the approach Hertzwise inherits from SyncHz. - A rate the DAC can’t play: the DAC plays the nearest rate it supports, and Hertzwise shows a notice instead of claiming the switch.
- Volume and EQ: a muted process tap per device, bound to the device’s clock, so nothing is resampled. At full volume with the EQ off, samples reach the DAC unchanged. Details: docs/audio-engine.md.
Install
- Download the latest
.dmgfrom Releases and drag Hertzwise into Applications. - It is not notarized, so clear the quarantine flag once:
xattr -dr com.apple.quarantine /Applications/Hertzwise.app
After that, Hertzwise updates itself: it checks daily and installs a new version from the panel’s menu, with no quarantine step and no new permission prompts.
Requires macOS 15 or later. Hertzwise can be installed next to SyncHz: settings, EQ profiles and permissions are separate.
Build from source
git clone --recursive https://github.com/zeetabit/Hertzwise.git
cd Hertzwise
open SampleRateSwitcher.xcodeproj
Needs Xcode 26 or later. In an existing clone, run git submodule update --init once.
How the audio path works, and why: docs/audio-engine.md. Releases, signing and the update keys: docs/releasing.md.
Updating the MediaRemote adapter
Track info and playback controls come from mediaremote-adapter, pinned as a submodule in Vendor/mediaremote-adapter. Updates are deliberate:
- Read the release notes of the new tag and the diff since the pinned one:
cd Vendor/mediaremote-adapter git fetch --tags git log --oneline HEAD..NEW_TAG git diff HEAD NEW_TAG -- src bin include CMakeLists.txt - Check the diff for anything a now-playing reader should not do (network, file writes, spawning processes) and for changes to the
streamandsendoutput the app parses. git checkout NEW_TAG, build, run the tests and check track info and playback controls with Tidal and Apple Music.- Commit the new pin from the repository root:
git add Vendor/mediaremote-adapter.
Acknowledgements
- SyncHz by Gary Kong, which Hertzwise is built on. Its README explains how rate detection and the EQ filters work.
- LosslessSwitcher by Vincent Neo, which SyncHz credits as its inspiration.
- mediaremote-adapter by Jonas van den Berg, BSD 3-Clause, for now-playing access on macOS 15.4 and later.
License
MIT. The original copyright notice is kept as the license requires.