From 506f3e624e9d69796f8c70f694a29da7a9f9b977 Mon Sep 17 00:00:00 2001 From: Paul Lietar Date: Thu, 9 Jul 2015 22:32:40 +0100 Subject: [PATCH] =?UTF-8?q?Don=E2=80=99t=20crash=20on=20end=20of=20track.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/player.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src/player.rs b/src/player.rs index d88c3cca..d55eae0e 100644 --- a/src/player.rs +++ b/src/player.rs @@ -160,8 +160,8 @@ impl <'s> PlayerInternal<'s> { } if self.state.0.lock().unwrap().status == PlayStatus::kPlayStatusPlay { - match decoder.as_mut().unwrap().packets().next().unwrap() { - Ok(packet) => { + match decoder.as_mut().unwrap().packets().next() { + Some(Ok(packet)) => { match stream.write(&packet.data) { Ok(_) => (), Err(portaudio::PaError::OutputUnderflowed) @@ -169,8 +169,17 @@ impl <'s> PlayerInternal<'s> { Err(e) => panic!("PA Error {}", e) }; }, - Err(vorbis::VorbisError::Hole) => (), - Err(e) => panic!("Vorbis error {:?}", e) + Some(Err(vorbis::VorbisError::Hole)) => (), + Some(Err(e)) => panic!("Vorbis error {:?}", e), + None => { + self.update(|state| { + state.status = PlayStatus::kPlayStatusStop; + return true; + }); + + stream.stop().unwrap(); + decoder = None; + } } self.update(|state| { @@ -199,7 +208,6 @@ impl <'s> PlayerInternal<'s> { if update { guard.update_time = util::now_ms(); self.state.1.notify_all(); - } } }