Swift: 断开 AVAudioUnit 与播放 AVAudioEngine 的连接
Swift: disconnect an AVAudioUnit from playing AVAudioEngine
我正在播放一个带有某些效果的音频文件。这是代码:
engine = AVAudioEngine()
playerB = AVAudioPlayerNode()
playerB.volume = 0.5
let path = Bundle.main.path(forResource: "ukulele", ofType: "wav")!
let url = NSURL.fileURL(withPath: path)
let file = try? AVAudioFile(forReading: url)
buffer = AVAudioPCMBuffer(pcmFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length))!
try! file!.read(into: buffer)
reverb.loadFactoryPreset(AVAudioUnitReverbPreset.cathedral)
reverb.wetDryMix = 50
distortion.loadFactoryPreset(AVAudioUnitDistortionPreset.speechRadioTower)
distortion.wetDryMix = 25
let delay = AVAudioUnitDistortion()
delay.loadFactoryPreset(AVAudioUnitDistortionPreset.speechAlienChatter)
delay.wetDryMix = 25
engine.attach(playerB)
engine.attach(reverb)
engine.attach(distortion)
engine.attach(delay)
engine.attach(pitch)
engine.attach(speedControl)
engine.connect(playerB, to: pitch, format: nil)
engine.connect(pitch, to: speedControl, format: nil)
engine.connect(speedControl, to: reverb, format: nil)
engine.connect(reverb, to: distortion, format: nil)
engine.connect(distortion, to: engine.mainMixerNode, format: buffer.format)
playerB.scheduleBuffer(buffer, at: nil, options: AVAudioPlayerNodeBufferOptions.loops, completionHandler: nil)
engine.prepare()
try! engine.start()
我想要的是在发生特定操作时断开 AVAudioUnit
之一。但是,删除 AVAudioUnit
后播放器完全没有声音。
例如,如果我想删除 reverb
,代码是:engine.disconnectNodeOutput(reverb)
但在这一行 运行 之后,玩家沉默了。
我做错了什么?我只是想删除一个已经添加的效果。
这是一条链条,你弄断了其中一个链环。这是您的代码:
engine.connect(pitch, to: speedControl, format: nil)
engine.connect(speedControl, to: reverb, format: nil)
engine.connect(reverb, to: distortion, format: nil)
engine.connect(distortion, to: engine.mainMixerNode, format: buffer.format)
如果您移除混响节点,现在速度控制和失真之间会出现空洞。没有什么能越过那个洞。你需要连接它们。
我正在播放一个带有某些效果的音频文件。这是代码:
engine = AVAudioEngine()
playerB = AVAudioPlayerNode()
playerB.volume = 0.5
let path = Bundle.main.path(forResource: "ukulele", ofType: "wav")!
let url = NSURL.fileURL(withPath: path)
let file = try? AVAudioFile(forReading: url)
buffer = AVAudioPCMBuffer(pcmFormat: file!.processingFormat, frameCapacity: AVAudioFrameCount(file!.length))!
try! file!.read(into: buffer)
reverb.loadFactoryPreset(AVAudioUnitReverbPreset.cathedral)
reverb.wetDryMix = 50
distortion.loadFactoryPreset(AVAudioUnitDistortionPreset.speechRadioTower)
distortion.wetDryMix = 25
let delay = AVAudioUnitDistortion()
delay.loadFactoryPreset(AVAudioUnitDistortionPreset.speechAlienChatter)
delay.wetDryMix = 25
engine.attach(playerB)
engine.attach(reverb)
engine.attach(distortion)
engine.attach(delay)
engine.attach(pitch)
engine.attach(speedControl)
engine.connect(playerB, to: pitch, format: nil)
engine.connect(pitch, to: speedControl, format: nil)
engine.connect(speedControl, to: reverb, format: nil)
engine.connect(reverb, to: distortion, format: nil)
engine.connect(distortion, to: engine.mainMixerNode, format: buffer.format)
playerB.scheduleBuffer(buffer, at: nil, options: AVAudioPlayerNodeBufferOptions.loops, completionHandler: nil)
engine.prepare()
try! engine.start()
我想要的是在发生特定操作时断开 AVAudioUnit
之一。但是,删除 AVAudioUnit
后播放器完全没有声音。
例如,如果我想删除 reverb
,代码是:engine.disconnectNodeOutput(reverb)
但在这一行 运行 之后,玩家沉默了。
我做错了什么?我只是想删除一个已经添加的效果。
这是一条链条,你弄断了其中一个链环。这是您的代码:
engine.connect(pitch, to: speedControl, format: nil)
engine.connect(speedControl, to: reverb, format: nil)
engine.connect(reverb, to: distortion, format: nil)
engine.connect(distortion, to: engine.mainMixerNode, format: buffer.format)
如果您移除混响节点,现在速度控制和失真之间会出现空洞。没有什么能越过那个洞。你需要连接它们。