2 Commits

Author SHA1 Message Date
bl 080b9c46d6 chore: Release cnats version 0.2.4
Release / build (x86_64, ubuntu-latest) (push) Successful in 7m14s
Release / docker (push) Successful in 4m32s
Release / build (aarch64, aarch64) (push) Successful in 14m2s
Release / update-aur (push) Successful in 10s
2026-07-30 15:06:52 +02:00
bl 3807294333 Fix mic feedback in solo calls: force .muted on the local preview tile
Every video tile is built client-side via document.createElement, never
parsed from HTML - browsers only seed the live .muted property from the
muted attribute for parser-inserted elements, so the attribute alone
never actually silenced the local preview. Result: your own mic played
back through your own speakers even with no other peers in the call.
Now sets el.set_muted(true) directly whenever the preview's srcObject
is (re)assigned.
2026-07-30 15:06:14 +02:00
4 changed files with 13 additions and 3 deletions
Generated
+1 -1
View File
@@ -345,7 +345,7 @@ dependencies = [
[[package]]
name = "cnats"
version = "0.2.3"
version = "0.2.4"
dependencies = [
"anyhow",
"async-nats",
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "cnats"
version = "0.2.3"
version = "0.2.4"
edition = "2021"
[lib]
+1 -1
View File
@@ -1,6 +1,6 @@
# Maintainer: Bendik Aagaard Lynghaug <bendik.lynghaug@gmail.com>
pkgname=cnats
pkgver=0.2.3
pkgver=0.2.4
pkgrel=1
pkgdesc="Web chat over NATS subjects with Kanidm SSO (Leptos SSR)"
arch=('x86_64' 'aarch64')
+10
View File
@@ -450,9 +450,19 @@ fn CallPanel(room: Memo<String>, me: String) -> impl IntoView {
// Mirror the local MediaStream into the preview <video> element -
// `srcObject` has no HTML attribute form, has to be set via JS.
//
// Also force `.muted` via the JS property here, not just the
// `muted` attribute on the element below: every video tile in this
// app is built client-side via `document.createElement` (never
// parsed from HTML), and browsers only seed the live `.muted`
// property from the `muted` *attribute* for parser-inserted
// elements. Without this, the local preview plays back the user's
// own mic through their speakers - audible as feedback in a
// solo call.
Effect::new(move |_| {
let stream = call_state.get_value().local_stream().get();
if let Some(el) = local_video_ref.get() {
el.set_muted(true);
el.set_src_object(stream.as_ref());
}
});