Почему метод остановки в AudioBufferNode уничтожает его?
-
21-12-2019 - |
Вопрос
Мы знаем, что когда вы вызываете #.stop()
на AudioBufferNode вы не сможете #.start()
.Почему такое поведение?
Эта проблема возникла при работе с WebAudio API, и мы все рано или поздно обнаруживаем это при попытке реализовать функцию паузы.Что меня заинтересовало, так это то, что я понимаю, что это стрим, и его нельзя просто «приостановить».Но почему его разрушают?Разве внутри нет указателя на данные или данные просто передаются в пункт назначения и забываются буфером?
Решение
Вы не вызываете .stop() для AudioBuffer, вы вызываете .stop() для BufferSourceNode — AudioBuffer можно использовать несколько раз.
Вкратце, это оптимизация, которая позволяет очень легко воспроизводить буферы по принципу «запустил и забыл» — вы можете построить на основе этого медиаплеер более высокого уровня, но сами по себе BufferSourceNodes очень легкие.Сами звуковые данные не забываются и могут быть использованы повторно (фактически, одновременно другими узлами BufferSourceNodes), поскольку они находятся в отдельном объекте AudioBuffer.