什么是摧毁音频节点的最佳方法?

6
我正在构建一个需要创建和销毁大量音频节点的东西。据我所知,为了销毁一个音频节点,必须执行以下步骤:
  1. 将该节点的所有引用设置为null或其他内容
  2. 如果适用,调用stop方法
  3. 断开所有内部和外部连接
前两个步骤很简单,但我正在试图弄清楚是否有可能列出所有节点的连接,并且还需要知道我的列表中是否缺少任何内容。我还需要知道如何检测未被引用的音频节点是否存在。

我投票关闭此问题,因为在SO上,您应该尝试自己编写代码。如果您遇到问题,请先**进行更多研究,然后发布您已经尝试过的内容,并提供一个清晰的说明,说明哪些部分不起作用,并提供一个最小化、完整和可验证的示例**。 - Rob
节点是对象,如果您删除它们,它们将消失,例如,如果您将它们放入数组中。我将我的节点存储在数组中,因此如果我删除数组,则节点也会消失。节点并不像RAM一样昂贵。昂贵的是音频缓冲区=>播放后会自行销毁。 - Kilian Hertel
2个回答

4
这是 AudioNode 生命周期规格说明的内容:

只要有任何引用指向它,AudioNode 就会存在。有几种类型的引用:

  1. 遵循正常垃圾回收规则的普通 JavaScript 引用。
  2. 对于 AudioBufferSourceNodes 和 OscillatorNodes,同时维护播放引用。这些节点在播放时维护对自身的播放引用。
  3. 连接引用,如果另一个 AudioNode 连接到它,则发生连接引用。
  4. 尾时间引用,即 AudioNode 在其具有尚未被发出的任何内部处理状态时维护自身的引用。例如,ConvolverNode 具有尾声,即使接收到静音输入也会继续播放(想象在大型音乐厅鼓掌并继续听到声音在整个音乐厅回响)。一些 AudioNodes 具有此属性。请参阅特定节点的详细信息。

任何连接成循环并直接或间接连接到 AudioContext 的 AudioDestinationNode 的 AudioNodes 将与 AudioContext 一样长寿。

据我所知:

  • 正在播放的AudioNode只需要停止即可。
  • 其他节点最好断开连接。
  • 断开所有节点也不会有影响。

1
请您能否提供一些例子。 - deathangel908

2
如果您只是调用audioNode.disconnect()而没有参数,它将断开节点的所有输入和输出。

很遗憾,不可以。audioNode.disconnect()只会断开与之前连接的任何输出的连接,不会断开节点的输入。请参考MDN上的disconnect。或者您可以自己编写一个演示。 - undefined
另请参阅:AudioNode.cpp#686 在 Chromium 中。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接