AudioContext не допускается для запуска в ToneJS (Chrome) - PullRequest
0 голосов
/ 11 мая 2018

Используя ToneJS в Chrome, я часто получаю следующее сообщение об ошибке: «AudioContext не может быть запущен. Он должен быть возобновлен (или создан) после пользовательского жеста на странице».

Например,с помощью приведенного ниже кода, я получаю это сообщение каждый раз, когда использую ctrl-r или ctrl-f5 для обновления страницы.

Я могу заставить его работать снова, набрав Tone.context.resume() в консоли, но это довольно красивоповторы.Почему это происходит, и как я могу это остановить?

var keyToPitch = { "z":"C3", "s":"C#3", "x":"D3", "d":"D#3", "c":"E3", "v":"F3", "g":"F#3", "b":"G3", "h":"G#3", "n":"A3", "j":"A#3", "m":"B3", ",":"C4" }


var synth = new Tone.PolySynth(6, Tone.Synth, {
    "oscillator" : {
        "type": "sawtooth",
        "partials" : [0, 2, 3, 4],
        }
    }).toMaster();


 window.addEventListener('keydown', this.onkeydown)
 window.addEventListener('keyup', this.onkeyup)

function onkeydown(e){
   synth.triggerAttack(keyToPitch[e.key], Tone.context.currentTime)
}
function onkeyup(e){
    synth.triggerRelease(keyToPitch[e.key])
}

1 Ответ

0 голосов
/ 11 мая 2018

Похоже, что Chrome устанавливает политику для , требующую взаимодействия с пользователем, чтобы использовать AudioContext , чтобы сайты не могли навязчиво воспроизводить звук без запуска его пользователем.

К счастью, вы уже используете пользовательский ввод для запуска звука через события нажатия клавиш и нажатия клавиш. Вместо того, чтобы вызывать Tone.context.resume() вручную, вы можете подключить события для запуска resume (), например:

function onkeydown(e){
  Tone.context.resume().then(() => {
    synth.triggerAttack(keyToPitch[e.key], Tone.context.currentTime)
  });
}
function onkeyup(e){
  Tone.context.resume().then(() => {
    synth.triggerRelease(keyToPitch[e.key])
  });
}
...