使用 AVAudioUnitSampler 时,我在 iPhone (iOS 11) 上遇到了一个奇怪的问题。
假设我有一个用钢琴声音初始化的 AVAudioUnitSampler。所以,每次我连接或断开耳机时,我都会听到钢琴声加上一个正弦波音,我连接/断开耳机的次数越多,声音就越大。
所以,对我来说,每次插入/拔出耳机时,都会有一个新的音频单元采样器在内部连接到声音输出(并且,由于它未初始化,它只生成正弦波音调)。
下面的类已经显示了这个问题。请注意,我正在使用AudioKit来处理 MIDI 信号并触发采样器(尽管在那一端似乎一切正常,即startNote()
并且stopNote()
被正确调用):
class MidiController: NSObject, AKMIDIListener {
var midi = AKMIDI()
var engine = AVAudioEngine()
var samplerUnit = AVAudioUnitSampler()
override public init() {
super.init()
NotificationCenter.default.addObserver(
self,
selector: #selector(handleRouteChange),
name: .AVAudioSessionRouteChange,
object: nil)
midi.openInput()
midi.addListener(self)
engine.attach(samplerUnit)
engine.connect(samplerUnit, to: engine.outputNode)
startEngine()
}
func startEngine() {
if (!engine.isRunning) {
do {
try self.engine.start()
} catch {
fatalError("couldn't start engine.")
}
}
}
@objc func handleRouteChange(notification: NSNotification) {
let deadlineTime = DispatchTime.now() + .milliseconds(100)
DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
self.startEngine()
}
}
func receivedMIDINoteOn(noteNumber: MIDINoteNumber, velocity:MIDIVelocity, channel: MIDIChannel) {
if velocity > 0 {
samplerUnit.startNote(noteNumber: noteNumber, velocity: 127, channel: 0)
} else {
samplerUnit.stopNote(noteNumber: noteNumber, channel: 0)
}
}
func receivedMIDINoteOff(noteNumber: MIDINoteNumber, velocity: MIDIVelocity, channel: MIDIChannel) {
samplerUnit.stopNote(noteNumber: noteNumber, channel: 0)
}
}
我已经分叉了 AudioKit,并用一个可以重现此问题的最小项目替换了 HelloWorld 示例。
此外,我无法在 iOS 9.3 和 11 下的 iPad 上重现此问题,因此这可能是 iPhone 特有的问题。
任何有关如何继续调试的帮助或建议都将非常受欢迎,我对此感到非常困惑,而且我并不是 iOS 音频开发方面的专家。
谢谢!