From 986a8204dd260b8278eb2eab204642b85a470cc4 Mon Sep 17 00:00:00 2001 From: lza_menace Date: Mon, 24 Oct 2022 17:46:59 -0700 Subject: [PATCH] ez play (dont lock thread) --- src/app.rs | 44 +++++++++++++++++++++----------------------- src/player.rs | 17 ++++++++++++++--- 2 files changed, 35 insertions(+), 26 deletions(-) diff --git a/src/app.rs b/src/app.rs index b04af51..8029a91 100644 --- a/src/app.rs +++ b/src/app.rs @@ -62,29 +62,32 @@ impl eframe::App for App { } ui.add(egui::Slider::new(&mut self.player.volume, 0.0..=100.0)); self.player.sink.set_volume(self.player.volume / 100.0); + if self.player.sink.len() != 1 { + // let _ = self.player.wait_for_source(); + let f = std::fs::File::open(crate::RADIO_STREAM); + if let Ok(fo) = f { + let file = std::io::BufReader::new(fo); + let source = rodio::Decoder::new(file); + if source.is_err() { + return () + } + // let _ = self.player.sink.stop(); + let _ = self.player.sink.append(source.unwrap()); + let _ = self.player.sink.play(); + } else { + return () + } + } } else { if ui.button("▶").clicked() { // If stream thread is done, start again if self.player.stream_thread.is_finished() { self.player.stream_thread = self.player.start_radio_stream(); } - if self.player.sink.len() != 1 { - let _ = self.player.wait_for_source(); - let f = std::fs::File::open(&crate::RADIO_STREAM); - if let Ok(fo) = f { - let file = std::io::BufReader::new(fo); - let source = rodio::Decoder::new(file); - if source.is_err() { - return () - } - let _ = self.player.sink.append(source.unwrap()); - } else { - return () - } - } let _ = self.player.sink.play(); self.player.playing = true; } + } }); @@ -92,13 +95,7 @@ impl eframe::App for App { if ! self.player.stream_thread.is_finished() { ui.horizontal(|ui| { ui.spinner(); - let size: u64; - let file = std::fs::File::open(crate::RADIO_STREAM); - if file.is_ok() { - size = file.unwrap().metadata().unwrap().len(); - } else { - size = 0; - } + let size: u64 = self.player.get_radio_size(); ui.label(format!( "{:?} -> {} ({} bytes)", self.player.stream_source, @@ -108,14 +105,15 @@ impl eframe::App for App { }); } - if self.player.playing { + // Show exif metadata when radio file available to read + if self.player.playing && self.player.get_radio_size() > 0 { let rt = egui::RichText::new( format!("\n{:?}", self.player.stream_exif)) .color(egui::Color32::WHITE) .size(18.0); ui.label(rt); let dur = self.player.exif_date.elapsed().unwrap(); - if dur > Duration::from_secs(10) { + if dur > Duration::from_secs(8) { self.player.exif_date = SystemTime::now(); self.player.stream_exif = self.player.get_song_meta().unwrap(); } diff --git a/src/player.rs b/src/player.rs index 605a2b9..39aa4ec 100644 --- a/src/player.rs +++ b/src/player.rs @@ -7,6 +7,7 @@ pub struct Player { pub stream_source: String, pub stream_exif: String, pub exif_date: SystemTime, + pub decode_err_date: SystemTime, pub volume: f32, pub playing: bool } @@ -20,6 +21,7 @@ impl Player { stream_source: "https://radio.wownero.com/wow.ogg".to_owned(), stream_exif: "".to_owned(), exif_date: SystemTime::now(), + decode_err_date: SystemTime::now(), volume: 100.0, playing: false } @@ -36,12 +38,21 @@ impl Player { return stream.is_ok() } + pub fn get_radio_size(&self) -> u64 { + let file = std::fs::File::open(crate::RADIO_STREAM); + if file.is_ok() { + return file.unwrap().metadata().unwrap().len(); + } else { + return 0; + } + } + pub fn start_radio_stream(&self) -> std::thread::JoinHandle<()> { let url = self.stream_source.clone(); let t: Result, std::io::Error> = std::thread::Builder::new().name("radio_stream".to_string()).spawn(move || { let proxy = reqwest::Proxy::all("socks5://127.0.0.1:19050").unwrap(); let mut res = reqwest::blocking::Client::builder() - .proxy(proxy) + // .proxy(proxy) .user_agent("WOC GUI + BoomBox") .build() .unwrap() @@ -70,7 +81,7 @@ impl Player { if file.is_ok() { let mut buffer = vec![]; let file_size = file.unwrap().metadata().unwrap().len(); - let chunk_size = 200000; + let chunk_size = 100000; let mut start_pos = if file_size < chunk_size { 0 } else { file_size - chunk_size }; let tries = file_size / chunk_size; for _i in 0..tries + 1 { @@ -85,7 +96,7 @@ impl Player { // eat whatever the fuck you want - food moderation and other philosophies // im 63, i walk everyday, everyone can do that, if they want // if you're gonna drink, you gotta balance it out - return Some(caps.unwrap().get(1).map_or("", |m| m.as_str()).to_owned()) + return Some(caps.unwrap().get(1).map_or("", |m| m.as_str()).to_owned()); } if start_pos < chunk_size { start_pos = 0;