【发布时间】:2019-09-05 15:13:32
【问题描述】:
我正在尝试动态修改附加到AVAudioEngine 的节点图,但该图在每次重新连接后都会输出静默。
在下面的示例中,我想将player 动态连接到engine.mainMixerNode,但每当我调用toggleBypass 时,我都会保持沉默。
是否可以在不暂停AVAudioPlayerNode 的播放的情况下执行此重新布线?
class Sample: UIViewController {
let engine = AVAudioEngine()
let player = AVAudioPlayerNode()
let effectNode = AVAudioUnitDelay()
@objc func toggleBypass() {
if effectNode.numberOfInputs == 0 {
engine.connect(player, to: effectNode, format: file.processingFormat)
engine.connect(effectNode, to: engine.mainMixerNode, format: file.processingFormat)
} else {
engine.connect(player, to: engine.mainMixerNode, format: file.processingFormat)
}
}
override func viewDidLoad() {
super.viewDidLoad()
view.backgroundColor = .red
view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(toggleBypass)))
try! AVAudioSession.sharedInstance().setCategory(.playback)
try! AVAudioSession.sharedInstance().setPreferredIOBufferDuration(0.005)
try! AVAudioSession.sharedInstance().setActive(true, options: [])
do {
engine.attach(player)
engine.attach(effectNode)
engine.connect(player, to: effectNode, format: file.processingFormat)
engine.connect(effectNode, to: engine.mainMixerNode, format: file.processingFormat)
player.scheduleBuffer(buffer, at: nil, options: .loops, completionHandler: nil)
engine.prepare()
try engine.start()
player.play()
} catch {
assertionFailure(String(describing: error))
}
}
lazy var file: AVAudioFile = {
let fileURL = Bundle.main.url(forResource: "beber", withExtension: "mp3")!
return try! AVAudioFile(forReading: fileURL)
}()
lazy var buffer: AVAudioPCMBuffer = {
let buffer = AVAudioPCMBuffer(pcmFormat: file.processingFormat, frameCapacity: UInt32(file.length))!
try! file.read(into: buffer)
return buffer
}()
}
(是的,我知道我可以更新效果的 bypass 属性,但我很想知道动态重新连接图表的步骤)
【问题讨论】:
-
有类似的问题,但在我的情况下,我需要重新连接仪器节点。您是否成功解决了这个问题?