gpt4 book ai didi

javascript - cancelScheduledValues(x) 后跟 setValueCurveAtTime(x) 会抛出错误

转载 作者:行者123 更新时间:2023-12-02 22:50:22 25 4
gpt4 key购买 nike

我正在使用 WebAudio API 在多个源之间进行交叉淡入淡出。淡入淡出使用 setValueCurveAtTime 进行排队(曲线、时间、持续时间)。 WebAudio 规范指示不允许对具有重叠持续时间的 setValueCurveAtTime 进行任何后续调用。所以我打电话cancelScheduledValues (时间)在排队新淡入淡出之前。然而,Firefox v68 和 Chrome v77 在第二次 setValueCurveAtTime 调用时都会抛出错误。

附加的代码片段包含在任一浏览器中触发错误的最少量代码。 单击“开始”以触发错误。请注意,它不会播放任何音频,因为抛出错误不需要它。选择下拉列表允许控制两个函数的时间参数。在 Chrome v77 中,time=0 不会触发错误。

任何有关如何使其在两种浏览器中工作的想法将不胜感激!

更新:Raymond Toy指出 cancelScheduledValues(t) 似乎取消了在 t 或之后开始的自动化(不仅仅是在 t 期间激活)。通过使用 cancelScheduledValues(Math.max(t -uration, 0)),代码现在似乎可以在 Chrome 中运行。然而,Firefox 仍然失败,并显示不支持操作错误。

<!DOCTYPE html>
<html>
<body>
<button id="start">Start</button>
<select id="time">
<option value="0">time=0</option>
<option value="1">time=currentTime</option>
</select>
<pre id="log"></pre>

<script>
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(() => {
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)
</script>
</body>
</html>

最佳答案

我对cancelScheduledValues的阅读表明这正在按预期工作。 setValueCurveAtTime(curve, time,uration) 的事件时间为 timecancelScheduledValues(t2) 删除事件时间为 t2 或更长的所有事件。在您的测试用例中,time = 0,t2 是大于 0 的 currentTime。因此,不会从时间轴中删除任何内容。第二次调用 setValueCurveAtTime 会插入一个与前一个事件重叠的新事件。因此,您会收到错误。

话虽如此,我认为这有点出乎意料。这可能是 WebAudio 规范中的错误。

关于javascript - cancelScheduledValues(x) 后跟 setValueCurveAtTime(x) 会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58204307/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com