AudioKit:我可以在不调用 AudioKit.stop() 的情况下禁用 AKMicrophone 吗?

AudioKit: Can I disable an AKMicrophone without calling AudioKit.stop()?

我有一个具有两个功能的应用程序。当应用程序不在前台时,播放 AKMetronome 并允许后台播放。另一个是使用 AKMicrophone 的调谐器功能,仅当应用程序位于前台时才需要激活。这些功能可以同时使用(调谐器处于活动状态时节拍器灯闪烁)。

当我按下主页按钮时,节拍器继续播放(符合预期)。但是调谐器的活动麦克风也会导致所有其他应用程序的设备顶部出现 bright red "recording"-style bar。不过,当应用程序未打开时,我不需要调谐器来运行。

如何禁用 AKMicrophone 节点,使该栏不显示,同时保持 AKMetronome 节点播放不间断?

我尝试了以下方法,但都没有成功:

我怀疑我可能需要终止整个引擎(即 AudioKit.stop()),从链中删除麦克风节点,然后重建并重新启动引擎,所有这些都在 applicationWillResignActive 方法中。但这会打断 AKMetronome 的节奏,所以我希望它不会变成那样。

我认为您应该将 AudioKit 用于节拍器,并将 AudioKit 的一部分称为 AKMicrophoneTracker 用于调谐器。

http://audiokit.io/docs/Classes/AKMicrophoneTracker.html https://github.com/AudioKit/AudioKit/blob/master/AudioKit/Common/Internals/Microphone%20Tracker/AKMicrophoneTracker.swift

AudioKit 使用 AVAudioEngine 作为其信号流,而跟踪器实际上是一个完全独立的基于 EZAudio 的信号流。我相信两者可以独立使用。

您当前跟踪麦克风的方式可能与此类似: http://audiokit.io/playgrounds/Analysis/Tracking%20Microphone%20Input/

你会想要让它更像这样:

let tracker = AKMicrophoneTracker()
tracker.start()

//: User Interface
import AudioKitUI

class LiveView: AKLiveViewController {

    var trackedAmplitudeSlider: AKSlider?
    var trackedFrequencySlider: AKSlider?

    override func viewDidLoad() {

        AKPlaygroundLoop(every: 0.1) {
            self.trackedAmplitudeSlider?.value = tracker.amplitude
            self.trackedFrequencySlider?.value = tracker.frequency
        }

        addTitle("Tracking With Microphone Tracker")

        trackedAmplitudeSlider = AKSlider(property: "Tracked Amplitude", range: 0 ... 0.8) { _ in
            // Do nothing, just for display
        }
        addView(trackedAmplitudeSlider)

        trackedFrequencySlider = AKSlider(property: "Tracked Frequency",
                                          range: 0 ... 2_400,
                                          format: "%0.3f Hz"
        ) { _ in
            // Do nothing, just for display
        }
        addView(trackedFrequencySlider)

    }
}

HTH.