web audio api очищает исходный узел после того, как он заканчивает воспроизведение? - PullRequest
0 голосов
/ 17 марта 2019

когда пользователь нажимает на кнопку, воспроизводится звук, и если он нажимает на нее снова, воспроизводится новый экземпляр того же звука.

я делаю это, подключая новый узел источника к контексту аудиона каждый клик.

теперь говорят, что пользователь нажимает кнопку в течение 1 часа, удаляются ли все исходные узлы, которые завершили воспроизведение, или они остаются подключенными к аудио-контексту?

Ответы [ 2 ]

1 голос
/ 20 марта 2019

Вот соответствующие спецификации :

Следующие поведения обеспечивают нормативное описание условий, при которых AudioNode является живым, что означает, что он ДОЛЖЕН быть сохранен в графе реализацией. Если эти условия не применяются, AudioNodes МОЖЕТ быть освобожден реализацией.

Существует несколько типов ссылок:

  1. Обычная ссылка, подчиняющаяся нормальным правилам сборки мусора.

  2. Воспроизводящая ссылка для AudioBufferSourceNodes, MediaElementAudioSourceNodes, MediaStreamAudioSourceNodes и OscillatorNodes. Эти узлы сохраняют игровую ссылку на себя во время игры.

  3. Ссылка на соединение, которая возникает, если другой AudioNode подключен к одному или нескольким его входам. Соединения с AudioParams узла не подразумевают ссылку на соединение.

  4. Заданное время, которое AudioNode поддерживает при себе, пока оно имеет какое-либо внутреннее состояние обработки, которое еще не было отправлено. Например, у ConvolverNode есть хвост, который продолжает играть даже после получения тихого ввода (подумайте о том, чтобы хлопать в ладоши в большом концертном зале и продолжать слышать звук, распространяющийся по всему залу). Некоторые аудиоузлы имеют это свойство. Пожалуйста, смотрите детали для определенных узлов.

  5. MediaStreams поддерживают MediaStreamAudioSourceNode в активном состоянии до тех пор, пока базовый MediaStreamTrack, который воспроизводится через MediaStreamAudioSourceNode, не завершился (согласно [mediacapture-streams]).

  6. 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 .

0 голосов
/ 20 марта 2019

BufferSourceNode не будет удален, если он все еще подключен к звуковому контексту. Вы можете проверить это, используя инструменты разработки Firefox Web Audio или установив расширение Audion Chrome.

Вы можете добавить функцию onended в BufferSourceNode, чтобы отключить ее после использования. Затем, если ничто иное не имеет ссылки на этот исходный узел буфера, оно будет очищено сборщиком мусора.

Источник: https://developer.mozilla.org/en-US/docs/Web/API/AudioScheduledSourceNode/onended

...