Я думаю, что Safari на самом деле ведет себя правильно (по крайней мере, частично) в этом случае. Спецификация веб-аудио говорит, что ...
Вновь созданный AudioContext всегда будет начинаться в приостановленном состоянии, и событие изменения состояния будет запускаться всякий раз, когда состояние изменяется на другое состояние.
https://webaudio.github.io/web-audio-api/#dom-baseaudiocontext-onstatechange
К сожалению, Safari не выполняет переход в состояние running
самостоятельно. Вы должны явно попросить его сделать это.
audioContext.resume();
audioContext.onstatechange = () => console.log(audioContext.state);
Событие statechange
должно сработать почти сразу. Если вы выполните это внутри обработчика кликов.
Приведенная выше функция будет выглядеть следующим образом:
const test = () => {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
audioContext = new AudioContext();
console.log(audioContext.state); //suspended
audioContext.resume();
audioContext.onstatechange = () => console.log(audioContext.state); // running
}
Интересно, что Safari запускает событие statechange
только в том случае, если вы сохраняете оператор console.log
перед вызовом resume()
.
Однако есть еще один хак, который вы можете попробовать выкинуть из AudioContext
. Просто создайте простой файл GainNode
.
const test = () => {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
audioContext = new AudioContext();
audioContext.createGain();
console.log(audioContext.state); // running
}
Вы также можете попробовать standardized-audio-context, чтобы все браузеры вели себя одинаково в в этом отношении.
person
chrisguttandin
schedule
26.06.2019