Swift中的AVAudioEngineclass中的detachNode是做什么的?

What does detachNode do in AVAudioEngine class in Swift?

我已阅读文档并了解使用 detachNode "Detaches an audio node previously attached to the audio engine"。但是,我不确定分离音频节点的目的是什么。当我分离音频节点时会发生什么,这意味着什么?为什么需要分离音频节点?

有三种特定类型的节点:输出节点、混合器节点和播放器节点。

我们还有其他节点,但这些是初始构建块节点。

所以引擎是一个维护音频节点图的对象。

您创建节点并将它们附加到引擎,然后使用引擎在这些不同的音频节点之间建立连接。

引擎将分析这些连接并确定哪些连接构成活动链。

当您随后启动引擎时,音频流经所有活动链。

该引擎的一个强大功能是它允许您动态地重新配置这些节点。

这意味着您可以在引擎渲染时添加新节点,然后将它们连接起来。

因此,本质上您是在动态添加或删除链。

因此引擎的典型工作流程是创建引擎实例,创建要使用的所有节点的实例,将它们附加到引擎以便引擎现在知道它们,然后连接他们一起,启动引擎。

这将创建一个活动渲染线程,音频将流经所有活动链。 From WWDC 2014

假设您想播放带有回声效果的声音,这就是代码的样子

  var audioEngine =  AVAudioEngine()

var echoNode = AVAudioUnitDelay()
echoNode.delayTime = NSTimeInterval(0.3)

var audioPlayerNode = AVAudioPlayerNode()
audioEngine.attachNode(audioPlayerNode)

// Attach the audio effect node corresponding to the user selected effect
audioEngine.attachNode(echoNode)

// Connect Player --> AudioEffect
audioEngine.connect(audioPlayerNode, to: echoNode, format: audioFile.processingFormat)
// Connect AudioEffect --> Output
audioEngine.connect(echoNode, to: audioEngine.outputNode, format: audioFile.processingFormat)

audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler:nil)

audioEngine.startAndReturnError(nil)

audioPlayerNode.play()

然后如果你想使用混响效果播放音频: 分离回声节点(使链不活动), 创建一个新的混响节点, 再次连接节点以创建活动链。

  audioEngine.detachNode(echoNode)
    var reverbNode = AVAudioUnitReverb()
    reverbNode.loadFactoryPreset( AVAudioUnitReverbPreset.Cathedral)
    reverbNode.wetDryMix = 60
    audioEngine.stop()
    // Attach the audio effect node corresponding to the user selected effect
    audioEngine.attachNode(reverbNode)

    // Connect Player --> AudioEffect
    audioEngine.connect(audioPlayerNode, to: reverbNode, format: audioFile.processingFormat)
    // Connect AudioEffect --> Output
    audioEngine.connect(reverbNode, to: audioEngine.outputNode, format: audioFile.processingFormat)

    audioPlayerNode.scheduleFile(audioFile, atTime: nil, completionHandler:nil)

    audioEngine.startAndReturnError(nil)

    audioPlayerNode.play()