Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
897552c
feat(audio): add RNNoise processor and publisher wiring
LucaPisl Mar 2, 2026
222bda8
feat(settings): add RNNoise audio toggle and translations
LucaPisl Mar 2, 2026
60f2396
test(audio): add RNNoise processor and publisher coverage
LucaPisl Mar 2, 2026
9045d23
feat(audio): add configurable RNNoise suppression presets
LucaPisl Mar 2, 2026
e54d142
fix(audio): serialize RNNoise toggle restart and processor sync
LucaPisl Mar 2, 2026
be0380b
fix(audio): bypass RNNoise on non-48kHz sample rates
LucaPisl Mar 3, 2026
9755519
test(audio): cover RNNoise worklet load failure fallback
LucaPisl Mar 3, 2026
68c1b48
test(settings): add RNNoise SettingsModal coverage
LucaPisl Mar 3, 2026
dfae961
test(audio): specify and validate RNNoise downmix policy
LucaPisl Mar 3, 2026
ebf2cbb
test(playwright): add RNNoise rejoin stability coverage
LucaPisl Mar 3, 2026
2044d95
fix(audio): fail open to native suppression when RNNoise unsupported
LucaPisl Mar 3, 2026
1eec02a
test(playwright): avoid hidden RNNoise input visibility assertions
LucaPisl Mar 3, 2026
d41535e
test(playwright): add RNNoise device-switch stability coverage
LucaPisl Mar 3, 2026
9140b5f
audio: make strong RNNoise suppression more aggressive
LucaPisl Mar 3, 2026
61c9cf3
test(audio): add regression for publisher policy after RNNoise toggle
LucaPisl Mar 3, 2026
c0b150e
fix(audio): sync native suppression policy on publisher creation
LucaPisl Mar 3, 2026
7e25641
test(audio): assert RNNoiseProcessor stops processed track on destroy
LucaPisl Mar 3, 2026
db9c568
fix(audio): stop processed track on destroy
LucaPisl Mar 3, 2026
f9d2e5a
test(audio): cover stricter RNNoise support preflight and settings ga…
LucaPisl Mar 3, 2026
4519936
fix(audio): strengthen RNNoise support preflight checks
LucaPisl Mar 3, 2026
16550cb
test(audio): make AudioWorklet stubs async for lint
LucaPisl Mar 3, 2026
9556fdf
test(audio): satisfy require-await in AudioWorklet stubs
LucaPisl Mar 3, 2026
db68ce7
fix(audio): stabilize RNNoise worklet module loading
LucaPisl Mar 3, 2026
e7dd751
test(playwright): validate RNNoise device-switch stability in automation
LucaPisl Mar 3, 2026
c81e63f
chore: add THIRD_PARTY_NOTICES for rnnoise BSD attribution
LucaPisl Mar 3, 2026
c1f18d8
fix(audio): address RNNoise implementation audit findings
LucaPisl Mar 3, 2026
1b7877a
fix(audio): mark ensureWorkletRegistered as async for lint compliance
LucaPisl Mar 3, 2026
1395b2f
merge in rnnoise
melogale Mar 17, 2026
66feb02
fix
melogale Mar 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions THIRD_PARTY_NOTICES
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
This file reproduces copyright notices and license terms for third-party
software components that are compiled into Element Call's distributed bundle
and carry obligations to reproduce their notices in binary distributions.

-------------------------------------------------------------------------------

rnnoise — Recurrent neural network for audio noise reduction
Compiled to WebAssembly and bundled via @jitsi/rnnoise-wasm
https://github.com/xiph/rnnoise

Copyright (c) 2017, Mozilla
Copyright (c) 2007-2017, Jean-Marc Valin
Copyright (c) 2005-2017, Xiph.Org Foundation
Copyright (c) 2003-2004, Mark Borgerding

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

- Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.

- Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.

- Neither the name of the Xiph.Org Foundation nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION
OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

-------------------------------------------------------------------------------

@jitsi/rnnoise-wasm — WebAssembly build and JS wrapper for rnnoise
https://github.com/jitsi/rnnoise-wasm

