diff --git a/src/renderer/index.ts b/src/renderer/index.ts index e8ad31ca..db7b6a1f 100644 --- a/src/renderer/index.ts +++ b/src/renderer/index.ts @@ -60,6 +60,89 @@ VesktopNative.arrpc.onActivity(async data => { arRPC.handleEvent(new MessageEvent("message", { data })); }); +// Force disable automatic gain control +(function () { + function setLegacyChromeConstraint(constraint, name, value) { + if (constraint.mandatory && name in constraint.mandatory) { + constraint.mandatory[name] = value; + return; + } + if (constraint.optional) { + const element = constraint.optional.find(opt => name in opt); + if (element) { + element[name] = value; + return; + } + } + // `mandatory` options throw errors for unknown keys, so avoid that by + // setting it under optional. + if (!constraint.optional) { + constraint.optional = []; + } + constraint.optional.push({ [name]: value }); + } + + function setConstraint(constraint, name, value) { + if (constraint.advanced) { + const element = constraint.advanced.find(opt => name in opt); + if (element) { + element[name] = value; + return; + } + } + constraint[name] = value; + } + + function disableAutogain(constraints) { + console.log("Automatically unsetting gain!", constraints); + if (constraints && constraints.audio) { + if (typeof constraints.audio !== "object") { + constraints.audio = {}; + } + if (constraints.audio.optional || constraints.audio.mandatory) { + setLegacyChromeConstraint(constraints.audio, "googAutoGainControl", false); + setLegacyChromeConstraint(constraints.audio, "googAutoGainControl2", false); + } else { + setConstraint(constraints.audio, "autoGainControl", false); + } + } + } + + function patchFunction(object, name, createNewFunction) { + if (name in object) { + var original = object[name]; + object[name] = createNewFunction(original); + } + } + + patchFunction(navigator.mediaDevices, "getUserMedia", function (original) { + return function getUserMedia(constraints) { + disableAutogain(constraints); + return original.call(this, constraints); + }; + }); + + function patchDeprecatedGetUserMedia(original) { + return function getUserMedia(constraints, success, error) { + disableAutogain(constraints); + return original.call(this, constraints, success, error); + }; + } + + patchFunction(navigator, "getUserMedia", patchDeprecatedGetUserMedia); + patchFunction(navigator, "mozGetUserMedia", patchDeprecatedGetUserMedia); + patchFunction(navigator, "webkitGetUserMedia", patchDeprecatedGetUserMedia); + + patchFunction(MediaStreamTrack.prototype, "applyConstraints", function (original) { + return function applyConstraints(constraints) { + disableAutogain(constraints); + return original.call(this, constraints); + }; + }); + + console.log("Disable Autogain by Joey Watts!", navigator.mediaDevices.getUserMedia); +})(); + // TODO: remove soon const vencordDir = "vencordDir" as keyof typeof Settings.store; if (Settings.store[vencordDir]) {