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

Posted

技术标签:

【中文标题】AVAudioUnitSampler 在耳机路由更改后生成正弦波,iOS 11 iPhone【英文标题】:AVAudioUnitSampler generates sinewaves after headphones route change, iOS 11 iPhone 【发布时间】:2017-11-07 14:22:51 【问题描述】:

在使用 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 并用 minimal project 替换了 HelloWorld 示例,我可以用它来重现这个问题。

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

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

谢谢!

【问题讨论】:

【参考方案1】:

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

【讨论】:

以上是关于AVAudioUnitSampler 在耳机路由更改后生成正弦波,iOS 11 iPhone的主要内容,如果未能解决你的问题,请参考以下文章

iPhone AudioServicesPlaySystemSound:通过耳机路由?

AVplayer 音频路由到扬声器和耳机

将音频呼叫路由到有线耳机

蓝牙耳机配对后,如何将音频路由到蓝牙耳机

Android,插入耳机后如何将音频路由到扬声器?

如何通过 Apple 设备的内部扬声器路由音频,避免使用耳机?