Подтвердить что ты не робот

SKAudioNode() вылетает при подключении/отключении наушников

Я использую SKAudioNode() для воспроизведения фоновой музыки в своей игре. У меня есть функция воспроизведения/паузы, и все работает нормально, пока я не подключу наушники. Звука вообще нет, и когда я вызываю функцию паузы/воспроизведения, я получаю эту ошибку

AVAudioPlayerNode.mm:333: Начало: обязательное условие ложно: _engine- > IsRunning() com.apple.coreaudio.avfaudio ', причина:' обязательное условие false: _engine- > IsRunning()

Кто-нибудь знает, что это значит?

Код:

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
        } 
    }
}
}
4b9b3361

Ответ 1

Я не смог это исправить, но, используя AVAudioPlayer(), я нашел хорошее обходное решение. Спасибо всем за поддержку!

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()
        }        
    }    
}

Ответ 2

SKScene имеет свойство с именем audioEngine, которое остановлено при определенных обстоятельствах. Если вы используете ReplayKit, например, играя записанный видеоролик в RPPreviewController, приветствуете аудио и останавливаете его, поэтому, когда вы его отклоняете, audioEngine больше не работает.

У меня была эта проблема и я решил ее, выполнив простую проверку и снова запустив audioEngine. Попробуйте следующее:

if !self.audioEngine.isRunning {
    do {
        try self.audioEngine.start()
    } catch {
        //handle error
    }
}