Copyright (c) 2013 ESTOS GmbH
Copyright (c) 2013 BlueJimp SARL

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
10 changes: 9 additions & 1 deletion locales/en/app.json
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,14 @@
"audio_processing_header": "Audio processing",
"audio_tab": {
"effect_volume_description": "Adjust the volume at which reactions and hand raised effects play.",
"effect_volume_label": "Sound effect volume"
"effect_volume_label": "Sound effect volume",
"rnnoise_header": "Noise suppression",
"rnnoise_label": "Enable enhanced noise suppression (RNNoise)",
"rnnoise_not_supported": "(Enhanced noise suppression is not supported by this browser.)",
"rnnoise_preset_balanced": "Balanced",
"rnnoise_preset_conservative": "Conservative",
"rnnoise_preset_description": "Pick a suppression profile. Stronger modes remove more keyboard noise but can sound more processed.",
"rnnoise_preset_strong": "Strong"
},
"auto_gain_control_label": "Automatic gain control",
"background_blur_header": "Background",
Expand Down Expand Up @@ -235,6 +242,7 @@
"feedback_tab_title": "Feedback",
"framerate_label": "Framerate",
"noise_suppression_label": "Noise suppression",
"noise_suppression_rnnoise_override": "Overridden by RNNoise.",
"opt_in_description": "<0></0><1></1>You may withdraw consent by unchecking this box. If you are currently in a call, this setting will take effect at the end of the call.",
"preferences_tab": {
"developer_mode_label": "Developer mode",
Expand Down
5 changes: 4 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -145,5 +145,8 @@
"qs": "^6.14.1",
"js-yaml": "^4.1.1"
},
"packageManager": "yarn@4.7.0"
"packageManager": "yarn@4.7.0",
"dependencies": {
"@jitsi/rnnoise-wasm": "0.2.1"
}
}
40 changes: 30 additions & 10 deletions playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,32 @@ import { defineConfig, devices } from "@playwright/test";
const baseURL = process.env.USE_DOCKER
? "http://localhost:8080"
: "https://localhost:3000";
const fakeAudioCaptureFile = process.env.PLAYWRIGHT_FAKE_AUDIO_CAPTURE_FILE;
const fakeVideoCaptureFile = process.env.PLAYWRIGHT_FAKE_VIDEO_CAPTURE_FILE;
const disableChromiumSandbox =
process.env.PLAYWRIGHT_DISABLE_CHROMIUM_SANDBOX === "1";

function buildFakeMediaArgs(): string[] {
const args = [
"--use-fake-ui-for-media-stream",
"--use-fake-device-for-media-stream",
"--mute-audio",
];

if (fakeAudioCaptureFile) {
args.push(`--use-file-for-fake-audio-capture=${fakeAudioCaptureFile}`);
}
if (fakeVideoCaptureFile) {
args.push(`--use-file-for-fake-video-capture=${fakeVideoCaptureFile}`);
}

return args;
}

const fakeMediaArgs = buildFakeMediaArgs();
const chromiumLaunchArgs = disableChromiumSandbox
? [...fakeMediaArgs, "--no-sandbox", "--disable-setuid-sandbox"]
: fakeMediaArgs;

/**
* See https://playwright.dev/docs/test-configuration.
Expand Down Expand Up @@ -49,12 +75,9 @@ export default defineConfig({
"camera",
],
ignoreHTTPSErrors: true,
chromiumSandbox: !disableChromiumSandbox,
launchOptions: {
args: [
"--use-fake-ui-for-media-stream",
"--use-fake-device-for-media-stream",
"--mute-audio",
],
args: chromiumLaunchArgs,
},
},
},
Expand Down Expand Up @@ -84,12 +107,9 @@ export default defineConfig({
"microphone",
"camera",
],
chromiumSandbox: !disableChromiumSandbox,
launchOptions: {
args: [
"--use-fake-ui-for-media-stream",
"--use-fake-device-for-media-stream",
"--mute-audio",
],
args: chromiumLaunchArgs,
},
},
},
Expand Down
Loading
Loading