2017-02-14 2 views
4

Я разрабатываю игру, которая включает в себя проигрыватель аудиодорожек в фоновом режиме. При работе с приостановкой всех дорожек, а затем возобновлять при нажатии кнопки паузы, я не нашел никакой существенной трудности:AVAudioSession прерывания и изменения маршрута

class AudioMultiTrack { 

var tracks  : [AudioTrack] 
var mixer  : AVAudioMixerNode 
var pauseTime : AVAudioTime? 

var engine  = AVAudioEngine() 
var volumes = [Float]() 

init(audioTracks: [AudioTrack]){ 
    tracks = audioTracks 
    mixer = engine.mainMixerNode 
} 

func initialize() { 
    for track in tracks { 
     track.setUpTrack() 
     engine.attach(track.audioPlayer) 
     engine.connect(track.audioPlayer, to: mixer, format: track.format) 
     track.scheduleFile() 
    } 

    do { 
     try engine.start() 
    } catch { 
     fatalError("error starting engine") 
    } 
} 

func play() { 
    for track in tracks { 
     track.audioPlayer.play(at: startTime()) 
    } 
} 

func pause() { 
    pauseTime = tracks[0].audioPlayer.lastRenderTime 

    for track in tracks { 
     track.audioPlayer.pause() 
    } 

} 

func unPause() { 

    for track in tracks { 
     track.scheduleFile() 
     track.audioPlayer.play(at: pauseTime) 
    } 
} 

func stop() { 
    pauseTime = tracks[0].audioPlayer.lastRenderTime 
    engine.stop() 

    for track in tracks { 
     engine.detach(track.audioPlayer) 
    } 

    engine.reset() 
} 

func startTime() ->AVAudioTime { 
    let sampleRate = tracks[0].format.sampleRate 
    let sampleTime = AVAudioFramePosition(sampleRate) 

    return AVAudioTime(sampleTime: sampleTime, atRate: sampleRate) 
} 

Когда пауза нажата в GameViewController:

func pausePressed() { 
    audio.pause() 
} 

func continuePressed() { 
    audio.unPause() 
} 

Однако, когда дело с перерывами или изменения маршрута в этой манере:

func handleInterruption(notification: NSNotification) { 
    guard let info = notification.userInfo else { return } 

    switch info[AVAudioSessionInterruptionTypeKey] as! Int { 
    case 0: 
     audio.unPause() 
    case 1: 
     audio.pause() 
    default: 
     break; 
    } 
} 

программа аварий и я получаю:

*** Нагрузочный приложение из-за неперехваченного исключением «com.apple.coreaudio.avfaudio», причина: «Необходимым условием является ложным: _engine-> IsRunning()»

Так это выглядит, как звуковой движок останавливается, и я не хочу повторно инициализировать аудиоплеер по ряду причин, включая время установки и непрерывность игрового процесса ...

Я правильно в моей оценке проблемы? Если да, то как я могу заставить звуковой движок работать через перерыв или изменение маршрута?

ответ

0

Я не думаю, что это возможно, потому что вы создаете аудиоплеер на звук, его нужно подготовить, настроить оборудование и т. Д. Когда звук завершится, эта настройка будет удалена и должна быть выполнена снова. То есть возможно, не удастся заставить звуковой движок «работать».