title: Audiokit crashes when changing AKPlayer file
body: <p>I have recently done the migration from AudioKit 3.7 to 4.2 (using Cocoapods), needed for XCode 9.3. I followed the migration guide and changed AKAudioPlayer to AKPlayer.</p>
  
  <h2>The issue</h2>
  
  <p>When AKPlayer plays an audio file, AudioKit is crashing with this error:</p>
  
  <pre>
  2018-04-17 09:32:43.042658+0200 hearfit[3509:2521326] [avae] AVAEInternal.h:103:_AVAE_CheckNoErr: [AVAudioEngineGraph.mm:3632:UpdateGraphAfterReconfig: (AUGraphParser::InitializeActiveNodesInOutputChain(ThisGraph, kOutputChainFullTraversal, *conn.srcNode, isChainActive)): error -10875
  2018-04-17 09:32:43.049372+0200 hearfit[3509:2521326] *** Terminating app due to uncaught exception 'com.apple.coreaudio.avfaudio', reason: 'error -10875'
  *** First throw call stack:
  (0x1847d6d8c 0x1839905ec 0x1847d6bf8 0x18a0ff1a0 0x18a11bf58 0x18a12aab0 0x18a128cdc 0x18a1a1738 0x18a1a160c 0x10519192c 0x10519d2f4 0x10519d64c 0x10503afdc 0x10507c4a0 0x10507c01c 0x104f6d9cc 0x1852233d4 0x18477faa8 0x18477f76c 0x18477f010 0x18477cb60 0x18469cda8 0x18667f020 0x18e67d78c 0x10504dfd4 0x18412dfc0)
  libc++abi.dylib: terminating with uncaught exception of type NSException
  </pre>
  
  <p>Sometimes it happens on the first play, and sometimes the first play is done correctly, but not the second one.</p>
  
  <p>Everything was working great before the migration. I also tried to keep AKAudioPlayer: sounds are played correctly but AKFrequencyTracker does not work anymore.</p>
  
  <h2>Context</h2>
  
  <p>This is my setup:</p>
  
  <p><a href="https://i.stack.imgur.com/bH4Ln.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/bH4Ln.png" alt="setup"></a>
  Quick explanation:</p>
  
  <ul>
  <li><code>AKPlayer 1</code> plays short audio files (between 1 and 5 seconds)</li>
  <li><code>AKFrequencyTracker</code> is used to display a plot</li>
  <li><code>AKPlayer 2</code> plays background sound (volume must be configurable)</li>
  <li><code>AKWhiteNoise</code> allows to do some manual volume measurements (using <code>AKMixer 2</code> volume property)</li>
  </ul>
  
  <h2>Use case example</h2>
  
  <p>The user starts an exercise. A sound is played continuously (with looping) using <code>AKPlayer 2</code> and the user listens a word (played with <code>AKPlayer 1</code>), the plot is displayed. Next, several words are displayed on screen and the user must pick the right one. And a new word is listened... and so on.</p>
  
  <p>So I have to change dynamically the played file of AKPlayer 1. All the code is written in a dedicated class, a singleton. All the nodes are setup in the <code>init()</code> function.</p>
  
  <pre><code>// singleton
  static let main = AudioPlayer()
  private init() {
  
      let silenceUrl = Bundle.main.url(forResource: "silence", withExtension: "m4a", subdirectory: "audio")
      self.silenceFile = silenceUrl!
  
      self.mainPlayer = AKPlayer(url: self.silenceFile)!
      self.mainPlayer.volume = 1.0
  
      self.freqTracker = AKFrequencyTracker(self.mainPlayer, hopSize: 256, peakCount: 10)
  
      let noiseUrl = Bundle.main.url(forResource: "cocktail-party", withExtension: "m4a", subdirectory: "audio")
      self.noiseFile = noiseUrl!
  
      self.noisePlayer = AKPlayer(url: self.noiseFile)!
  
      self.noisePlayer.volume = 1.0
      self.noisePlayer.isLooping = true
  
      let mixer = AKMixer(self.freqTracker, self.noisePlayer)
  
      self.whiteNoise = AKWhiteNoise(amplitude: 1.0)
      self.whiteNoiseMixer = AKMixer(self.whiteNoise)
      self.whiteNoiseMixer.volume = 0
      self.mixer = AKMixer(mixer, self.whiteNoiseMixer)
  
      AudioKit.output = self.mixer
      do {
          try AudioKit.start()
      } catch (let error) {
          print(error)
      }
  
      // stop directly the white noise mixer
      self.whiteNoise.stop()
      self.whiteNoiseMixer.volume = self.whiteNoiseVolume
  
      self.mainPlayer.completionHandler = {
          DispatchQueue.main.async {
              if let timer = self.timer {
                  timer.invalidate()
                  self.timer = nil
              }
  
              if let completion = self.completionHandler {
                  Timer.scheduledTimer(withTimeInterval: 0.5, repeats: false, block: { (_) in
                      completion()
                      self.completionHandler = nil
                  })
              }
          }
      }
  }
  </code></pre>
  
  <p>To change the <code>AKPlayer 1</code> audio file, I use this function, on the same class:</p>
  
  <pre><code>func play(fileUrl: URL, tracker: @escaping TrackerCallback, completion: (() -&gt; Void)?) throws {
  
      self.completionHandler = completion
      let file = try AKAudioFile(forReading: fileUrl)
  
      self.mainPlayer.load(audioFile: file)
      self.mainPlayer.preroll()
  
      self.timer = Timer.scheduledTimer(withTimeInterval: self.trackerRefreshRate, repeats: true) { (timer) in
          tracker(self.freqTracker.frequency, self.freqTracker.amplitude)
      }
  
      self.mainPlayer.play()
  }
  </code></pre>
  
  <p>Thank you.</p>