Проблема AudioContext с сафари

Я использую AudioContext для воспроизведения некоторых аудио на моем сайте. Он отлично работает на Chrome и Firefox, но не на Safari. На сафари stop функция не работает и я получаю следующее:

[Ошибка] InvalidStateError: DOM Exception 11: была предпринята попытка использовать объект, который не является или более не может использоваться. noteOff (preload.js, строка 85)

Кто-нибудь знает, как это исправить и почему эта ошибка происходит?

function _initWebAudio(AudioContext, format, audios, callback) {

    var context = new AudioContext();
    preloader(audios, _preload, callback);

    function _preload(asset, doneCallback) {
        var request = new XMLHttpRequest();
        request.open('GET', 'audio/' + asset.id + '.' + format, true);
        request.responseType = 'arraybuffer';
        request.onload = function () {
        context.decodeAudioData(request.response, function (buffer) {
            var source;
            // default volume
            //// support both webkitAudioContext or standard AudioContext
            asset.gain = context.createGain ? context.createGain() : context.createGainNode();
            asset.play = function () {
                source = context.createBufferSource(); // creates a sound source
                source.buffer = buffer; // tell the source which sound to play
                source.connect(asset.gain); // connect the source to the context's destination (the speakers)
                asset.gain.connect(context.destination);
                // play the source now
                // support both webkitAudioContext or standard AudioContext
                source.noteOn ? source.noteOn(0) : source.start(0);
            };
            asset.stop = function () {
                console.log(source);
                source = context.createBufferSource(); // creates a sound source
                source.noteOff ? source.noteOff(0) : source.stop(0);
            }
            asset.toggleVolume = function (muteSound) {
                if (muteSound) {
                    asset.gain.gain.value = 0;
                } else {
                    asset.gain.gain.value = 1;
                }
            }
            doneCallback();
        }, function (err) {
            asset.play = function () {
            };
            doneCallback(err, asset.id);
        });
    };
    request.onerror = function (err) {
        console.log(err);
        asset.play = function () {
        };
        doneCallback(err, asset.id);
    };
        // kick off load
        request.send();
    }
}

1 ответ

Я не уверен, почему это произошло, но я решил это, используя метод connect().

asset.stop = function () {
   asset.gain.disconnect();
   //source.noteOff ? source.noteOff(0) : source.stop(0);
}
Другие вопросы по тегам