From a73869aae57a2959c937a7ce8a79e5b9e8f1141c Mon Sep 17 00:00:00 2001 From: mars Date: Sun, 20 Nov 2022 12:04:18 -0700 Subject: [PATCH] Music player responds to panel messages --- apps/music-player/src/main.rs | 42 ++++++++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/apps/music-player/src/main.rs b/apps/music-player/src/main.rs index aaf7e71..90dbe54 100644 --- a/apps/music-player/src/main.rs +++ b/apps/music-player/src/main.rs @@ -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> { + 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 {