From 47554dfe7986522e3b2de9f03f41ff86d7306910 Mon Sep 17 00:00:00 2001 From: JeremyGamer13 <69337718+JeremyGamer13@users.noreply.github.com> Date: Sat, 2 Aug 2025 00:50:49 -0600 Subject: [PATCH 1/2] apply to vol slider & media recorder --- src/addons/addons/mediarecorder/userscript.js | 23 +++++++++++++++---- src/addons/addons/vol-slider/module.js | 16 ++++++++----- 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/src/addons/addons/mediarecorder/userscript.js b/src/addons/addons/mediarecorder/userscript.js index fa37052e9af..35b5106f4fa 100644 --- a/src/addons/addons/mediarecorder/userscript.js +++ b/src/addons/addons/mediarecorder/userscript.js @@ -323,12 +323,25 @@ export default async ({ addon, console, msg }) => { vm.runtime.audioEngine.inputNode.connect(mediaStreamDestination); const audioSource = ctx.createMediaStreamSource(mediaStreamDestination.stream); audioSource.connect(dest); - // literally any other extension - for (const audioData of vm.runtime._extensionAudioObjects.values()) { - if (audioData.audioContext && audioData.gainNode) { - const mediaStreamDestination = audioData.audioContext.createMediaStreamDestination(); - audioData.gainNode.connect(mediaStreamDestination); + + // connecting extensions to the media stream + for (const extensionInformation of this._extensionIntegrationObjects.values()) { + if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("audioMediaStream")) continue; + // map destination AudioNodes to their AudioContexts + const contextMap = new Map(); + for (const audioNode of extensionInformation.audioNodes) { + const nodeArray = contextMap.get(audioNode.context) || []; + nodeArray.push(audioNode); + contextMap.set(audioNode.context, nodeArray); + } + // make media stream destinations, connect destination nodes from each context to the stream + for (const audioContext of extensionInformation.audioContexts) { + const mediaStreamDestination = audioContext.createMediaStreamDestination(); const audioSource = ctx.createMediaStreamSource(mediaStreamDestination.stream); + const audioNodes = contextMap.get(audioContext); + for (const audioNode of audioNodes) { + audioNode.connect(mediaStreamDestination); + } audioSource.connect(dest); } } diff --git a/src/addons/addons/vol-slider/module.js b/src/addons/addons/vol-slider/module.js index b5d7cea695a..ca9a43a6245 100644 --- a/src/addons/addons/vol-slider/module.js +++ b/src/addons/addons/vol-slider/module.js @@ -11,10 +11,12 @@ const callbacks = []; export const setVolume = (newVolume) => { if (gainNode) { gainNode.value = newVolume; + // literally any other extension - for (const audioData of globalVm.runtime._extensionAudioObjects.values()) { - if (audioData.gainNode) { - audioData.gainNode.gain.value = gainNode.value; + for (const extensionInformation of this._extensionIntegrationObjects.values()) { + if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("gainNodeSet")) continue; + for (const extensionGainNode of extensionInformation.gainNodes) { + extensionGainNode.gain.value = gainNode.value; } } } else { @@ -58,10 +60,12 @@ const gotAudioEngine = (audioEngine) => { } gainNode = audioEngine.inputNode.gain; gainNode.value = volumeBeforeFinishSetup; + // literally any other extension - for (const audioData of globalVm.runtime._extensionAudioObjects.values()) { - if (audioData.gainNode) { - audioData.gainNode.gain.value = gainNode.value; + for (const extensionInformation of this._extensionIntegrationObjects.values()) { + if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("gainNodeSet")) continue; + for (const extensionGainNode of extensionInformation.gainNodes) { + extensionGainNode.gain.value = gainNode.value; } } }; From b29424bc6134058dd00a79f2b7378a72b5c65783 Mon Sep 17 00:00:00 2001 From: JeremyGamer13 <69337718+JeremyGamer13@users.noreply.github.com> Date: Sat, 2 Aug 2025 01:02:33 -0600 Subject: [PATCH 2/2] fix `this` references --- src/addons/addons/mediarecorder/userscript.js | 2 +- src/addons/addons/vol-slider/module.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/addons/addons/mediarecorder/userscript.js b/src/addons/addons/mediarecorder/userscript.js index 35b5106f4fa..5b0dc33b7be 100644 --- a/src/addons/addons/mediarecorder/userscript.js +++ b/src/addons/addons/mediarecorder/userscript.js @@ -325,7 +325,7 @@ export default async ({ addon, console, msg }) => { audioSource.connect(dest); // connecting extensions to the media stream - for (const extensionInformation of this._extensionIntegrationObjects.values()) { + for (const extensionInformation of vm.runtime._extensionIntegrationObjects.values()) { if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("audioMediaStream")) continue; // map destination AudioNodes to their AudioContexts const contextMap = new Map(); diff --git a/src/addons/addons/vol-slider/module.js b/src/addons/addons/vol-slider/module.js index ca9a43a6245..b6d89c3b506 100644 --- a/src/addons/addons/vol-slider/module.js +++ b/src/addons/addons/vol-slider/module.js @@ -13,7 +13,7 @@ export const setVolume = (newVolume) => { gainNode.value = newVolume; // literally any other extension - for (const extensionInformation of this._extensionIntegrationObjects.values()) { + for (const extensionInformation of vm.runtime._extensionIntegrationObjects.values()) { if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("gainNodeSet")) continue; for (const extensionGainNode of extensionInformation.gainNodes) { extensionGainNode.gain.value = gainNode.value; @@ -62,7 +62,7 @@ const gotAudioEngine = (audioEngine) => { gainNode.value = volumeBeforeFinishSetup; // literally any other extension - for (const extensionInformation of this._extensionIntegrationObjects.values()) { + for (const extensionInformation of vm.runtime._extensionIntegrationObjects.values()) { if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("gainNodeSet")) continue; for (const extensionGainNode of extensionInformation.gainNodes) { extensionGainNode.gain.value = gainNode.value;