feat(calls): change noise suppression mid-call without rejoining #485

Merged
jared merged 1 commits from feat/live-denoise-switch into lotus 2026-10-30 21:40:26 -04:00
Owner

Changes to these settings now apply to the call you're already in, with no rejoin:

  • Settings → Calls → Noise suppression (off, browser-native or ML)
  • the ML model
  • the gate
  • "stack browser NS"

How

  • useCallDenoise sends the fork's new io.lotus.set_denoise whenever those settings change.
  • CallControl.setDenoise() is join-gated like setQuality(), and it is re-sent in resendForkState() after an EC reconnect, because the remounted fork handler starts again from the join URL.
  • "Note: Applying changes requires rejoining the call." becomes "Changes apply straight away, even during a call."

Element Call 0.28.0-lotus.4

This bumps to LotusGuild/element-call#66, which adds io.lotus.set_denoise and fixes:

  • mic re-captures silently keeping the old noiseSuppression, because the level meter's clone held the original track open and Chrome shares processing per device;
  • the level meter and muted-speech nudge following the old device after a mic switch;
  • voiceIsolation (LiveKit's default) staying on in off and ML modes.

Verified

  • tsc and lint are clean, and the new callDenoise tests pass.
  • Two-browser call against this build: switching DTLN → DeepFilterNet → RNNoise → browser → off mid-call applied each step within about 0.5 s, and each mic re-capture got exactly the constraints it asked for.

🤖 Generated with Claude Code

https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5

Changes to these settings now apply to the call you're already in, with no rejoin: - Settings → Calls → Noise suppression (off, browser-native or ML) - the ML model - the gate - "stack browser NS" ## How - `useCallDenoise` sends the fork's new `io.lotus.set_denoise` whenever those settings change. - `CallControl.setDenoise()` is join-gated like `setQuality()`, and it is re-sent in `resendForkState()` after an EC reconnect, because the remounted fork handler starts again from the join URL. - "Note: Applying changes requires rejoining the call." becomes "Changes apply straight away, even during a call." ## Element Call 0.28.0-lotus.4 This bumps to LotusGuild/element-call#66, which adds `io.lotus.set_denoise` and fixes: - mic re-captures silently keeping the **old** `noiseSuppression`, because the level meter's clone held the original track open and Chrome shares processing per device; - the level meter and muted-speech nudge following the old device after a mic switch; - `voiceIsolation` (LiveKit's default) staying on in off and ML modes. ## Verified - `tsc` and lint are clean, and the new `callDenoise` tests pass. - Two-browser call against this build: switching DTLN → DeepFilterNet → RNNoise → browser → off mid-call applied each step within about 0.5 s, and each mic re-capture got exactly the constraints it asked for. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared added 1 commit 2026-10-30 21:20:12 -04:00
feat(calls): change noise suppression mid-call without rejoining
CI / Build & Quality Checks (push) Skipped
CI / Secret scan (gitleaks) (push) Skipped
CI / Playwright smoke (e2e) (push) Skipped
CI / Secret scan (gitleaks) (pull_request) Successful in 2m5s
CI / Build & Quality Checks (pull_request) Successful in 3m1s
CI / Trigger Desktop Build (pull_request) Skipped
CI / Docker image build & smoke test (pull_request) Skipped
CI / Playwright smoke (e2e) (pull_request) Successful in 17m2s
504899aa14
Changing Noise suppression (off / browser-native / ML), the ML model, the
gate or "stack browser NS" in Settings now applies to the call you're in.
useCallDenoise sends the fork's io.lotus.set_denoise whenever those
settings change; CallControl join-gates it like set_quality and re-sends
it after an EC reconnect (the remounted fork handler starts again from
the join URL). The "requires rejoining the call" note is replaced.

Bumps Element Call to 0.28.0-lotus.4, which adds io.lotus.set_denoise and
fixes mic re-captures silently keeping the old noiseSuppression (the mic
level meter's clone held the old track open), the meter following the
old device after a mic switch, and voiceIsolation staying on in off/ML
modes (element-call#66).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017PCb59uY3UKqDqt7B6hzd5
jared scheduled this pull request to auto merge when all checks succeed 2026-10-30 21:20:29 -04:00
jared merged commit c73a3f8b31 into lotus 2026-10-30 21:40:26 -04:00
jared deleted branch feat/live-denoise-switch 2026-10-30 21:40:26 -04:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: LotusGuild/cinny#485