我有一个有两个功能的应用。一个人播放AKMetronome
并允许在应用不在前台时播放背景。另一种是使用AKMicrophone
的调谐器功能,只有在应用程序位于前台时才需要处于活动状态。这些功能可以同时使用(调谐器处于活动状态时闪烁的节拍器灯)。
当我按下主页按钮时,节拍器继续播放(如预期的那样)。但是,调谐器的有源麦克风还会在所有其他应用中导致设备顶部的bright red "recording"-style bar。当应用程序未打开时,我不需要调谐器才能正常工作。
如何禁用AKMicrophone
节点,以便此栏不会显示,同时保持AKMetronome
节点不间断播放?
我尝试了以下方法,但都没有成功:
AudioKit.stop()
方法中调用applicationWillResignActive()
。这摆脱了录音条,但停止了节拍器。stop()
期间在AKMicrophone
节点上呼叫applicationWillResignActive()
。这不会删除录制栏。stop()
期间在disconnectOutput()
节点上呼叫AKMicrophone
和applicationWillResignActive()
。这也不会删除记录栏。我怀疑我可能需要杀死整个引擎(即AudioKit.stop()
),从链中删除麦克风节点,然后重建并重新启动引擎,所有这些都在applicationWillResignActive
方法中。但那会中断AKMetronome
的速度,所以我希望它不会出现。
答案 0 :(得分:2)
我认为您应该将AudioKit用于节拍器,并使用称为AKMicrophoneTracker的AudioKit的一部分作为调谐器。
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。