From 6170833c57152d0d40e3d6caf338356ddd772a8a Mon Sep 17 00:00:00 2001 From: chmanie Date: Wed, 31 May 2023 19:12:45 +0200 Subject: [PATCH] Attempt at fixing the lost playback bug --- crabidy-server/src/main.rs | 65 +++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 19 deletions(-) diff --git a/crabidy-server/src/main.rs b/crabidy-server/src/main.rs index 9ebb747..bcda48c 100644 --- a/crabidy-server/src/main.rs +++ b/crabidy-server/src/main.rs @@ -25,6 +25,28 @@ use std::{ }; use tonic::{transport::Server, Request, Response, Result, Status}; +fn poll_bus(bus: gstreamer::Bus, tx: flume::Sender) { + loop { + for msg in bus.iter_timed(gstreamer::ClockTime::NONE) { + match PlayMessage::parse(&msg) { + Ok(PlayMessage::EndOfStream) => { + tx.send(PlaybackMessage::Next).unwrap(); + } + Ok(PlayMessage::StateChanged { state }) => { + tx.send(PlaybackMessage::StateChanged { state }).unwrap(); + } + Ok(PlayMessage::PositionUpdated { position }) => {} + Ok(PlayMessage::Buffering { percent }) => {} + Ok(PlayMessage::VolumeChanged { volume }) => {} + Ok(PlayMessage::MuteChanged { muted }) => {} + + Ok(PlayMessage::MediaInfoUpdated { info }) => {} + _ => println!("Unknown message: {:?}", msg), + } + } + } +} + #[tokio::main] async fn main() -> Result<(), Box> { let (queue_update_tx, _) = tokio::sync::broadcast::channel(100); @@ -40,26 +62,30 @@ async fn main() -> Result<(), Box> { let bus = playback.play.message_bus(); let playback_tx = playback.playback_tx.clone(); - bus.set_sync_handler(move |_, msg| { - match PlayMessage::parse(msg) { - Ok(PlayMessage::EndOfStream) => { - playback_tx.send(PlaybackMessage::Next).unwrap(); - } - Ok(PlayMessage::StateChanged { state }) => { - playback_tx - .send(PlaybackMessage::StateChanged { state }) - .unwrap(); - } - Ok(PlayMessage::PositionUpdated { position }) => {} - Ok(PlayMessage::Buffering { percent }) => {} - Ok(PlayMessage::VolumeChanged { volume }) => {} - Ok(PlayMessage::MuteChanged { muted }) => {} - - Ok(PlayMessage::MediaInfoUpdated { info }) => {} - _ => println!("Unknown message: {:?}", msg), - } - gstreamer::BusSyncReply::Drop + std::thread::spawn(|| { + poll_bus(bus, playback_tx); }); + + // bus.set_sync_handler(move |_, msg| { + // match PlayMessage::parse(msg) { + // Ok(PlayMessage::EndOfStream) => { + // playback_tx.send(PlaybackMessage::Next).unwrap(); + // } + // Ok(PlayMessage::StateChanged { state }) => { + // playback_tx + // .send(PlaybackMessage::StateChanged { state }) + // .unwrap(); + // } + // Ok(PlayMessage::PositionUpdated { position }) => {} + // Ok(PlayMessage::Buffering { percent }) => {} + // Ok(PlayMessage::VolumeChanged { volume }) => {} + // Ok(PlayMessage::MuteChanged { muted }) => {} + // + // Ok(PlayMessage::MediaInfoUpdated { info }) => {} + // _ => println!("Unknown message: {:?}", msg), + // } + // gstreamer::BusSyncReply::Drop + // }); let crabidy_service = RpcService::new( queue_update_tx, active_track_tx, @@ -520,6 +546,7 @@ impl Playback { let mut state_guard = self.state.lock().unwrap(); *state_guard = PlayState::Playing; } + self.play.stop(); self.play.set_uri(Some(&urls[0])); self.play.play(); }