@@ -323,12 +323,25 @@ export default async ({ addon, console, msg }) => {
323
323
vm . runtime . audioEngine . inputNode . connect ( mediaStreamDestination ) ;
324
324
const audioSource = ctx . createMediaStreamSource ( mediaStreamDestination . stream ) ;
325
325
audioSource . connect ( dest ) ;
326
- // literally any other extension
327
- for ( const audioData of vm . runtime . _extensionAudioObjects . values ( ) ) {
328
- if ( audioData . audioContext && audioData . gainNode ) {
329
- const mediaStreamDestination = audioData . audioContext . createMediaStreamDestination ( ) ;
330
- audioData . gainNode . connect ( mediaStreamDestination ) ;
326
+
327
+ // connecting extensions to the media stream
328
+ for ( const extensionInformation of this . _extensionIntegrationObjects . values ( ) ) {
329
+ if ( extensionInformation . whitelistUsed && ! extensionInformation . whitelist . includes ( "audioMediaStream" ) ) continue ;
330
+ // map destination AudioNodes to their AudioContexts
331
+ const contextMap = new Map ( ) ;
332
+ for ( const audioNode of extensionInformation . audioNodes ) {
333
+ const nodeArray = contextMap . get ( audioNode . context ) || [ ] ;
334
+ nodeArray . push ( audioNode ) ;
335
+ contextMap . set ( audioNode . context , nodeArray ) ;
336
+ }
337
+ // make media stream destinations, connect destination nodes from each context to the stream
338
+ for ( const audioContext of extensionInformation . audioContexts ) {
339
+ const mediaStreamDestination = audioContext . createMediaStreamDestination ( ) ;
331
340
const audioSource = ctx . createMediaStreamSource ( mediaStreamDestination . stream ) ;
341
+ const audioNodes = contextMap . get ( audioContext ) ;
342
+ for ( const audioNode of audioNodes ) {
343
+ audioNode . connect ( mediaStreamDestination ) ;
344
+ }
332
345
audioSource . connect ( dest ) ;
333
346
}
334
347
}
0 commit comments