Вот соответствующие спецификации :
Следующие поведения обеспечивают нормативное описание условий, при которых AudioNode является живым, что означает, что он ДОЛЖЕН быть сохранен в графе реализацией. Если эти условия не применяются, AudioNodes МОЖЕТ быть освобожден реализацией.
Существует несколько типов ссылок:
Обычная ссылка, подчиняющаяся нормальным правилам сборки мусора.
Воспроизводящая ссылка для AudioBufferSourceNodes, MediaElementAudioSourceNodes, MediaStreamAudioSourceNodes и OscillatorNodes. Эти узлы сохраняют игровую ссылку на себя во время игры.
Ссылка на соединение, которая возникает, если другой AudioNode подключен к одному или нескольким его входам. Соединения с AudioParams узла не подразумевают ссылку на соединение.
Заданное время, которое AudioNode поддерживает при себе, пока оно имеет какое-либо внутреннее состояние обработки, которое еще не было отправлено. Например, у ConvolverNode есть хвост, который продолжает играть даже после получения тихого ввода (подумайте о том, чтобы хлопать в ладоши в большом концертном зале и продолжать слышать звук, распространяющийся по всему залу). Некоторые аудиоузлы имеют это свойство. Пожалуйста, смотрите детали для определенных узлов.
MediaStreams поддерживают MediaStreamAudioSourceNode в активном состоянии до тех пор, пока базовый MediaStreamTrack, который воспроизводится через MediaStreamAudioSourceNode, не завершился (согласно [mediacapture-streams]).
HTMLMediaElements поддерживают связанные с ними MediaElementAudioSourceNode до тех пор, пока HTMLMediaElement находится в состоянии, когда звук может воспроизводиться в будущем.
Так, в случае, например, AudioBufferSourceNode , так как он не имеет ввода (3), нет tail-time (4), не связан с внешним MediaStream (5) или MediaElement (6), если вы не сохраняете какую-либо ссылку на узел в своем коде js (1) и что узел завершил воспроизведение (2), то его можно удалить из графика, а затем Сбор мусора.
Также обратите внимание, что большинство исходных узлов в любом случае имеют очень маленький отпечаток.
Если еще раз мы возьмем AudioBufferSourceNodes в качестве примера, то вы должны понимать, что они не дублируют AudioBuffer , они просто ссылаются на него.
Поэтому создание тысяч AudioBufferSourceNodes из одного и того же AudioBuffer - это нормально.
Однако создание тысяч AudioBuffers из одного и того же ArrayBuffer или тысяч ArrayBuffers из одного и того же файла или обоих не подходит, так что убедитесь, что при обработке события click все, что вы делаете, - это создаете новый AudioBufferSourceNode из существующего AudioBuffer .