diff --git a/packages/superdough/audioContext.mjs b/packages/superdough/audioContext.mjs
index 94ec32d15..1c708e814 100644
--- a/packages/superdough/audioContext.mjs
+++ b/packages/superdough/audioContext.mjs
@@ -7,14 +7,18 @@ Copyright (C) 2025 Strudel contributors - see .
*/
+import { clearNodePool } from './nodePools.mjs';
+
let audioContext;
export const setDefaultAudioContext = () => {
- audioContext = new AudioContext();
- return audioContext;
+ return setAudioContext(new AudioContext());
};
export const setAudioContext = (context) => {
+ // Existing nodes in the node pool contain references to the previous AudioContext,
+ // so all the nodes in the pool must be cleared when we set a new AudioContext.
+ clearNodePool();
audioContext = context;
return audioContext;
};
diff --git a/packages/superdough/nodePools.mjs b/packages/superdough/nodePools.mjs
index 90b4c0ae7..66319e8c6 100644
--- a/packages/superdough/nodePools.mjs
+++ b/packages/superdough/nodePools.mjs
@@ -5,11 +5,24 @@ Copyright (C) 2025 Strudel contributors - see .
*/
+import { releaseAudioNode } from './helpers.mjs';
+
const nodePools = new Map();
const POOL_KEY = Symbol('nodePoolKey');
export const isPoolable = (node) => !!node[POOL_KEY];
+export const clearNodePool = () => {
+ for (const pool of nodePools) {
+ for (const node of pool) {
+ if (node instanceof AudioNode) {
+ releaseAudioNode(node);
+ }
+ }
+ }
+ nodePools.clear();
+};
+
const getNodeTime = (node) => {
return node.context?.currentTime ?? 0;
};