Search code examples
swiftsprite-kitswift2avaudioengineskaudionode

SKAudioNode() crashes when plugging in/out headphones


I am using a SKAudioNode() to play background music in my game. I have a play/pause function and everything is working fine until I plug in my headphones. There is no sound at all and when I call the pause/play function I get this error

AVAudioPlayerNode.mm:333: Start: required condition is false: _engine->IsRunning() com.apple.coreaudio.avfaudio', reason: 'required condition is false: _engine->IsRunning()

Does anyone knows what this means?

Code:

import SpriteKit

class GameScene: SKScene {

let loop = SKAudioNode(fileNamed: "gameloop.mp3")
let play = SKAction.play()
let pause = SKAction.pause()
var isPlaying = Bool()

override func didMoveToView(view: SKView) {  
    loop.runAction(play)
    isPlaying = true
    self.addChild(loop)
}

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    _ = touches.first as UITouch!

    for _ in touches {
        if isPlaying {
            loop.runAction(pause)
            isPlaying = false
        } else {
            loop.runAction(play)
            isPlaying = true
        } 
    }
}
}

Solution

  • I was not able fix it, but by using AVAudioPlayer() I found a good workaround. Thank you all for supporting me!

    import SpriteKit
    import AVFoundation
    
    class GameScene: SKScene {    
        var audioPlayer = AVAudioPlayer()  
    
        override func didMoveToView(view: SKView) {        
            initAudioPlayer("gameloop.mp3")        
        }
    
        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {        
            _ = touches.first as UITouch!
            for _ in touches {
                toggleBackgroundMusic()            
            }        
        }
    
        func initAudioPlayer(filename: String) {        
            let url = NSBundle.mainBundle().URLForResource(filename, withExtension: nil)
            guard let newURL = url else {
                print("Could not find file: \(filename)")
                return
            }
            do {
                audioPlayer = try AVAudioPlayer(contentsOfURL: newURL)
                audioPlayer.numberOfLoops = -1
                audioPlayer.prepareToPlay()
                audioPlayer.play()
            } catch let error as NSError {
                print(error.description)
            }        
        }
    
        func toggleBackgroundMusic() {        
            if audioPlayer.playing {
                audioPlayer.pause()
            } else {
                audioPlayer.play()
            }        
        }    
    }