Browse Source

Merge pull request #2 from kingosticks/master

Added repeat and shuffle support from kingosticks
ComlOnline 7 years ago
parent
commit
2bff5d0f21
1 changed files with 37 additions and 10 deletions
  1. 37 10
      src/spirc.rs

+ 37 - 10
src/spirc.rs

@@ -17,6 +17,9 @@ use protocol::spirc::{PlayStatus, State, MessageType, Frame, DeviceState};
 use mixer::Mixer;
 use player::Player;
 
+use rand;
+use rand::Rng;
+
 pub struct SpircTask {
     player: Player,
     mixer: Box<Mixer>,
@@ -396,6 +399,31 @@ impl SpircTask {
                 self.notify(None);
             }
 
+            MessageType::kMessageTypeRepeat => {
+                self.state.set_repeat(frame.get_state().get_repeat());
+                self.notify(None);
+            }
+
+            MessageType::kMessageTypeShuffle => {
+                self.state.set_shuffle(frame.get_state().get_shuffle());
+                if self.state.get_shuffle()
+                {
+                    let current_index = self.state.get_playing_track_index();
+                    {
+                        let tracks = self.state.mut_track();
+                        tracks.swap(0, current_index as usize);
+                        if let Some((_, rest)) = tracks.split_first_mut() {
+                            rand::thread_rng().shuffle(rest);
+                        }
+                    }
+                    self.state.set_playing_track_index(0);
+                } else {
+                    let context = self.state.get_context_uri();
+                    debug!("{:?}", context);
+                }
+                self.notify(None);
+            }
+
             MessageType::kMessageTypeSeek => {
                 let position = frame.get_position();
 
@@ -467,13 +495,19 @@ impl SpircTask {
 
     fn handle_next(&mut self) {
         let current_index = self.state.get_playing_track_index();
-        let new_index = (current_index + 1) % (self.state.get_track().len() as u32);
+        let num_tracks = self.state.get_track().len() as u32;
+        let new_index = (current_index + 1) % num_tracks;
+
+        let mut was_last_track = (current_index + 1) >= num_tracks;
+        if self.state.get_repeat() {
+            was_last_track = false;
+        }
 
         self.state.set_playing_track_index(new_index);
         self.state.set_position_ms(0);
         self.state.set_position_measured_at(now_ms() as u64);
 
-        self.load_track(true);
+        self.load_track(!was_last_track);
     }
 
     fn handle_prev(&mut self) {
@@ -520,14 +554,7 @@ impl SpircTask {
     }
 
     fn handle_end_of_track(&mut self) {
-        let current_index = self.state.get_playing_track_index();
-        let new_index = (current_index + 1) % (self.state.get_track().len() as u32);
-
-        self.state.set_playing_track_index(new_index);
-        self.state.set_position_ms(0);
-        self.state.set_position_measured_at(now_ms() as u64);
-
-        self.load_track(true);
+        self.handle_next();   
         self.notify(None);
     }