|
@@ -25,7 +25,6 @@ pub struct SpircManager<D: SpircDelegate> {
|
|
|
|
|
|
repeat: bool,
|
|
|
shuffle: bool,
|
|
|
- volume: u16,
|
|
|
|
|
|
is_active: bool,
|
|
|
became_active_at: i64,
|
|
@@ -44,6 +43,7 @@ pub trait SpircDelegate {
|
|
|
fn play(&self);
|
|
|
fn pause(&self);
|
|
|
fn seek(&self, position_ms: u32);
|
|
|
+ fn volume(&self, vol:i32);
|
|
|
fn stop(&self);
|
|
|
|
|
|
fn state(&self) -> MutexGuard<Self::State>;
|
|
@@ -55,6 +55,7 @@ pub trait SpircState {
|
|
|
fn position(&self) -> (u32, i64);
|
|
|
fn update_time(&self) -> i64;
|
|
|
fn end_of_track(&self) -> bool;
|
|
|
+ fn volume(&self) -> u32;
|
|
|
}
|
|
|
|
|
|
impl<D: SpircDelegate> SpircManager<D> {
|
|
@@ -77,7 +78,6 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
|
|
|
repeat: false,
|
|
|
shuffle: false,
|
|
|
- volume: 0x8000,
|
|
|
|
|
|
is_active: false,
|
|
|
became_active_at: 0,
|
|
@@ -156,6 +156,7 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
self.tracks = frame.get_state()
|
|
|
.get_track()
|
|
|
.iter()
|
|
|
+ .filter(|track| track.get_gid().len()==16)
|
|
|
.map(|track| SpotifyId::from_raw(track.get_gid()))
|
|
|
.collect();
|
|
|
|
|
@@ -170,6 +171,16 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
protocol::spirc::MessageType::kMessageTypePause => {
|
|
|
self.delegate.pause();
|
|
|
}
|
|
|
+ protocol::spirc::MessageType::kMessageTypeNext => {
|
|
|
+ self.index = (self.index + 1) % self.tracks.len() as u32;
|
|
|
+ let track = self.tracks[self.index as usize];
|
|
|
+ self.delegate.load(track, true, 0);
|
|
|
+ }
|
|
|
+ protocol::spirc::MessageType::kMessageTypePrev => {
|
|
|
+ self.index = (self.index - 1) % self.tracks.len() as u32;
|
|
|
+ let track = self.tracks[self.index as usize];
|
|
|
+ self.delegate.load(track, true, 0);
|
|
|
+ }
|
|
|
protocol::spirc::MessageType::kMessageTypeSeek => {
|
|
|
self.delegate.seek(frame.get_position());
|
|
|
}
|
|
@@ -179,6 +190,9 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
self.delegate.stop();
|
|
|
}
|
|
|
}
|
|
|
+ protocol::spirc::MessageType::kMessageTypeVolume =>{
|
|
|
+ self.delegate.volume(frame.get_volume() as i32);
|
|
|
+ }
|
|
|
_ => (),
|
|
|
}
|
|
|
}
|
|
@@ -249,7 +263,7 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
sw_version: version_string(),
|
|
|
is_active: self.is_active,
|
|
|
can_play: self.can_play,
|
|
|
- volume: self.volume as u32,
|
|
|
+ volume: self.delegate.state().volume(),
|
|
|
name: self.name.clone(),
|
|
|
error_code: 0,
|
|
|
became_active_at: if self.is_active { self.became_active_at as i64 } else { 0 },
|