2017-11-07 18 views
4

AVAudioUnitSampler를 사용할 때 iPhone (iOS 11)에서 이상한 문제가 있습니다.AVAudioUnitSampler는 헤드폰 경로 변경 후 사인파를 생성합니다. iOS 11 iPhone

내가 AVAudioUnitSampler를 피아노 사운드로 초기화했다고 가정 해 봅니다. 그래서 헤드폰을 연결하거나 분리 할 때마다 피아노 사운드 사인파 톤이 더해져 소리가 더 커지면 헤드폰을 연결/분리하는 횟수가 늘어납니다.

그래서 저에게 헤드폰을 꽂거나 뺄 때마다 새로운 오디오 유닛 샘플러가 사운드 출력에 내부적으로 부착되어있는 것처럼 느껴집니다 (그리고 초기화되지 않았기 때문에 그냥 생성됩니다). 사인파 톤).

다음 클래스는 이미 문제를 보여줍니다. 내가 MIDI 신호를 처리하고 샘플러를 트리거 AudioKit를 사용하고 있습니다 (., 즉 그 때문에 모든 것을에서 잘 작동하는 것 같다 있지만 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 오디오 개발에 대한 전문가는 아닙니다.

감사합니다.

답변

2

엔진이 handleRouteChange에서 시작되었는지 확인한 다음 시작하는 대신 바운스 시도 할 수 있습니다. 그게 작동하는지 알려주세요.