From c5df5983389ec39fc78174a5b21c27f8c2680e88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ahmet=20Kaan=20G=C3=9CM=C3=9C=C5=9E?= <96421894+Tahinli@users.noreply.github.com> Date: Sat, 27 Apr 2024 22:14:50 +0300 Subject: [PATCH] feat: :lipstick: two button turned into one button --- streamer/src/gui.rs | 80 +++++++++++++++++++++++++++++---------- streamer/src/main.rs | 2 + streamer/src/streaming.rs | 8 ++++ 3 files changed, 71 insertions(+), 19 deletions(-) diff --git a/streamer/src/gui.rs b/streamer/src/gui.rs index e86946e..93bd907 100644 --- a/streamer/src/gui.rs +++ b/streamer/src/gui.rs @@ -1,5 +1,5 @@ use iced::{ - widget::{button, column, Column}, + widget::{button, column, container, Container}, Command, }; use tokio::sync::broadcast::{channel, Sender}; @@ -19,6 +19,9 @@ pub struct Streamer { sound_stream_producer: Sender, stop_connection_producer: Sender, stop_recording_producer: Sender, + connection_cleaning_status_producer: Sender, + are_we_streaming: bool, + are_we_recovering: bool, } impl Default for Streamer { fn default() -> Self { @@ -33,37 +36,76 @@ impl Streamer { sound_stream_producer: channel(BUFFER_LENGTH).0, stop_connection_producer: channel(BUFFER_LENGTH).0, stop_recording_producer: channel(BUFFER_LENGTH).0, + connection_cleaning_status_producer: channel(BUFFER_LENGTH).0, + are_we_streaming: false, + are_we_recovering: false, } } pub fn update(&mut self, message: Message) { match message { Message::StartStreaming => { - println!("Start Stream"); - tokio::spawn(streaming::connect( - self.sound_stream_producer.subscribe(), - self.config.clone().unwrap(), - self.stop_connection_producer.subscribe(), - )); - tokio::spawn(recording::record( - self.sound_stream_producer.clone(), - self.stop_recording_producer.subscribe(), - )); + if !self.are_we_recovering && !self.are_we_streaming { + println!("Start Stream"); + self.are_we_recovering = true; + self.are_we_streaming = true; + tokio::spawn(streaming::connect( + self.sound_stream_producer.subscribe(), + self.config.clone().unwrap(), + self.stop_connection_producer.subscribe(), + self.connection_cleaning_status_producer.clone(), + )); + tokio::spawn(recording::record( + self.sound_stream_producer.clone(), + self.stop_recording_producer.subscribe(), + )); + self.are_we_recovering = false; + } } Message::StopStreaming => { - println!("Stop Stream"); - self.stop_connection_producer.send(true).unwrap(); - self.stop_recording_producer.send(true).unwrap(); + if !self.are_we_recovering && self.are_we_streaming { + println!("Stop Stream"); + self.are_we_recovering = true; + self.are_we_streaming = false; + let _ = self.connection_cleaning_status_producer.send(true); + let _ = self.stop_connection_producer.send(true); + let _ = self.stop_recording_producer.send(true); + while !self.connection_cleaning_status_producer.is_empty() {} + self.are_we_recovering = false; + } } Message::ConfigLoad(config) => { self.config = Some(config); } } } - pub fn view(&self) -> Column { - column![ - button("Start Streaming").on_press(Message::StartStreaming), - button("Stop Streaming").on_press(Message::StopStreaming), - ] + pub fn view(&self) -> Container { + let column = match self.are_we_streaming { + true => match self.are_we_recovering { + true => { + column![button("Stop Streaming").width(100),] + } + false => { + column![button("Stop Streaming") + .width(100) + .on_press(Message::StopStreaming),] + } + }, + false => match self.are_we_recovering { + true => { + column![button("Start Streaming").width(100),] + } + false => { + column![button("Start Streaming") + .width(100) + .on_press(Message::StartStreaming),] + } + }, + }; + container(column) + .width(200) + .height(200) + .center_x() + .center_y() } pub fn load_config() -> Command { Command::perform(get_config(), Message::ConfigLoad) diff --git a/streamer/src/main.rs b/streamer/src/main.rs index 7a37c48..092d60c 100644 --- a/streamer/src/main.rs +++ b/streamer/src/main.rs @@ -4,6 +4,8 @@ use streamer::gui::Streamer; async fn main() -> iced::Result { println!("Hello, world!"); iced::program("Streamer GUI", Streamer::update, Streamer::view) + .centered() + .window_size((250.0, 250.0)) .load(Streamer::load_config) .run() } diff --git a/streamer/src/streaming.rs b/streamer/src/streaming.rs index b7e591e..3065ea4 100644 --- a/streamer/src/streaming.rs +++ b/streamer/src/streaming.rs @@ -16,6 +16,7 @@ pub async fn connect( sound_stream_consumer: Receiver, streamer_config: Config, mut stop_connection_consumer: Receiver, + connection_cleaning_status_producer: Sender, ) { let connect_addr = match streamer_config.tls { true => format!("wss://{}", streamer_config.address), @@ -64,6 +65,7 @@ pub async fn connect( message_organizer_task, stream_task, stop_connection_consumer, + connection_cleaning_status_producer, )); } } @@ -168,11 +170,17 @@ async fn status_checker( message_organizer_task: JoinHandle<()>, stream_task: JoinHandle<()>, mut stop_connection_consumer: Receiver, + connection_cleaning_status_producer: Sender, ) { + let mut connection_cleaning_status_consumer = connection_cleaning_status_producer.subscribe(); + connection_cleaning_status_producer.send(true).unwrap(); while let Err(_) = stop_connection_consumer.try_recv() { tokio::time::sleep(Duration::from_secs(3)).await; } stream_task.abort(); message_organizer_task.abort(); + while let Ok(_) = connection_cleaning_status_consumer.try_recv() {} + drop(connection_cleaning_status_consumer); + drop(connection_cleaning_status_producer); println!("Cleaning Done: Streamer Disconnected"); }