title: iOS, swift: play background music and sound effects without delay
body: <p>I am trying to create a game in iOS without using SpriteKit. 
  I am stuck in getting the sound effects to play in a timely manner. I've been using the following code which I have found online and the background music plays great. However, when I use the 
  "playSoundEffect" method it plays ok the first time but then starts to lag behind and becomes out of sync. I guess that happens because it initializes an AVAudioPlayer every time. 
  Anyone have a good idea in how to play sound effects in a timely manner, while also playing background music? Thanks!</p>
  
  <pre><code>import AVFoundation
  
  public class SKTAudio: NSObject, AVAudioPlayerDelegate {
  public var backgroundMusicPlayer: AVAudioPlayer?
  public var soundEffectPlayer: AVAudioPlayer?
  
  private var mainLoopFileName:String! {
  
      let randomSong = Int(arc4random_uniform(3))
  
      switch randomSong {
      //case 0: return "Test.mp3"
      //case 1: return "Test2.mp3"
      case 0: return "SneakySnitch.mp3"
      case 1: return "FasterDoesIt.mp3"
      case 2: return "MonkeysSpinningMonkeys.mp3"
      default:
          break
      }
  
      return "SneakySnitch.mp3"
  }
  
  public class func sharedInstance() -&gt; SKTAudio {
      return SKTAudioInstance
  }
  
  public func playBackgroundMusic() {
      let filename = mainLoopFileName
      let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
      if (url == nil) {
          println("Could not find file: \(filename)")
          return
      }
  
      var error: NSError? = nil
      backgroundMusicPlayer = AVAudioPlayer(contentsOfURL: url, error: &amp;error)
      if let player = backgroundMusicPlayer {
          player.numberOfLoops = 0
          player.delegate = self
          player.prepareToPlay()
          player.play()
      } else {
          println("Could not create audio player: \(error!)")
      }
  }
  
  public func pauseBackgroundMusic() {
      if let player = backgroundMusicPlayer {
          if player.playing {
              player.pause()
          }
      }
  }
  
  public func resumeBackgroundMusic() {
      if let player = backgroundMusicPlayer {
          if !player.playing {
              player.play()
          }
      }
  }
  
  public func playSoundEffect(filename: String) {
      let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
      if (url == nil) {
          println("Could not find file: \(filename)")
          return
      }
  
      var error: NSError? = nil
      soundEffectPlayer = AVAudioPlayer(contentsOfURL: url, error: &amp;error)
      if let player = soundEffectPlayer {
          player.numberOfLoops = 0
          player.prepareToPlay()
          player.play()
      } else {
          println("Could not create audio player: \(error!)")
      }
  }
  
  // MARK: AVAudioPlayerDelegate
  public func audioPlayerDidFinishPlaying(player: AVAudioPlayer!, successfully flag: Bool) {
      println("finished playing \(flag)")
  
      delay(5.0, {
          self.playBackgroundMusic()
      })
  }
  
  public func audioPlayerDecodeErrorDidOccur(player: AVAudioPlayer!, error: NSError!) {
      println("\(error.localizedDescription)")
  }
  
  }
  </code></pre>