Абстракция аудиофайла веб-аудио API распознает запланированное время только при начальном воспроизведении. Затем он воспроизводит немедленно

Цель приведенного ниже кода — гарантировать, что каждый раз, когда запускается прослушиватель событий, звук воспроизводится на 2 секунды вперед. В нынешнем виде это работает только при первом запуске события. Все последующие события mousedown воспроизводят файл немедленно. Ищу подсказку, как это исправить.

var audioContext = new webkitAudioContext;

function AudioObj(fileDirectory) {
    var soundObj = {};
    soundObj.fileDirectory = fileDirectory;

    var getSound = new XMLHttpRequest();
    getSound.open("GET", soundObj.fileDirectory, true);
    getSound.responseType = "arraybuffer";
    getSound.onload = function() {
        audioContext.decodeAudioData(getSound.response, function(buffer) {
            soundObj.soundToPlay = buffer;

        });
    }

    getSound.send();


soundObj.play = function(time) {
        var playSound = audioContext.createBufferSource();
        playSound.buffer = soundObj.soundToPlay;
        playSound.connect(audioContext.destination);
        playSound.start(time );

      }

      return soundObj;

}


var snare = AudioObj("snare.mp3");

window.addEventListener("mousedown", go);

function go(){
    snare.play(2)
}

person William    schedule 12.05.2014    source источник


Ответы (1)


Время начала не является смещением. Вам нужно вызвать play sound.start(AudioContext.currentTime + time); в вашем методе play().

person cwilso    schedule 12.05.2014
comment
Спасибо. Могу я спросить, какова логика реализации того, что он играет с запланированным значением времени в первый раз? Я имею в виду, не должен ли я всегда писать audioContext.currentTime + (запланированное звуковое событие)? В чем причина того, что он работает в первый раз без полной строки кода? - person William; 13.05.2014
comment
@TaoistWA, поскольку вы используете webkit, все еще существует ошибка, из-за которой context.currentTime начинает отсчет всякий раз, когда вы создаете свой первый узел. Итак, когда вы щелкаете, создается узел, начинается время, а затем смещение от currentTime действительно составляет ~ 2 с. - person MarijnS95; 13.05.2014
comment
Проблема, от которой вы ускользнули, абсолютно верна и связана с вебкитом, но что касается моего вопроса к Крису - я только что проверил в Firefox Aurora, и он делает то же самое. Так что я не думаю, что ошибка webkit связана. - person William; 13.05.2014
comment
время аудиоконтекста начинается с нуля при первом создании аудиоконтекста - если вы немедленно создадите свои узлы и запустите первый с помощью start(2), он начнется через две секунды в будущем. - person cwilso; 13.05.2014
comment
(Как заметил MarijnS95, в Webkit/Blink все еще есть ошибка, из-за которой время не начинает отсчитываться, пока не будет создан ваш первый узел.) - person cwilso; 13.05.2014