From 22d586e4734482b07ac433b7a5bee2ce73ce5ddd Mon Sep 17 00:00:00 2001 From: Paul Lietar Date: Mon, 28 Dec 2015 18:45:13 +0100 Subject: [PATCH] Block player thread when nothing is playing. --- src/mercury.rs | 4 ++-- src/player.rs | 20 +++++++++++++------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src/mercury.rs b/src/mercury.rs index b905bfce..98176ac6 100644 --- a/src/mercury.rs +++ b/src/mercury.rs @@ -1,5 +1,5 @@ use byteorder::{BigEndian, ByteOrder, ReadBytesExt, WriteBytesExt}; -use eventual; +use eventual::{self, Async}; use protobuf::{self, Message}; use std::collections::HashMap; use std::io::{Cursor, Read, Write}; @@ -100,7 +100,7 @@ impl MercuryManager { uri: uri, content_type: None, payload: Vec::new() - }); + }).fire(); rx } diff --git a/src/player.rs b/src/player.rs index 1af6d014..935d866e 100644 --- a/src/player.rs +++ b/src/player.rs @@ -85,8 +85,14 @@ impl PlayerInternal { let mut decoder = None; loop { - match self.commands.try_recv() { - Ok(PlayerCommand::Load(track_id, play, position)) => { + let cmd = if self.state.0.lock().unwrap().status == PlayStatus::kPlayStatusPlay { + self.commands.try_recv().ok() + } else { + Some(self.commands.recv().unwrap()) + }; + + match cmd { + Some(PlayerCommand::Load(track_id, play, position)) => { self.update(|state| { if state.status == PlayStatus::kPlayStatusPlay { stream.stop().unwrap(); @@ -133,7 +139,7 @@ impl PlayerInternal { }); println!("Load Done"); } - Ok(PlayerCommand::Seek(ms)) => { + Some(PlayerCommand::Seek(ms)) => { decoder.as_mut().unwrap().time_seek(ms as f64 / 1000f64).unwrap(); self.update(|state| { state.position_ms = (decoder.as_mut().unwrap().time_tell().unwrap() * 1000f64) as u32; @@ -141,7 +147,7 @@ impl PlayerInternal { return true; }); }, - Ok(PlayerCommand::Play) => { + Some(PlayerCommand::Play) => { self.update(|state| { state.status = PlayStatus::kPlayStatusPlay; return true; @@ -149,7 +155,7 @@ impl PlayerInternal { stream.start().unwrap(); }, - Ok(PlayerCommand::Pause) => { + Some(PlayerCommand::Pause) => { self.update(|state| { state.status = PlayStatus::kPlayStatusPause; state.update_time = util::now_ms(); @@ -158,7 +164,7 @@ impl PlayerInternal { stream.stop().unwrap(); }, - Ok(PlayerCommand::Stop) => { + Some(PlayerCommand::Stop) => { self.update(|state| { if state.status == PlayStatus::kPlayStatusPlay { state.status = PlayStatus::kPlayStatusPause; @@ -169,7 +175,7 @@ impl PlayerInternal { stream.stop().unwrap(); decoder = None; }, - Err(..) => (), + None => (), } if self.state.0.lock().unwrap().status == PlayStatus::kPlayStatusPlay {