Web Audio Api, обновление буфера циклических данных в режиме реального времени, невозможно в топке? - PullRequest
0 голосов
/ 03 мая 2020

Я столкнулся с проблемой при попытке изменить базовые данные буфера во время воспроизведения буфера зацикливания.

bufferData = audioContext.bufferSourceNode.buffer.getChannelData(0);
bufferData[100] = newValue;

Такое поведение работает нормально в большинстве браузеров. протестировано в Chrome, Safari, Opera, Edge, все работает нормально, но это не представляется возможным в Firefox. Это похоже на ошибку. Я прочитал в этот вопрос StackOverflow от 2015 года , что такой способ обновления буфера «не следует делать таким образом ...» Как этого можно добиться в firefox?

Попытка обхода:

tempBufferData = bufferSourceNode.buffer.getChannelData(0);
bufferSourceNode.stop();
bufferSourceNode.disconnect();
buffer = audioContext.createNewBuffer();
tempBufferData[10] = newValue;
buffer.copyToChannel(tempBufferData);
bufferSourceNode.buffer = buffer;
bufferSourceNode.connect(gainNode);
bufferSourceNode.start(audioContext.currentTime);

Метод остановки текущего буфера, разъединения, создания нового bufferSourceNode и нового буфера и повторного соединения узлов каждый раз, когда буфер обновляется, кажется обременительным. До сих пор в моем тестировании этого метода было много глюков / хлопот. Есть ли усовершенствованный метод для этого?

Вот конкретный пример необходимости такого буфера обновления: демонстрация, в которой вы можете нарисовать зацикленную форму волны, которая обновляется каждый раз Вы меняете рисунок. Кажется, работает, кроме как firefox.

1 Ответ

0 голосов
/ 03 мая 2020

Я не думаю, что это тот ответ, на который вы надеялись, так как это будет довольно трудоемкая дополнительная работа, но я думаю, как вы "должны" сделать это в Firefox (то есть, как API веб-аудио spe c, предназначенный для таких задач), заключается в использовании AudioWorklet.

https://developer.mozilla.org/en-US/docs/Web/API/AudioWorklet

...