feat(audio): 0-150% volume boost + audio output-device picker#67
Merged
Conversation
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route the browser <video> audio through AudioContext→MediaElementSource→Gain so the slider can exceed 100%. GainNode is the sole browser volume authority; the context resumes on the play/unmute gesture. Native path unchanged. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Route stream audio to a chosen output via AudioContext.setSinkId; pick with the native selectAudioOutput() picker (enumerate fallback). Row self-hides where setSinkId is unsupported. Isolated + revertable without the boost. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The Immersive toggle swaps the <video> element; attach() re-taps the new element but the context wasn't explicitly resumed on the new graph. Resume after re-attach so audio never waits on autoplay luck. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
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.
Audio-first 1.1 backlog #4b. Browser/Windows path (native unchanged).
What
GainNode. A purepctToGainhelper (unit-tested) maps percent→gain;streamAudio(a graph singleton) is the browser volume authority, with avideo.volumefallback so the 0-100% slider is never inert even if the graph can't build. Native path unchanged (its sink already clamps to [0, 2.0], so boost is free there too).AudioContext.setSinkId(nativeselectAudioOutputpicker, enumerate fallback). The row self-hides wheresetSinkIdis unsupported; boost still works. Isolated in its own commit.How it was built
Spec → plan → subagent-driven development: fresh implementer per task + two-stage review each, then a whole-branch review (all on the capable tier for the Web Audio task). Plan was hardened up-front by a 13-agent adversarial review (caught the degradation-fallback gap before any code). Whole-branch review found 2 Important items — both fixed (explicit context
resume()on focus-swap; audio-only smoke coverage). 9 Minors triaged defer.Gates:
check0/0 ·vitest381 ·build✓. 4 commits.Owner smoke (WebView2)
setSinkId, the row is absent + boost still works.🤖 Generated with Claude Code