尚未检测到更新。GitHub 发布版本后会显示在这里。
macOS menu bar app that keeps powered speakers out of auto-standby with a near-inaudible tone. Profile-based, scheduled.
翻译准备中
正在加载完整 README。
查看完整 README ↗A small macOS menu bar app that stops powered speakers from dropping into standby when the Mac goes quiet. It plays a short, near-inaudible tone every few minutes, on a schedule you choose. Each speaker model gets its own profile.
Website: https://edmuk.github.io/mac_audio_keep_alive/
Since 9 May 2025, EU Regulation 2023/826 has required a wide range of household electronics, speakers included, to switch to a low-power mode after no more than 20 minutes without use. Powered speakers decide "unused" by watching the level of the incoming signal. The Mac isn't switching anything off.
For example, the Majority D70X manual (p.8) says:
If there is no activity/signal received from a connected device for up to 19 minutes, then the speakers will automatically switch to Standby Mode to save energy (ERP 2 standard). If the volume level of the audio source … is set to minimum, the D70X might recognise this as 'No Audio Signal'.
Three things follow from this:
The Mac side matters less. macOS doesn't power down USB or optical ports. When nothing is playing, though, CoreAudio stops sending audio to the device. On a digital link this can clip the first moment of sound while the speaker re-locks. Profiles can keep the stream open between tones to avoid that.
~/Library/Logs/SpeakerKeepAlive/events.log. If your speakers go off, note the time and check the log to see whether the link dropped then.Profiles/*.json). You can duplicate and tune them, create your own, import and export JSON, and submit a profile on GitHub from inside the app.The tone never keeps your Mac awake. Normally any running audio output stops macOS idle-sleeping, but the app opts out of that (kAudioHardwarePropertySleepingIsAllowed). When the Mac sleeps, the speakers follow it into standby.
Requires macOS 15 or later. Building needs Xcode 16 or later and XcodeGen (brew install xcodegen).
make run # generate the project, build Debug, launch
make test # unit tests (schedule, profiles, tone generator)
make release # build Release into build/DerivedData/Build/Products/Release/
make install # build Release, copy to /Applications and launch it
Run the app from /Applications (make install), not from the build folder. If the build folder is on an external drive that disconnects, for example when the Mac sleeps, the running app crashes. Then turn on Launch at login in Settings. The build is ad-hoc signed for local use. If you download a build someone else made, you may need to right-click › Open the first time.
On first launch the app picks an output whose name looks digital ("SPDIF", "Optical"…). You can change it in Settings › General.
The menu bar icon is a pair of bookshelf speakers: filled while it's keeping the speakers awake, outlined outside active hours, when paused or when off, and a single speaker with a warning badge if the output device is missing or audio couldn't start.
Can't see the menu bar icon? A crowded menu bar can hide it. Open the app again from Finder or Spotlight and Settings opens. In recent macOS versions you can also allow the icon under System Settings › Menu Bar.
Avoid high levels at infrasonic frequencies. The tone is meant to sit just above the speaker's detection threshold, not drive the woofer.
{
"schemaVersion": 1,
"id": "majority-d70x",
"name": "Majority D70X",
"manufacturer": "Majority",
"model": "D70X",
"connection": "optical",
"standbyTimeoutMinutes": 19,
"tone": {
"frequencyHz": 18,
"levelDBFS": -50,
"burstSeconds": 3,
"intervalSeconds": 300,
"fadeMilliseconds": 50
},
"keepStreamOpen": true,
"notes": "…",
"sourceURL": "https://…",
"tested": false
}
connection is one of optical, usb, hdmi, analog, bluetooth or other.tested means someone has confirmed the profile keeps that speaker awake.~/Library/Application Support/SpeakerKeepAlive/Profiles/, one file per profile.Got a profile that works? In Settings › Profiles, choose Share › Submit on GitHub…. This opens a pre-filled issue with your profile's JSON. Tested profiles get added to Profiles/ and built into the app.
Pull requests are welcome too. Add the JSON to Profiles/ and run make test, which checks that every built-in profile is valid and formatted exactly as the app exports it.
| Path | What |
|---|---|
Sources/KeepAliveCore/ | Framework with no UI: profiles and validation, schedule logic, the real-time tone generator |
Sources/SpeakerKeepAlive/ | The menu bar app: CoreAudio device handling, the audio engine, coordination, SwiftUI views |
Tests/KeepAliveCoreTests/ | Swift Testing suites for the core |
Profiles/ | Built-in speaker profiles, bundled into the app |
docs/ | GitHub Pages site |
MIT © 2026 Ed Morley