From d372a6d165bbc976f1ec1a7ce99c05c3a012cf2e Mon Sep 17 00:00:00 2001 From: creations Date: Wed, 24 Dec 2025 09:24:32 -0500 Subject: [PATCH] fix virtual camera support (#1215) Co-authored-by: V --- ...oGainToggle.ts => fixStreamConstraints.ts} | 39 +++++++++++++------ 1 file changed, 27 insertions(+), 12 deletions(-) rename src/renderer/patches/{fixAutoGainToggle.ts => fixStreamConstraints.ts} (53%) diff --git a/src/renderer/patches/fixAutoGainToggle.ts b/src/renderer/patches/fixStreamConstraints.ts similarity index 53% rename from src/renderer/patches/fixAutoGainToggle.ts rename to src/renderer/patches/fixStreamConstraints.ts index e23c737..3f03246 100644 --- a/src/renderer/patches/fixAutoGainToggle.ts +++ b/src/renderer/patches/fixStreamConstraints.ts @@ -7,33 +7,45 @@ import { Logger } from "@vencord/types/utils"; import { MediaEngineStore } from "renderer/common"; -const logger = new Logger("FixAutoGain"); +const logger = new Logger("VesktopStreamFixes"); -function fixTrackConstraints(constraint: MediaTrackConstraints) { +function fixAudioTrackConstraints(constraint: MediaTrackConstraints) { const target = constraint.advanced?.find(opt => Object.hasOwn(opt, "autoGainControl")) ?? constraint; target.autoGainControl = MediaEngineStore.getAutomaticGainControl(); } -function fixStreamConstraints(constraints: MediaStreamConstraints | undefined) { - if (!constraints?.audio) return; +function fixVideoTrackConstraints(constraint: MediaTrackConstraints) { + if (typeof constraint.deviceId === "string" && constraint.deviceId !== "default") { + constraint.deviceId = { exact: constraint.deviceId }; + } +} - if (typeof constraints.audio !== "object") { - constraints.audio = {}; +function fixStreamConstraints(constraints: MediaStreamConstraints | undefined) { + if (!constraints) return; + + if (constraints.audio) { + if (typeof constraints.audio !== "object") { + constraints.audio = {}; + } + fixAudioTrackConstraints(constraints.audio); } - fixTrackConstraints(constraints.audio); + if (constraints.video) { + if (typeof constraints.video !== "object") { + constraints.video = {}; + } + fixVideoTrackConstraints(constraints.video); + } } const originalGetUserMedia = navigator.mediaDevices.getUserMedia; navigator.mediaDevices.getUserMedia = function (constraints) { try { fixStreamConstraints(constraints); - logger.debug("Fixed getUserMedia constraints", constraints); } catch (e) { logger.error("Failed to fix getUserMedia constraints", e); } - return originalGetUserMedia.call(this, constraints); }; @@ -41,10 +53,13 @@ const originalApplyConstraints = MediaStreamTrack.prototype.applyConstraints; MediaStreamTrack.prototype.applyConstraints = function (constraints) { if (constraints) { try { - fixTrackConstraints(constraints); - logger.debug("Fixed applyConstraints constraints", constraints); + if (this.kind === "audio") { + fixAudioTrackConstraints(constraints); + } else if (this.kind === "video") { + fixVideoTrackConstraints(constraints); + } } catch (e) { - logger.error("Failed to fix applyConstraints constraints", e); + logger.error("Failed to fix constraints", e); } } return originalApplyConstraints.call(this, constraints);