当浏览器不支持时,是否有 cancelAndHoldAtTime 的正确替代方法?

Is there a correct alternative to cancelAndHoldAtTime when the browser does not support this?

使用 WAA(网络音频 Api)我正在使用 exponentialRampToValueAtTime 创建淡入淡出效果,用户按下 "stop" 按钮可以取消该淡入淡出效果。

停止函数看起来像这样:

 this._gainNode.gain.cancelAndHoldAtTime(this._AudioContext.currentTime);    
this._gainNode.gain.exponentialRampToValueAtTime(0.000001, this._AudioContext.currentTime + fadeDuration);

完整的功能被包裹在一个Promise中,因为我需要在停止后做一些其他事情(fadeDuration);

问题是在某些浏览器中 cancelAndHoldAtTime 不会退出,我会收到一些我不知道如何防止的令人讨厌的剪辑。 cancelValuesAndHoldAtTime 得到的支持更少。

我试过 cancelScheduledValues 但没有用。

是否有 cancelAndHoldAtTime

的解决方法或正确的替代方法

您可以通过调用 setValueAtTime(v, t) 进行近似,其中 t 是用户按下停止按钮的上下文时间,v 是当时指数的估计值t.

您可能仍然会遇到问题,但它可能比仅使用 cancelScheduledValues.

要好得多

这就是 cancelAndHoldAtTime 被添加到 API 的原因。

虽然 cancelAndHoldAtTime 的最佳替代方案可能是 for Raymond Toy,但为了完全移除剪辑和任何故障,我最终做的是在振荡器增益和destination

OSC -> oscGain -> mainGain -> 扬声器。

在我做任何事情之前,我关闭 mainGain 然后 cancelScheduledValues 和所有其他东西到 oscGain