SKAudioNode() вылетает при подключении / отключении наушников
Я использую SKAudioNode()
играть фоновую музыку в моей игре. У меня есть функция воспроизведения / паузы, и все работает нормально, пока я не подключу наушники. Нет звука вообще, и когда я вызываю функцию паузы / воспроизведения, я получаю эту ошибку
AVAudioPlayerNode.mm:333: Запуск: обязательное условие ложно: _engine->IsRunning() com.apple.coreaudio.avfaudio', причина: ' обязательное условие ложно: _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
}
}
}
}
2 ответа
Я не смог это исправить, но с помощью 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()
}
}
}
У SKScene есть свойство с именем audioEngine, которое останавливается при определенных обстоятельствах. Если вы, например, используете ReplayKit, при воспроизведении записанного игрового фильма в высокопроизводительном устройстве RPPreviewController звук воспроизводится и останавливается, поэтому при отклонении его audioEngine больше не работает.
У меня была эта проблема, и я решил ее, выполнив простую проверку и снова запустив AudioEngine. Попробуй это:
if !self.audioEngine.isRunning {
do {
try self.audioEngine.start()
} catch {
//handle error
}
}