2015-09-29 4 views
0

При вызове stop() на осцилляторе веб-звука узел осциллятора просто висит вокруг, отключается и не используется.Обратный вызов осциллятора Webaudio() callback

Если я скажу осциллятор остановиться в 2-х секунд:

oscillator.stop(audioCtx.currentTime + 2); 

Есть ли способ, чтобы установить функцию обратного вызова, так что я могу удалить генератор сразу после остановки() имеет выбежала?

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

ответ

5

Узлы осциллятора поддерживают событие onended, которое вызывается, когда осциллятор заканчивается (останавливается).

+0

Это, скорее всего, то, что вы ищете. +1 –

+0

Я думаю, что это самый близкий к обратному вызову, который возможен, только проблема включена, похоже, не позволяет передать параметр функции, которую он вызывает. – ezero

+1

Создать закрытие для обработчика событий, который содержит требуемый параметр? Я предполагаю, что параметр, который вы ищете, представляет собой, в основном, индекс в массиве, который содержит все ваши узлы, поэтому вы можете удалить его из массива. –

0

Почему вы даже держите ссылку на осциллятор? Если вы отпустите свою ссылку на осциллятор сразу после вызова stop(), система WA будет поддерживать ее до тех пор, пока она не завершится, а затем автоматически получит мусор. Вам не нужно держаться за это самостоятельно.

+0

Вот почему я держу ссылку на него: У меня есть полифонический синтезатор с функцией playNote() и функцией stopNote(), которая получает номер ноты и время, когда вызывается playNote, нота будет продолжать играть вечно до тех пор, пока не будет вызвана stopNote для этой заметки. Поскольку это полифония, одна нота может воспроизводиться постоянно, в то время как несколько других начали и закончили в одно и то же время. – ezero

+0

Все воспроизводимые в данный момент генераторы примечаний сохраняются в массиве и удаляются один раз, когда для этой ноты вызывается stopNote. У меня также есть функция stopAll(), которая проходит через этот массив и останавливает все. – ezero

+0

Правильно, я понимаю, почему вы храните генераторы во время воспроизведения нот. Но как только вы планируете stop(), вам не нужно сохранять ссылку на заметку. Просто отпустите его. – cwilso

Смежные вопросы