2024-04-27 19:48:13 +03:00
|
|
|
use iced::{
|
2024-04-27 22:14:50 +03:00
|
|
|
widget::{button, column, container, Container},
|
2024-04-27 19:48:13 +03:00
|
|
|
Command,
|
|
|
|
};
|
2024-04-27 15:36:28 +03:00
|
|
|
use tokio::sync::broadcast::{channel, Sender};
|
|
|
|
|
|
|
|
use crate::{recording, streaming, utils::get_config, Config, BUFFER_LENGTH};
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
pub enum Message {
|
|
|
|
StartStreaming,
|
2024-04-27 19:48:13 +03:00
|
|
|
StopStreaming,
|
2024-04-27 15:36:28 +03:00
|
|
|
ConfigLoad(Config),
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Debug)]
|
|
|
|
pub struct Streamer {
|
|
|
|
config: Option<Config>,
|
2024-04-27 19:48:13 +03:00
|
|
|
sound_stream_producer: Sender<f32>,
|
|
|
|
stop_connection_producer: Sender<bool>,
|
|
|
|
stop_recording_producer: Sender<bool>,
|
2024-04-27 22:14:50 +03:00
|
|
|
connection_cleaning_status_producer: Sender<bool>,
|
|
|
|
are_we_streaming: bool,
|
|
|
|
are_we_recovering: bool,
|
2024-04-27 15:36:28 +03:00
|
|
|
}
|
|
|
|
impl Default for Streamer {
|
|
|
|
fn default() -> Self {
|
|
|
|
Self::new()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl Streamer {
|
|
|
|
fn new() -> Self {
|
|
|
|
Self {
|
|
|
|
config: None,
|
|
|
|
sound_stream_producer: channel(BUFFER_LENGTH).0,
|
2024-04-27 19:48:13 +03:00
|
|
|
stop_connection_producer: channel(BUFFER_LENGTH).0,
|
|
|
|
stop_recording_producer: channel(BUFFER_LENGTH).0,
|
2024-04-27 22:14:50 +03:00
|
|
|
connection_cleaning_status_producer: channel(BUFFER_LENGTH).0,
|
|
|
|
are_we_streaming: false,
|
|
|
|
are_we_recovering: false,
|
2024-04-27 15:36:28 +03:00
|
|
|
}
|
|
|
|
}
|
2024-04-27 19:48:13 +03:00
|
|
|
pub fn update(&mut self, message: Message) {
|
2024-04-27 15:36:28 +03:00
|
|
|
match message {
|
|
|
|
Message::StartStreaming => {
|
2024-04-27 22:14:50 +03:00
|
|
|
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;
|
|
|
|
}
|
2024-04-27 19:48:13 +03:00
|
|
|
}
|
|
|
|
Message::StopStreaming => {
|
2024-04-27 22:14:50 +03:00
|
|
|
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;
|
|
|
|
}
|
2024-04-27 15:36:28 +03:00
|
|
|
}
|
|
|
|
Message::ConfigLoad(config) => {
|
|
|
|
self.config = Some(config);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2024-04-27 22:14:50 +03:00
|
|
|
pub fn view(&self) -> Container<Message> {
|
|
|
|
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()
|
2024-04-27 15:36:28 +03:00
|
|
|
}
|
|
|
|
pub fn load_config() -> Command<Message> {
|
|
|
|
Command::perform(get_config(), Message::ConfigLoad)
|
|
|
|
}
|
|
|
|
}
|