From 71d36b79edfdf85cb035764b418662210226d245 Mon Sep 17 00:00:00 2001 From: jeromew Date: Mon, 8 Dec 2025 17:31:34 +0000 Subject: [PATCH] Improve getOscillator/noiseMix release --- packages/superdough/helpers.mjs | 9 ++++++--- packages/superdough/noise.mjs | 7 +++++-- packages/superdough/synth.mjs | 3 ++- 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/superdough/helpers.mjs b/packages/superdough/helpers.mjs index a5f199fb1..5abc2bad1 100644 --- a/packages/superdough/helpers.mjs +++ b/packages/superdough/helpers.mjs @@ -283,9 +283,12 @@ export function drywet(dry, wet, wetAmount = 0) { wet_gain.connect(mix); return { node: mix, - onended: () => { - dry_gain.disconnect(mix); - wet_gain.disconnect(mix); + teardown: () => { + releaseAudioNode(dry_gain); + releaseAudioNode(wet_gain); + // it is not the responsability of drywet + // to call `releaseAudioNode` on + // the 2 external args dry and wet dry.disconnect(dry_gain); wet.disconnect(wet_gain); }, diff --git a/packages/superdough/noise.mjs b/packages/superdough/noise.mjs index da60e87a1..52d9306a1 100644 --- a/packages/superdough/noise.mjs +++ b/packages/superdough/noise.mjs @@ -1,4 +1,4 @@ -import { drywet, onceEnded } from './helpers.mjs'; +import { drywet, onceEnded, releaseAudioNode } from './helpers.mjs'; import { getAudioContext } from './audioContext.mjs'; let noiseCache = {}; @@ -65,9 +65,12 @@ export function getNoiseOscillator(type = 'white', t, density = 0.02) { export function getNoiseMix(inputNode, wet, t) { const noiseOscillator = getNoiseOscillator('pink', t); const noiseMix = drywet(inputNode, noiseOscillator.node, wet); - onceEnded(noiseOscillator.node, () => noiseMix.onended()); + onceEnded(noiseOscillator.node, () => { + releaseAudioNode(noiseOscillator.node); + }); return { node: noiseMix.node, stop: (time) => noiseOscillator?.stop(time), + teardown: noiseMix.teardown, }; } diff --git a/packages/superdough/synth.mjs b/packages/superdough/synth.mjs index e82c889ac..d9ee0d936 100644 --- a/packages/superdough/synth.mjs +++ b/packages/superdough/synth.mjs @@ -491,7 +491,8 @@ export function getOscillator(s, t, value, onended) { } onceEnded(o, () => { - noiseMix || releaseAudioNode(o); + noiseMix?.teardown(); + releaseAudioNode(o); releaseAudioNode(noiseMix?.node); onended(); });