调用AVAudioEngine.prepare时,AVAudioMixerNode自动与目标节点断开连接

问题描述

我正在使用Swift和Mac OS桌面编写音频音序器应用程序。我将AVAudiomixerNode对象用于通用路由和直通节点(音频从A点到达B点的节点)。直通节点在音频链中提供了临时的“进站”,我可以在其中应用音量更改。

我发现,如果将AVAudiomixerNode连接到AVAudioEngine的主混音器节点,然后调用prepare,则混音器节点会自动断开连接。没有错误或警告消息。我已经四天撕裂头发,试图弄清为什么信号路径中的某些节点没有连接。现在,我编写了一个简单的Playground,可以证明事实确实如此。

import Cocoa
import AVFoundation


let engine = AVAudioEngine()
let mixer1 = AVAudiomixerNode()
engine.attach(mixer1)
let format = engine.mainmixerNode.outputFormat(forBus: 0)
engine.connect(mixer1,to: engine.mainmixerNode,format: format)

var connections = engine.outputConnectionPoints(for: mixer1,outputBus: 0)
print("Number of connections = \(connections.count)")
engine.prepare()
connections = engine.outputConnectionPoints(for: mixer1,outputBus: 0)
print("Number of connections = \(connections.count)")

解决方法

如图print所示,该节点仍存在于图中,但处于挂起状态:

let engine = AVAudioEngine()
let mixer1 = AVAudioMixerNode()
engine.attach(mixer1)
engine.connect(mixer1,to: engine.mainMixerNode,format: nil)
print("\(engine)")
engine.prepare()
print("\(engine)")
________ GraphDescription ________
AVAudioEngineGraph 0x10050bc70: initialized = 0,running = 0,number of nodes = 3

     ******** output chain ********

     node 0x600002c50f00 {'auou' 'ahal' 'appl'},'U'
         inputs = 1
             (bus0,en1) <- (bus0) 0x600002c51000,{'aumx' 'mcmx' 'appl'},[ 2 ch,44100 Hz,'lpcm' (0x00000029) 32-bit little-endian float,deinterleaved]

     node 0x600002c51000 {'aumx' 'mcmx' 'appl'},en1) <- (bus0) 0x600002c03b80,deinterleaved]
         outputs = 1
             (bus0,en1) -> (bus0) 0x600002c50f00,{'auou' 'ahal' 'appl'},deinterleaved]

     node 0x600002c03b80 {'aumx' 'mcmx' 'appl'},'U'
         outputs = 1
             (bus0,en1) -> (bus0) 0x600002c51000,deinterleaved]
______________________________________



________ GraphDescription ________
AVAudioEngineGraph 0x10050bc70: initialized = 1,'I'
         inputs = 1
             (bus0,48000 Hz,'I'
         outputs = 1
             (bus0,deinterleaved]

     ******** pending connections - output ********

     (bus0) 0x600002c03b80,{'aumx' 'mcmx' 'appl'} -> (bus0) 0x600002c51000,deinterleaved]
______________________________________

我怀疑这是因为尽管我没有机会进一步试验,但是没有附加的输入或生成器节点。