Web Audio API: Почему вы можете запускать источники только один раз? - PullRequest
0 голосов
/ 23 марта 2020

Предположим, вы используете API Web Audio для воспроизведения чистого тона:

ctx = new AudioContext();
src = ctx.createOscillator();
src.frequency = 261.63; //Play middle C
src.connect(ctx.destination);
src.start();

Но позже вы решите, что хотите остановить звук:

src.stop();

С этого момента src теперь совершенно бесполезен; если вы попытаетесь запустить его снова, вы получите:

src.start()
VM564:1 Uncaught DOMException: Failed to execute 'start' on 'AudioScheduledSourceNode': cannot call start more than once.
    at <anonymous>:1:5

Если вы, например, делаете небольшую онлайн-клавиатуру, вы постоянно включаете и выключаете заметки. Кажется действительно неуклюжим удалить старый объект из графа аудио узлов, создать новый объект и connect() поместить его в график (а затем отбросить объект), когда было бы проще просто включить и выключить его при необходимости.

Есть ли какая-то важная причина, по которой API-интерфейс Web Audio делает такие вещи? Или есть какой-нибудь более чистый способ перезапуска аудиоисточника?

1 Ответ

0 голосов
/ 27 марта 2020

Именно так работает веб-аудио API. Узлы генератора звука, такие как узлы генератора и узлы источника аудиобуфера, предназначены для использования один раз. Каждый раз, когда вы хотите сыграть свой осциллятор, вы должны создать его и настроить, как вы сказали. Я знаю, что это кажется хлопотным, но вы можете абстрагировать его в метод play(), который обрабатывает эти детали для вас, поэтому вам не нужно думать об этом каждый раз, когда вы играете в осциллятор. Кроме того, не беспокойтесь о влиянии производительности на создание такого количества узлов. Веб-аудио API предназначен для использования таким образом.

Если вы просто хотите сделать musi c на inte rnet, и вам не так интересно изучать все тонкости веб-аудио API, вам может быть интересно использовать библиотеку Я написал, что делает такие вещи проще: https://github.com/rserota/wad

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...