|
@@ -1,6 +1,5 @@
|
|
use eventual::Async;
|
|
use eventual::Async;
|
|
use protobuf::{self, Message, RepeatedField};
|
|
use protobuf::{self, Message, RepeatedField};
|
|
-use std::borrow::Cow;
|
|
|
|
use std::sync::{mpsc, Mutex, Arc};
|
|
use std::sync::{mpsc, Mutex, Arc};
|
|
use std::collections::HashMap;
|
|
use std::collections::HashMap;
|
|
|
|
|
|
@@ -57,6 +56,42 @@ pub struct State {
|
|
pub end_of_track: bool,
|
|
pub end_of_track: bool,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+impl State {
|
|
|
|
+ pub fn new() -> State {
|
|
|
|
+ let state = State {
|
|
|
|
+ status: PlayStatus::kPlayStatusStop,
|
|
|
|
+ position_ms: 0,
|
|
|
|
+ position_measured_at: 0,
|
|
|
|
+ update_time: 0,
|
|
|
|
+ volume: 0,
|
|
|
|
+ track: None,
|
|
|
|
+ end_of_track: false,
|
|
|
|
+ };
|
|
|
|
+ state.update_time()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn update_from_player(mut self, player: &Player) -> State {
|
|
|
|
+ let player_state = player.state();
|
|
|
|
+ let (position_ms, position_measured_at) = player_state.position();
|
|
|
|
+ self.status = player_state.status();
|
|
|
|
+ self.position_ms = position_ms;
|
|
|
|
+ self.position_measured_at = position_measured_at;
|
|
|
|
+ self.track = player_state.track;
|
|
|
|
+ self.end_of_track = player_state.end_of_track();
|
|
|
|
+ self.update_time()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ pub fn update_from_mixer(mut self, mixer: &Box<Mixer + Send>) -> State {
|
|
|
|
+ self.volume = mixer.volume();
|
|
|
|
+ self.update_time()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fn update_time(mut self) -> State {
|
|
|
|
+ self.update_time = util::now_ms();
|
|
|
|
+ self
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
impl SpircManager {
|
|
impl SpircManager {
|
|
pub fn new(session: Session, player: Player, mixer: Box<Mixer + Send>) -> SpircManager {
|
|
pub fn new(session: Session, player: Player, mixer: Box<Mixer + Send>) -> SpircManager {
|
|
let ident = session.device_id().to_owned();
|
|
let ident = session.device_id().to_owned();
|
|
@@ -432,16 +467,9 @@ impl<'a> CommandSender<'a> {
|
|
}
|
|
}
|
|
|
|
|
|
fn send(self) {
|
|
fn send(self) {
|
|
- //TODO: get data
|
|
|
|
- let state = Cow::Owned(State {
|
|
|
|
- status: PlayStatus::kPlayStatusStop,
|
|
|
|
- position_ms: 0,
|
|
|
|
- position_measured_at: 0,
|
|
|
|
- update_time: util::now_ms(),
|
|
|
|
- volume: 0,
|
|
|
|
- track: None,
|
|
|
|
- end_of_track: false,
|
|
|
|
- });
|
|
|
|
|
|
+ let state = State::new()
|
|
|
|
+ .update_from_player(&self.spirc_internal.player)
|
|
|
|
+ .update_from_mixer(&self.spirc_internal.mixer);
|
|
|
|
|
|
let mut pkt = protobuf_init!(protocol::spirc::Frame::new(), {
|
|
let mut pkt = protobuf_init!(protocol::spirc::Frame::new(), {
|
|
version: 1,
|
|
version: 1,
|