Поддерживается ли в Audio Safari API Web Audio API source.start(0) (он отлично работает в Chrome)?

Я пытаюсь реализовать API Web Audio. Код работает на Chrome 29.0.1547.76, но не на Safari 6.0.5 (8536.30.1). Ключ в том, использую ли я noteOn (0) или start (0).

Я хочу использовать start (), чтобы играть роль звука:

asource.start(0, 2, 1);

прекрасно работает в Chrome (проигрывается сразу, начинается с отметки 2 с, проигрывается в течение 1 с), но приводит к

TypeError: 'undefined' is not a function (evaluating 'asource.start(0, 2, 1)')

на сафари. Заменив эту строку на

asource.noteOn(0);

работает. [Ну, мне нужно вызвать noteOff (0) вместо stop (0).] Я получаю ту же ошибку с start (0). Итак, я предполагаю, что Safari не реализует start (0)? Но если так, то почему некоторые примеры в Rocks HTML5, которые используют start (0), работают?

Для справки вот полная веб-страница. Я пробовал много разных звуков / форматов; все приводят к одной и той же ошибке.

<!DOCTYPE html>
<html lang=en>
<head>
<meta charset="utf-8">
<title>Web Audio API Issue</title>
</head>
<body>
<p>Example working on Chrome but not Safari when using start()</p>

<button id="Load" onclick="init()" >Load</button>
<button id="Play" onclick="playSound()" disabled>Play</button>
<button id="Stop" onclick="stopSound()" disabled>Stop</button>

<script>
    var web_audio_context;
    var abuffer;
    var asource;

    function init() {
        contextClass = (window.AudioContext || 
            window.webkitAudioContext || 
            window.mozAudioContext || 
            window.msAudioContext);
        web_audio_context = new contextClass();

        var theURL = './digits.mp3';
        var xhr = new XMLHttpRequest();
        xhr.open('GET', theURL, true);
        xhr.responseType = 'arraybuffer';
        xhr.onload = function(e) {
            finishedLoading(this.response);
        };
        xhr.send();
    }

    function finishedLoading(arrayBuffer) {
        web_audio_context.decodeAudioData(arrayBuffer, function(buffer) {
            abuffer = buffer;
            document.getElementById('Load').disabled = true;
            document.getElementById('Play').disabled = false;
            document.getElementById('Stop').disabled = false;
        }, function(e) {
            console.log('Error decoding file', e);
        }); 
    }

    function playSound() {
        asource = web_audio_context.createBufferSource();
        asource.buffer = abuffer;
        asource.connect(web_audio_context.destination);
        asource.start(0, 2, 1);

    }

    function stopSound() {
        asource.stop(0);
    }
</script>
</body>
</html>

2 ответа

В более новых версиях Web Audio API метод noteOn переименован в start, Safari по-прежнему использует более старую версию, а Chrome - более новую.

Просто попробуй:

asource.start ? asource.start(0, 2, 1) : asource.noteOn(0, 2, 1);

Попробуйте добавить в свой проект библиотеку обезьян для веб-аудио API Криса Уилсона. Это может помочь.

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