{{ message }}
Repository navigation
Conversation
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.

Digital monitor outputs such as the Samsung Smart M80F can expose no writable CoreAudio volume and ignore DDC volume commands: the OSD moves, but the sound stays unchanged. This adds an opt-in software-volume fallback for the selected monitor output on macOS 15+, using a device-scoped CoreAudio process tap and a private aggregate device. It attenuates the audio signal, not the monitor’s internal volume.
The existing slider and multimedia volume/mute keys share one state and the existing OSD. Duplicate press notifications observed 2–4 ms apart are coalesced within 20 ms, so mute does not immediately toggle back and volume does not advance twice. Volume repeat and fine adjustment are preserved. The backend pauses on another output, releases resources on quit/sleep, and uses an idle-aware progress watchdog with bounded recovery.
The change is disabled by default, explains audio capture before opt-in, and is availability-gated without raising the existing deployment target. Brightness, slider layout, signing, application version and updater behavior are retained. No Logitech-specific reader, key remapping, driver or companion app is added. Vendored CoreAudioTapKit is MIT-licensed; its attribution and pinned revision are included in source and app resources. See implementation and testing notes.
Validation
bash Tests/run-software-audio-tests.sh: gain bounds/NaN, stereo ramp to silence, duplicate media events, mute repeat, output matching, watchdog idle/stall/recovery.Related discussion: #1077, particularly #1077 (comment) . This PR offers a concrete implementation for maintainer review; architecture and broader support can be refined together.
Playback-key compatibility update
The dedicated volume interceptor now uses
cgSessionEventTapinstead ofcgAnnotatedSessionEventTap. In the local Samsung prototype, this restored Spotify previous/next/play-pause keys while retaining software volume and mute; the user confirmed playback keys and volume worked together. Playback events are passed through unchanged, without Spotify-specific handling or key remapping. The cleaned PR integration was rebuilt for Apple Silicon and the software-audio test suite passed; the physical confirmation applies to the local prototype. Existing OSD and brightness behavior in this PR remain unchanged.