javascript — cancelScheduledValues ​​(x), за которым следует setValueCurveAtTime (x), выдает ошибку

cancelScheduledValues ​​(x), сопровождаемый setValueCurveAtTime (x), выдает ошибку

Я использую API WebAudio для кроссфейдирования между несколькими источниками. Затухания ставятся в очередь с помощью setValueCurveAtTime (кривая, время, продолжительность). Спецификация WebAudio указывает, что любой последующий вызов setValueCurveAtTime с перекрывающимися длительностями не допускается. Поэтому я вызываю cancelScheduledValues (время) перед очередью новых затуханий. Однако и Firefox v68, и Chrome v77 выдают ошибки при втором вызове setValueCurveAtTime.

В прикрепленном фрагменте содержится минимальное количество кода для запуска ошибок в любом браузере. Нажмите на Пуск, чтобы вызвать ошибку. Обратите внимание, что он не воспроизводит звук, так как он не нужен для выдачи ошибки. Выпадающий список позволяет управлять аргументом time для обеих функций. В Chrome v77 time=0 не вызывает ошибку.

Будем весьма благодарны за любые идеи о том, как заставить это работать в обоих браузерах!

Обновление: как указал Рэймонд Той , метод cancelScheduledValues ​​(t) отменяет автоматизацию, которая началась в t или позже (не просто активная во время t ). Благодаря использованию cancelScheduledValues(Math.max(t - duration, 0)) код теперь работает в Chrome. Firefox все еще терпит неудачу с Operation is not supported ошибка однако.

 {amp}lt;!DOCTYPE html{amp}gt; {amp}lt;html{amp}gt; {amp}lt;body{amp}gt; {amp}lt;button id="start"{amp}gt;Start{amp}lt;/button{amp}gt; {amp}lt;select id="time"{amp}gt; {amp}lt;option value="0"{amp}gt;time=0{amp}lt;/option{amp}gt; {amp}lt;option value="1"{amp}gt;time=currentTime{amp}lt;/option{amp}gt; {amp}lt;/select{amp}gt; {amp}lt;pre id="log"{amp}gt;{amp}lt;/pre{amp}gt; {amp}lt;script{amp}gt; const select = document.querySelector('#time') const log = document.querySelector('#log') function start() { const ctx = new AudioContext() ctx.resume() const gain = ctx.createGain() gain.connect(ctx.destination) // Fade in gain.gain.setValueCurveAtTime(new Float32Array([0, 1]), 0, 1) setTimeout(() ={amp}gt; { const time = select.options[select.selectedIndex].value === '0' ? 0 : ctx.currentTime // Replace fade in with fade out // THIS IS THE CALL THAT DOESN'T WORK ===== // Doesn't work in Firefox nor Chrome: // gain.gain.cancelScheduledValues(time) // Doesn't work in Firefox: gain.gain.cancelScheduledValues(Math.max(time - 1 /* duration of previous fade */, 0)) try { // ERROR IS THROWN HERE ================= gain.gain.setValueCurveAtTime(new Float32Array([0, 1]), time, 1) } catch (error) { log.prepend(error.message   'n') throw error } log.prepend('No error!n') }, 100) } document.querySelector('#start').addEventListener('click', start) {amp}lt;/script{amp}gt; {amp}lt;/body{amp}gt; {amp}lt;/html{amp}gt; 
Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector