首页 > 解决方案 > 在 AudioKit 中停用 AudioSession

问题描述

我正在使用 AudioKit,并在不需要时尝试将音频会话设置为非活动状态。所以,我写了一些简单的代码来理解这个过程的机制,并遇到了一个意想不到的麻烦。通过尝试停用会话,我收到错误:

[avas] AVAudioSession.mm:1079:-[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.
ViewController.swift:deactivateAudioSession():73:Error Domain=NSOSStatusErrorDomain Code=560030580 "(null)"

这是我的示例代码:

import UIKit
import AudioKit

class ViewController: UIViewController {
    var reverb: AKReverb?
    var delay: AKDelay?
    var chorus: AKChorus?
    var mic: AKMicrophone!

    override func viewDidLoad() {
        NotificationCenter.default.addObserver(self, selector: #selector(applicationWillResignActive),
                                               name: UIApplication.willResignActiveNotification,
                                               object: nil)

        NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive),
                                               name: UIApplication.didBecomeActiveNotification,
                                               object: nil)

        super.viewDidLoad()
        AKSettings.useBluetooth = true
        guard let mic = AKMicrophone() else { return }
        self.mic = mic
        chorus = AKChorus(mic)
        chorus?.depth = 1
        chorus?.frequency = 44000
        let delay = AKDelay(chorus)
        delay.feedback = 0.2
        reverb = AKReverb(delay)
        let mix = AKMixer(reverb)
        AudioKit.output = mix
    }

    @IBAction func launchEngine() {
        do {
            try AudioKit.start()
        } catch {
            AKLog(error)
        }
    }

    @IBAction func deactivateAudioSession() {
//        mic.stop()
//        reverb?.stop()
//        delay?.stop()
//        chorus?.stop()
        do {
            try AKSettings.session.setActive(false)
        } catch {
            AKLog(error)
        }
    }

    @objc func applicationDidBecomeActive() {
        launchEngine()
    }

    @objc func applicationWillResignActive() {
        deactivateAudioSession()
    }

}

如您所见,基本上,我想处理应用程序状态更改,但即使我deactivateAudioSession()使用 UI 调用方法也会发生此错误。我stop()在停用之前尝试了所有节点对象(注释代码),但错误仍然存​​在。我做错了什么?

标签: swiftavfoundationavaudiosessionaudiokit

解决方案


推荐阅读