Требуются ли для подключения к сценариям WebAudio scriptProcessorNodes * выходные данные?

Вот ссылка на простой jsFiddle, который измеряет громкость живого ввода с помощью веб-аудио (выводит значения в процентах на консоль).

http://jsfiddle.net/XSnsF/

Я планировал иметь один вход и никаких выходов, так как нет необходимости задерживать мой аудиосигнал, ожидая, пока мой пользовательский узел завершит обработку громкости.

Однако стало очевидно, что scriptProcessor регистрирует значения, только если он подключен к context.destination, Я делаю что-то неправильно? Или это ошибка? Или это ожидаемое поведение?

function gotStream(stream) {

    var mediaStreamSource = context.createMediaStreamSource(stream);

    var gainNode = context.createGain();
    gainNode.gain.value = 3;

    var levelChecker = context.createScriptProcessor(2048);

    mediaStreamSource.connect(gainNode);
    gainNode.connect(levelChecker);

    //Commenting out the line directly below stops the script processor from working!
    levelChecker.connect(context.destination);
    levelChecker.onaudioprocess = process;

}

function process(e) {
    var buffer = e.inputBuffer.getChannelData(0);

    var maxVal = 0;

    for (var i = 0; i < buffer.length; i++) {

        if (maxVal < buffer[i]) {
            maxVal = buffer[i];
        }
    }

    console.log(Math.round(maxVal * 100) + "%");
}

1 ответ

Решение

Это ошибка в реализациях Blink & Webkit. Из спецификации: "События аудиопроцесса отправляются только в том случае, если ScriptProcessorNode имеет хотя бы один вход или один выход". Это не нужно обоим.

Пока просто подключите его к GainNode с нулевым усилением, подключенному к audiocontext.destination.

Другие вопросы по тегам