From d782adb506ea3b01aff57325d05ae91685f36a93 Mon Sep 17 00:00:00 2001 From: chmanie Date: Thu, 8 Jun 2023 20:42:25 +0200 Subject: [PATCH] Hopefully unstuck the player --- audio-player/examples/basic.rs | 61 ++++++++++++++----------------- audio-player/src/decoder.rs | 4 -- audio-player/src/player_engine.rs | 15 ++++---- crabidy-server/src/main.rs | 2 +- crabidy-server/src/playback.rs | 6 --- 5 files changed, 36 insertions(+), 52 deletions(-) diff --git a/audio-player/examples/basic.rs b/audio-player/examples/basic.rs index 14ce8a6..90491c8 100644 --- a/audio-player/examples/basic.rs +++ b/audio-player/examples/basic.rs @@ -5,46 +5,39 @@ use audio_player::{Player, PlayerMessage}; #[tokio::main] async fn main() { let player = Player::default(); - let messages = player.messages.clone(); - // Make sure we read all the messages in time - thread::spawn(move || loop { - match messages.recv() { - Ok(PlayerMessage::Playing) => { - println!("PLAYING NEW TRACK"); - } - Ok(PlayerMessage::Duration { duration }) => { - println!("DURATION: {:?}", duration); - } - Ok(PlayerMessage::Elapsed { - duration: _, - elapsed, - }) => { + player + .play("https://www2.cs.uic.edu/~i101/SoundFiles/gettysburg10.wav") + .await + .unwrap(); + + loop { + match player.messages.recv_async().await { + Ok(PlayerMessage::Elapsed { duration, elapsed }) => { println!("ELAPSED: {:?}", elapsed); } - Ok(PlayerMessage::Stopped) => { - println!("STOPPED"); + Ok(PlayerMessage::EndOfStream) => { + println!("END OF STREAM"); + player + .play("https://www2.cs.uic.edu/~i101/SoundFiles/preamble10.wav") + .await + .unwrap(); break; } _ => {} } - }); + } - player - .play("https://www2.cs.uic.edu/~i101/SoundFiles/CantinaBand60.wav") - .await - .unwrap(); - - tokio::time::sleep(Duration::from_secs(10)).await; - - player.seek_to(Duration::from_secs(20)).await.unwrap(); - - tokio::time::sleep(Duration::from_secs(10)).await; - - player - .play("https://www2.cs.uic.edu/~i101/SoundFiles/PinkPanther60.wav") - .await - .unwrap(); - - tokio::time::sleep(Duration::from_secs(60)).await; + loop { + match player.messages.recv_async().await { + Ok(PlayerMessage::Elapsed { duration, elapsed }) => { + println!("ELAPSED: {:?}", elapsed); + } + Ok(PlayerMessage::EndOfStream) => { + println!("END OF STREAM 2"); + break; + } + _ => {} + } + } } diff --git a/audio-player/src/decoder.rs b/audio-player/src/decoder.rs index 8a5dcc6..6dbaace 100644 --- a/audio-player/src/decoder.rs +++ b/audio-player/src/decoder.rs @@ -69,10 +69,6 @@ impl SymphoniaDecoder { } } - pub fn into_inner(self) -> MediaSourceStream { - self.format.into_inner() - } - fn init( mss: MediaSourceStream, hint: Hint, diff --git a/audio-player/src/player_engine.rs b/audio-player/src/player_engine.rs index 7a342de..0a23823 100644 --- a/audio-player/src/player_engine.rs +++ b/audio-player/src/player_engine.rs @@ -1,15 +1,16 @@ use flume::Sender; use std::path::Path; use std::sync::atomic::AtomicU64; +use std::thread; use std::time::Duration; use std::{fs::File, sync::atomic::Ordering}; use symphonia::core::probe::Hint; -use tracing::warn; +use tracing::{debug, warn}; use url::Url; use crate::decoder::{MediaInfo, SymphoniaDecoder}; use anyhow::{anyhow, Result}; -use rodio::{OutputStream, Sink, Source}; +use rodio::{OutputStream, OutputStreamHandle, Sink, Source}; use stream_download::StreamDownload; use symphonia::core::io::{MediaSource, MediaSourceStream, MediaSourceStreamOptions}; use thiserror::Error; @@ -64,6 +65,7 @@ pub struct PlayerEngine { sink: Sink, // We need to keep the stream around as it will stop playing when it's dropped _stream: OutputStream, + _handle: OutputStreamHandle, tx_engine: Sender, tx_player: Sender, } @@ -81,6 +83,7 @@ impl PlayerEngine { elapsed: Duration::default(), sink, _stream, + _handle: handle, tx_engine, tx_player, }) @@ -90,9 +93,7 @@ impl PlayerEngine { let tx_player = self.tx_player.clone(); let tx_engine = self.tx_engine.clone(); - if !self.sink.empty() { - self.reset(); - } + self.reset(); let (source, hint) = self.get_source(source_str)?; let mss = MediaSourceStream::new(source, MediaSourceStreamOptions::default()); @@ -196,7 +197,7 @@ impl PlayerEngine { } pub fn is_stopped(&self) -> bool { - self.sink.len() == 0 + self.sink.empty() } pub fn duration(&self) -> Result { @@ -248,7 +249,7 @@ impl PlayerEngine { self.elapsed = Duration::default(); self.current_source = None; self.sink.pause(); - self.sink.clear(); + self.sink.stop(); } fn get_source(&self, source_str: &str) -> Result<(Box, Hint)> { diff --git a/crabidy-server/src/main.rs b/crabidy-server/src/main.rs index b6fcf0b..a35c90d 100644 --- a/crabidy-server/src/main.rs +++ b/crabidy-server/src/main.rs @@ -61,7 +61,7 @@ async fn main() -> Result<(), Box> { playback.run(); info!("playback started"); - let addr = "[::1]:50051".parse()?; + let addr = "0.0.0.0:50051".parse()?; Server::builder() .add_service(CrabidyServiceServer::new(crabidy_service)) .serve(addr) diff --git a/crabidy-server/src/playback.rs b/crabidy-server/src/playback.rs index 5889d85..6d1b1a0 100644 --- a/crabidy-server/src/playback.rs +++ b/crabidy-server/src/playback.rs @@ -467,9 +467,6 @@ impl Playback { error!("{:?}", err) } } - if let Err(err) = self.player.stop().await { - error!("{:?}", err) - }; if let Err(err) = self.player.play(&urls[0]).await { error!("{:?}", err) }; @@ -510,9 +507,6 @@ impl Playback { error!("{:?}", err) } } - if let Err(err) = self.player.stop().await { - error!("{:?}", err) - }; if let Err(err) = self.player.play(&urls[0]).await { error!("{:?}", err) }