Я столкнулся с проблемой при попытке изменить базовые данные буфера во время воспроизведения буфера зацикливания.
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.