AVAudioUnitSampler在耳机路由改变后生成正弦波,iOS 11 iPhone

Elo*_*rin 5 iphone audiounit ios avaudioengine audiokit

使用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)
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经分叉了AudioKit并用一个最小的项目替换了HelloWorld示例,我可以用它来重现这个问题.

此外,我无法在iOS 9.3和11下在iPad上重现此问题,因此这可能是特定于iPhone的问题.

任何有关如何继续调试的帮助或建议都会非常受欢迎,我对此非常困惑,而且我并不是iOS音频开发方面的专家.

谢谢!

Gen*_*isa 2

您可以尝试检查引擎是否在handleRouteChange中启动,如果启动则将其弹开,而不是仅仅启动它。让我们知道这是否有效。