mirror of
https://github.com/librespot-org/librespot.git
synced 2024-12-18 17:11:53 +00:00
Merge pull request #2 from kingosticks/master
Added repeat and shuffle support from kingosticks
This commit is contained in:
commit
2bff5d0f21
1 changed files with 37 additions and 10 deletions
47
src/spirc.rs
47
src/spirc.rs
|
@ -17,6 +17,9 @@ use protocol::spirc::{PlayStatus, State, MessageType, Frame, DeviceState};
|
||||||
use mixer::Mixer;
|
use mixer::Mixer;
|
||||||
use player::Player;
|
use player::Player;
|
||||||
|
|
||||||
|
use rand;
|
||||||
|
use rand::Rng;
|
||||||
|
|
||||||
pub struct SpircTask {
|
pub struct SpircTask {
|
||||||
player: Player,
|
player: Player,
|
||||||
mixer: Box<Mixer>,
|
mixer: Box<Mixer>,
|
||||||
|
@ -396,6 +399,31 @@ impl SpircTask {
|
||||||
self.notify(None);
|
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 => {
|
MessageType::kMessageTypeSeek => {
|
||||||
let position = frame.get_position();
|
let position = frame.get_position();
|
||||||
|
|
||||||
|
@ -467,13 +495,19 @@ impl SpircTask {
|
||||||
|
|
||||||
fn handle_next(&mut self) {
|
fn handle_next(&mut self) {
|
||||||
let current_index = self.state.get_playing_track_index();
|
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_playing_track_index(new_index);
|
||||||
self.state.set_position_ms(0);
|
self.state.set_position_ms(0);
|
||||||
self.state.set_position_measured_at(now_ms() as u64);
|
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) {
|
fn handle_prev(&mut self) {
|
||||||
|
@ -520,14 +554,7 @@ impl SpircTask {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn handle_end_of_track(&mut self) {
|
fn handle_end_of_track(&mut self) {
|
||||||
let current_index = self.state.get_playing_track_index();
|
self.handle_next();
|
||||||
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.notify(None);
|
self.notify(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue