【问题标题】:Webaudio oscillator stop() callbackWebaudio 振​​荡器 stop() 回调
【发布时间】:2015-09-29 14:16:35
【问题描述】:

在网络音频振荡器上调用 stop() 时,振荡器节点只是挂起、断开连接和未使用。

如果我告诉振荡器在 2 秒内停止:

oscillator.stop( audioCtx.currentTime + 2 );

有没有办法设置回调,以便我可以在 stop() 运行后立即删除振荡器?

我曾考虑使用 setTimeout 加上停止时间加上半秒左右,但最终可能会删除错误的振荡器。

【问题讨论】:

    标签: javascript web-audio-api


    【解决方案1】:

    振荡器节点支持在振荡器结束(停止)时调用的onended 事件。

    【讨论】:

    • 这很可能是您要查找的内容。 +1
    • 我认为这是最接近可能的回调,唯一的问题是 onended 似乎不允许将参数传递给它调用的函数。
    • 为包含你想要的参数的事件处理程序创建一个闭包?我假设您要查找的参数基本上是包含所有节点的数组的索引,因此您可以将其从数组中删除。
    • 我完全忘记了这一点。
    • 感谢关闭建议,这解决了我的问题!这是代码...var self = this; var noteEndCallback = function(){delete self.notes[note];} this.notes[note].onended = noteEndCallback;
    【解决方案2】:

    您为什么还要保留对振荡器的引用?如果在调用 stop() 后立即释放对振荡器的引用,WA 系统将保留它直到它完成,然后它会自动收集垃圾。你不需要自己坚持。

    【讨论】:

    • 这就是我保留对它的引用的原因:我有一个带有 playNote() 函数和 stopNote() 函数的复音合成器,当 playNote 是调用时,该音符将一直播放,直到为该音符调用 stopNote。因为它是和弦的,所以一个音符可能会不断播放,而其他几个音符会在同一时间内开始和结束。
    • 当前播放的所有音符振荡器都存储在一个数组中,并在为该音符调用 stopNote 后删除。我还有一个 stopAll() 函数,它遍历该数组并停止一切。
    • 好的,我明白你为什么要在播放音符时存储振荡器。但是一旦你安排了 stop(),你就不需要保留对注释的引用。放开它。
    • 音符可以安排在 6 秒后停止,但我还有一个主停止按钮,需要立即停止当前播放的所有内容。如果我去掉对 note osc 的引用,它会在按下主停止按钮后继续播放几秒钟。
    • 嗯,我明白了。但是你不需要非常精确的调度(因为你只记得清理你的振荡器句柄),对吧?只需设置一个超时,然后使用 bind() 来确保它是正确的振荡器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-30
    • 1970-01-01
    相关资源
    最近更新 更多