Hopefully unstuck the player

This commit is contained in:
chmanie 2023-06-08 20:42:25 +02:00
parent 606f9e6516
commit d782adb506
5 changed files with 36 additions and 52 deletions

View File

@ -5,46 +5,39 @@ use audio_player::{Player, PlayerMessage};
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let player = Player::default(); let player = Player::default();
let messages = player.messages.clone();
// Make sure we read all the messages in time player
thread::spawn(move || loop { .play("https://www2.cs.uic.edu/~i101/SoundFiles/gettysburg10.wav")
match messages.recv() { .await
Ok(PlayerMessage::Playing) => { .unwrap();
println!("PLAYING NEW TRACK");
} loop {
Ok(PlayerMessage::Duration { duration }) => { match player.messages.recv_async().await {
println!("DURATION: {:?}", duration); Ok(PlayerMessage::Elapsed { duration, elapsed }) => {
}
Ok(PlayerMessage::Elapsed {
duration: _,
elapsed,
}) => {
println!("ELAPSED: {:?}", elapsed); println!("ELAPSED: {:?}", elapsed);
} }
Ok(PlayerMessage::Stopped) => { Ok(PlayerMessage::EndOfStream) => {
println!("STOPPED"); println!("END OF STREAM");
player
.play("https://www2.cs.uic.edu/~i101/SoundFiles/preamble10.wav")
.await
.unwrap();
break; break;
} }
_ => {} _ => {}
} }
}); }
player loop {
.play("https://www2.cs.uic.edu/~i101/SoundFiles/CantinaBand60.wav") match player.messages.recv_async().await {
.await Ok(PlayerMessage::Elapsed { duration, elapsed }) => {
.unwrap(); println!("ELAPSED: {:?}", elapsed);
}
tokio::time::sleep(Duration::from_secs(10)).await; Ok(PlayerMessage::EndOfStream) => {
println!("END OF STREAM 2");
player.seek_to(Duration::from_secs(20)).await.unwrap(); break;
}
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;
} }

View File

@ -69,10 +69,6 @@ impl SymphoniaDecoder {
} }
} }
pub fn into_inner(self) -> MediaSourceStream {
self.format.into_inner()
}
fn init( fn init(
mss: MediaSourceStream, mss: MediaSourceStream,
hint: Hint, hint: Hint,

View File

@ -1,15 +1,16 @@
use flume::Sender; use flume::Sender;
use std::path::Path; use std::path::Path;
use std::sync::atomic::AtomicU64; use std::sync::atomic::AtomicU64;
use std::thread;
use std::time::Duration; use std::time::Duration;
use std::{fs::File, sync::atomic::Ordering}; use std::{fs::File, sync::atomic::Ordering};
use symphonia::core::probe::Hint; use symphonia::core::probe::Hint;
use tracing::warn; use tracing::{debug, warn};
use url::Url; use url::Url;
use crate::decoder::{MediaInfo, SymphoniaDecoder}; use crate::decoder::{MediaInfo, SymphoniaDecoder};
use anyhow::{anyhow, Result}; use anyhow::{anyhow, Result};
use rodio::{OutputStream, Sink, Source}; use rodio::{OutputStream, OutputStreamHandle, Sink, Source};
use stream_download::StreamDownload; use stream_download::StreamDownload;
use symphonia::core::io::{MediaSource, MediaSourceStream, MediaSourceStreamOptions}; use symphonia::core::io::{MediaSource, MediaSourceStream, MediaSourceStreamOptions};
use thiserror::Error; use thiserror::Error;
@ -64,6 +65,7 @@ pub struct PlayerEngine {
sink: Sink, sink: Sink,
// We need to keep the stream around as it will stop playing when it's dropped // We need to keep the stream around as it will stop playing when it's dropped
_stream: OutputStream, _stream: OutputStream,
_handle: OutputStreamHandle,
tx_engine: Sender<PlayerEngineCommand>, tx_engine: Sender<PlayerEngineCommand>,
tx_player: Sender<PlayerMessage>, tx_player: Sender<PlayerMessage>,
} }
@ -81,6 +83,7 @@ impl PlayerEngine {
elapsed: Duration::default(), elapsed: Duration::default(),
sink, sink,
_stream, _stream,
_handle: handle,
tx_engine, tx_engine,
tx_player, tx_player,
}) })
@ -90,9 +93,7 @@ impl PlayerEngine {
let tx_player = self.tx_player.clone(); let tx_player = self.tx_player.clone();
let tx_engine = self.tx_engine.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 (source, hint) = self.get_source(source_str)?;
let mss = MediaSourceStream::new(source, MediaSourceStreamOptions::default()); let mss = MediaSourceStream::new(source, MediaSourceStreamOptions::default());
@ -196,7 +197,7 @@ impl PlayerEngine {
} }
pub fn is_stopped(&self) -> bool { pub fn is_stopped(&self) -> bool {
self.sink.len() == 0 self.sink.empty()
} }
pub fn duration(&self) -> Result<Duration> { pub fn duration(&self) -> Result<Duration> {
@ -248,7 +249,7 @@ impl PlayerEngine {
self.elapsed = Duration::default(); self.elapsed = Duration::default();
self.current_source = None; self.current_source = None;
self.sink.pause(); self.sink.pause();
self.sink.clear(); self.sink.stop();
} }
fn get_source(&self, source_str: &str) -> Result<(Box<dyn MediaSource>, Hint)> { fn get_source(&self, source_str: &str) -> Result<(Box<dyn MediaSource>, Hint)> {

View File

@ -61,7 +61,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
playback.run(); playback.run();
info!("playback started"); info!("playback started");
let addr = "[::1]:50051".parse()?; let addr = "0.0.0.0:50051".parse()?;
Server::builder() Server::builder()
.add_service(CrabidyServiceServer::new(crabidy_service)) .add_service(CrabidyServiceServer::new(crabidy_service))
.serve(addr) .serve(addr)

View File

@ -467,9 +467,6 @@ impl Playback {
error!("{:?}", err) error!("{:?}", err)
} }
} }
if let Err(err) = self.player.stop().await {
error!("{:?}", err)
};
if let Err(err) = self.player.play(&urls[0]).await { if let Err(err) = self.player.play(&urls[0]).await {
error!("{:?}", err) error!("{:?}", err)
}; };
@ -510,9 +507,6 @@ impl Playback {
error!("{:?}", err) error!("{:?}", err)
} }
} }
if let Err(err) = self.player.stop().await {
error!("{:?}", err)
};
if let Err(err) = self.player.play(&urls[0]).await { if let Err(err) = self.player.play(&urls[0]).await {
error!("{:?}", err) error!("{:?}", err)
} }