Music player responds to panel messages
This commit is contained in:
parent
b005176bcf
commit
a73869aae5
|
@ -3,7 +3,9 @@
|
|||
|
||||
use std::path::Path;
|
||||
|
||||
use canary_magpie::protocol::{ClientMessenger, CreatePanel, MagpieServerMsg, MAGPIE_SOCK};
|
||||
use canary_magpie::protocol::{
|
||||
ClientMessenger, CreatePanel, MagpieClientMsg, MagpieServerMsg, RecvMessage, MAGPIE_SOCK,
|
||||
};
|
||||
use canary_music_player::*;
|
||||
use smol::net::unix::UnixStream;
|
||||
|
||||
|
@ -84,6 +86,37 @@ impl Metadata {
|
|||
}
|
||||
}
|
||||
|
||||
async fn on_message(
|
||||
player: &PlayerProxy<'_>,
|
||||
magpie: &mut MagpieClient,
|
||||
message: MagpieClientMsg,
|
||||
) -> Result<(), Box<dyn std::error::Error>> {
|
||||
let message = match message {
|
||||
MagpieClientMsg::RecvMessage(RecvMessage { id: 0, msg }) => msg,
|
||||
_ => return Ok(()),
|
||||
};
|
||||
|
||||
let message: OutMsg = match serde_json::from_slice(&message) {
|
||||
Ok(v) => v,
|
||||
Err(err) => {
|
||||
eprintln!("Panel message parse error: {:?}", err);
|
||||
return Ok(());
|
||||
}
|
||||
};
|
||||
|
||||
match message {
|
||||
OutMsg::Pause => player.pause().await?,
|
||||
OutMsg::Play => player.play().await?,
|
||||
OutMsg::PlayPause => player.play_pause().await?,
|
||||
OutMsg::Stop => player.stop().await?,
|
||||
OutMsg::Previous => player.previous().await?,
|
||||
OutMsg::Next => player.next().await?,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn player_main(
|
||||
player: &PlayerProxy<'_>,
|
||||
magpie: &mut MagpieClient,
|
||||
|
@ -94,9 +127,16 @@ async fn player_main(
|
|||
let mut position_tracker = player.receive_position_changed().await.fuse();
|
||||
|
||||
let mut metadata = Metadata::update_new(magpie, player.metadata().await?).await;
|
||||
use futures_util::FutureExt;
|
||||
|
||||
loop {
|
||||
futures_util::select! {
|
||||
msg = magpie.recv().fuse() => {
|
||||
match msg {
|
||||
Ok(msg) => on_message(player, magpie, msg).await?,
|
||||
Err(err) => eprintln!("Magpie recv error: {:?}", err),
|
||||
}
|
||||
}
|
||||
// TODO also update volume, shuffle status, and loop status
|
||||
status = playback_status.next() => {
|
||||
let status = match status {
|
||||
|
|
Loading…
Reference in New Issue