Repository navigation
feat: per-app output routing with per-device volume - #18
Merged
Merged
Conversation
Drag one or more output devices onto an app to pin its audio there while the rest of the system stays on the default output. A pinned device leaves the picker — it is owned by that app — and each pinned device carries its own volume slider, so one app can play to several outputs at independent levels. - AppVolume stores a clock-first UID list; a custom decoder folds the legacy single-UID blob in so saved settings survive the upgrade. - The tap aggregate fans out to every present pin (stacked, drift- compensated, IO proc proven to fire); a routed tap renders transparent and each device's own VirtualMainVolume is the volume, one DeviceVolumeController apiece. - An absent pin drops out and re-applies on return; reconcile rebuilds only the taps whose device set moved. - A routed app row swaps its master slider for an accent card of per-device rows; a grab pointer marks draggable device rows, the app list gains an APPS label, and routed-but-silent rows stay legible.
Carry the per-app output feature into the marketing surfaces: a README line and a site prose section, plus a working popover mockup. Drag a device onto an app to pin it; several devices stack into an accent card with a volume slider each, and a pinned device leaves the picker. The routed-app rows mirror the real popover.
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.
Summary
Drag one or more output devices onto an app to pin its audio to them; the rest of the system stays on the default output. Each pinned device carries its own volume slider, so one app can play to several outputs at independent levels. A pinned device leaves the output picker — it is owned by that app.
The per-app tap aggregate fans out to every present pin (stacked, drift-compensated). The IO proc was confirmed live to fire on a multi-sub-device tap aggregate, with HAL mirroring the stream, so the gain render is unchanged. A routed tap renders transparent and each device's own VirtualMainVolume is the volume — one DeviceVolumeController apiece, the same control multi-output members use. An absent pin drops out and re-applies when the device returns.
AppVolumenow stores a clock-first UID list; a custom decoder folds the legacy single-UID blob in so saved settings survive the upgrade. A routed app row swaps its master slider for an accent card of per-device rows.The site popover mockup and README mirror the feature.
Test plan
make buildandmake testpass; the volume store round-trip and legacy single-UID decode are unit-tested.