|
@@ -1,18 +1,18 @@
|
|
|
use eventual::Async;
|
|
|
use protobuf::{self, Message};
|
|
|
-use std::sync::{mpsc, MutexGuard};
|
|
|
|
|
|
use util;
|
|
|
use session::Session;
|
|
|
use util::SpotifyId;
|
|
|
use util::version::version_string;
|
|
|
use mercury::{MercuryRequest, MercuryMethod};
|
|
|
+use player::Player;
|
|
|
|
|
|
use librespot_protocol as protocol;
|
|
|
pub use librespot_protocol::spirc::PlayStatus;
|
|
|
|
|
|
-pub struct SpircManager<D: SpircDelegate> {
|
|
|
- delegate: D,
|
|
|
+pub struct SpircManager {
|
|
|
+ player: Player,
|
|
|
session: Session,
|
|
|
|
|
|
state_update_id: i64,
|
|
@@ -36,36 +36,13 @@ pub struct SpircManager<D: SpircDelegate> {
|
|
|
index: u32,
|
|
|
}
|
|
|
|
|
|
-pub trait SpircDelegate {
|
|
|
- type State : SpircState;
|
|
|
-
|
|
|
- fn load(&self, track: SpotifyId, start_playing: bool, position_ms: u32);
|
|
|
- fn play(&self);
|
|
|
- fn pause(&self);
|
|
|
- fn seek(&self, position_ms: u32);
|
|
|
- fn volume(&self, vol: u16);
|
|
|
- fn stop(&self);
|
|
|
-
|
|
|
- fn state(&self) -> MutexGuard<Self::State>;
|
|
|
- fn updates(&self) -> mpsc::Receiver<i64>;
|
|
|
-}
|
|
|
-
|
|
|
-pub trait SpircState {
|
|
|
- fn status(&self) -> PlayStatus;
|
|
|
- fn position(&self) -> (u32, i64);
|
|
|
- fn update_time(&self) -> i64;
|
|
|
- fn end_of_track(&self) -> bool;
|
|
|
- fn volume(&self) -> u16;
|
|
|
-}
|
|
|
-
|
|
|
-impl<D: SpircDelegate> SpircManager<D> {
|
|
|
- pub fn new(session: Session, delegate: D) -> SpircManager<D> {
|
|
|
-
|
|
|
+impl SpircManager {
|
|
|
+ pub fn new(session: Session, player: Player) -> SpircManager {
|
|
|
let ident = session.0.data.read().unwrap().device_id.clone();
|
|
|
let name = session.0.config.device_name.clone();
|
|
|
|
|
|
SpircManager {
|
|
|
- delegate: delegate,
|
|
|
+ player: player,
|
|
|
session: session,
|
|
|
|
|
|
state_update_id: 0,
|
|
@@ -99,7 +76,7 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
.unwrap()
|
|
|
.canonical_username
|
|
|
.clone()));
|
|
|
- let updates = self.delegate.updates();
|
|
|
+ let updates = self.player.updates();
|
|
|
|
|
|
self.notify(true, None);
|
|
|
|
|
@@ -122,11 +99,11 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
}
|
|
|
},
|
|
|
update_time = updates.recv() => {
|
|
|
- let end_of_track = self.delegate.state().end_of_track();
|
|
|
+ let end_of_track = self.player.state().end_of_track();
|
|
|
if end_of_track {
|
|
|
self.index = (self.index + 1) % self.tracks.len() as u32;
|
|
|
let track = self.tracks[self.index as usize];
|
|
|
- self.delegate.load(track, true, 0);
|
|
|
+ self.player.load(track, true, 0);
|
|
|
} else {
|
|
|
self.state_update_id = update_time.unwrap();
|
|
|
self.notify(false, None);
|
|
@@ -156,26 +133,26 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
let play = frame.get_state().get_status() == PlayStatus::kPlayStatusPlay;
|
|
|
let track = self.tracks[self.index as usize];
|
|
|
let position = frame.get_state().get_position_ms();
|
|
|
- self.delegate.load(track, play, position);
|
|
|
+ self.player.load(track, play, position);
|
|
|
}
|
|
|
protocol::spirc::MessageType::kMessageTypePlay => {
|
|
|
- self.delegate.play();
|
|
|
+ self.player.play();
|
|
|
}
|
|
|
protocol::spirc::MessageType::kMessageTypePause => {
|
|
|
- self.delegate.pause();
|
|
|
+ self.player.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);
|
|
|
+ self.player.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);
|
|
|
+ self.player.load(track, true, 0);
|
|
|
}
|
|
|
protocol::spirc::MessageType::kMessageTypeSeek => {
|
|
|
- self.delegate.seek(frame.get_position());
|
|
|
+ self.player.seek(frame.get_position());
|
|
|
}
|
|
|
protocol::spirc::MessageType::kMessageTypeReplace => {
|
|
|
self.reload_tracks(&frame);
|
|
@@ -183,11 +160,11 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
protocol::spirc::MessageType::kMessageTypeNotify => {
|
|
|
if self.is_active && frame.get_device_state().get_is_active() {
|
|
|
self.is_active = false;
|
|
|
- self.delegate.stop();
|
|
|
+ self.player.stop();
|
|
|
}
|
|
|
}
|
|
|
protocol::spirc::MessageType::kMessageTypeVolume => {
|
|
|
- self.delegate.volume(frame.get_volume() as u16);
|
|
|
+ self.player.volume(frame.get_volume() as u16);
|
|
|
}
|
|
|
_ => (),
|
|
|
}
|
|
@@ -238,7 +215,7 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
}
|
|
|
|
|
|
fn spirc_state(&self) -> protocol::spirc::State {
|
|
|
- let state = self.delegate.state();
|
|
|
+ let state = self.player.state();
|
|
|
let (position_ms, position_measured_at) = state.position();
|
|
|
|
|
|
protobuf_init!(protocol::spirc::State::new(), {
|
|
@@ -268,7 +245,7 @@ impl<D: SpircDelegate> SpircManager<D> {
|
|
|
sw_version: version_string(),
|
|
|
is_active: self.is_active,
|
|
|
can_play: self.can_play,
|
|
|
- volume: self.delegate.state().volume() as u32,
|
|
|
+ volume: self.player.state().volume() as u32,
|
|
|
name: self.name.clone(),
|
|
|
error_code: 0,
|
|
|
became_active_at: if self.is_active { self.became_active_at as i64 } else { 0 },
|