diff --git a/src/addons/addons/mediarecorder/userscript.js b/src/addons/addons/mediarecorder/userscript.js index fa37052e9af..5b0dc33b7be 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 vm.runtime._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..b6d89c3b506 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 vm.runtime._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 vm.runtime._extensionIntegrationObjects.values()) { + if (extensionInformation.whitelistUsed && !extensionInformation.whitelist.includes("gainNodeSet")) continue; + for (const extensionGainNode of extensionInformation.gainNodes) { + extensionGainNode.gain.value = gainNode.value; } } };