commit cdb30c2657d8c3ab69fb0aa9fde56b99fc53892d
parent 9b077485e5d0c729630a3c63dbff85601bf7da1c
Author: SageAzakaela <106701693+SageAzakaela@users.noreply.github.com>
Date: Sat, 21 Feb 2026 17:06:01 -0700
update to streaming -- allow audio during screenshare and webcam
Diffstat:
| M | public/app.js | | | 49 | +++++++++++++++++++++++++++++++++++++++++++++++++ |
1 file changed, 49 insertions(+), 0 deletions(-)
diff --git a/public/app.js b/public/app.js
@@ -8951,6 +8951,51 @@ async function handleStreamViewerJoinMessage(msg) {
}
}
+async function tryGetMicrophoneTrack() {
+ if (!navigator.mediaDevices || typeof navigator.mediaDevices.getUserMedia !== "function") return null;
+ try {
+ const micStream = await navigator.mediaDevices.getUserMedia({ audio: true, video: false });
+ const track = micStream.getAudioTracks()[0] || null;
+ if (!track) {
+ try {
+ for (const t of micStream.getTracks()) t.stop();
+ } catch {}
+ return null;
+ }
+ track.addEventListener(
+ "ended",
+ () => {
+ try {
+ for (const t of micStream.getTracks()) {
+ if (t.id !== track.id) t.stop();
+ }
+ } catch {}
+ },
+ { once: true }
+ );
+ return track;
+ } catch {
+ return null;
+ }
+}
+
+async function ensureStreamAudioForKind(media, kind) {
+ if (!media) return media;
+ const audioTracks = media.getAudioTracks();
+ const hasAudio = audioTracks.length > 0;
+ if (kind === "audio" || kind === "webcam") {
+ if (hasAudio) return media;
+ const micTrack = await tryGetMicrophoneTrack();
+ if (micTrack) media.addTrack(micTrack);
+ return media;
+ }
+ if (kind === "screen") {
+ const micTrack = await tryGetMicrophoneTrack();
+ if (micTrack && !hasAudio) media.addTrack(micTrack);
+ }
+ return media;
+}
+
async function startStreamHost(post) {
if (!post || !isStreamPost(post)) return;
if (!streamEnabled) {
@@ -8977,6 +9022,10 @@ async function startStreamHost(post) {
media = await navigator.mediaDevices.getUserMedia({ audio: true, video: true });
}
if (!media) throw new Error("No stream media available.");
+ media = await ensureStreamAudioForKind(media, kind);
+ if (!media.getAudioTracks().length) {
+ throw new Error("No audio track available. Allow microphone access to go live with sound.");
+ }
leaveActiveStream(false);
streamCurrentPostId = String(post.id || "");