Swift: отключите AVAudioUnit от воспроизведения AVAudioEngine - PullRequest
1 голос
/ 14 мая 2019

В какой-то момент я играю аудиофайл с некоторыми эффектами.Вот код:

 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), но после запуска этой строки проигрыватель молчит.

Что я не так делаю?Я просто хочу удалить один из уже добавленных эффектов.

1 Ответ

0 голосов
/ 14 мая 2019

Это цепь, и вы сломали одну из ссылок.Вот ваш код:

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)

Если вы удалите узел реверберации, теперь между регулировкой скорости и искажением есть дыра.Ничто не может пересечь эту дыру.Вам нужно подключить их.

...