fix: 🐛 system level audio buffer overflow while stopping

This commit is contained in:
Ahmet Kaan GÜMÜŞ 2024-05-04 12:31:54 +03:00
parent 6dbfd57072
commit 14c84d2f40
3 changed files with 16 additions and 37 deletions

View file

@ -239,12 +239,12 @@ impl Streamer {
.metadata()
.unwrap()
.len() as usize
* 4,
* 1,
)
.0,
);
///////TEST İÇİN YANLIŞ VERDİM UNUTMA
///////Don't Forget it's for testing
let audio_stream_sender = self.data_channel.microphone_stream_sender.clone();
let playing_to_base_sender =
self.communication_channel.playing_to_base_sender.clone();
@ -298,8 +298,6 @@ impl Streamer {
println!("Stop Audio");
self.gui_status.are_we_play_audio = Condition::Loading;
let decoded_to_playing_sender =
self.audio_file.decoded_to_playing_sender.clone().unwrap();
let playing_to_base_receiver = self
.communication_channel
.playing_to_base_sender
@ -310,7 +308,6 @@ impl Streamer {
Command::perform(
async move {
gui_utils::stop_playing(
decoded_to_playing_sender,
playing_to_base_receiver,
base_to_playing_sender,
)
@ -496,7 +493,6 @@ impl Streamer {
base_to_streaming_sender: Sender<bool>,
recording_to_base_receiver: Receiver<bool>,
base_to_recording_sender: Sender<bool>,
decoded_to_playing_sender: Sender<f32>,
playing_to_base_receiver: Receiver<bool>,
base_to_playing_sender: Sender<bool>,
features_in_need: Features,
@ -513,12 +509,7 @@ impl Streamer {
.await;
}
if features_in_need.play_audio {
gui_utils::stop_playing(
decoded_to_playing_sender,
playing_to_base_receiver,
base_to_playing_sender,
)
.await;
gui_utils::stop_playing(playing_to_base_receiver, base_to_playing_sender).await;
}
Event::CloseWindow(window_id)
},
@ -553,7 +544,6 @@ impl Streamer {
.subscribe();
let base_to_recording_sender = self.communication_channel.base_to_recording_sender.clone();
let decoded_to_playing_sender = self.audio_file.decoded_to_playing_sender.clone().unwrap();
let playing_to_base_receiver = self
.communication_channel
.playing_to_base_sender
@ -565,7 +555,6 @@ impl Streamer {
base_to_streaming_sender,
recording_to_base_receiver,
base_to_recording_sender,
decoded_to_playing_sender,
playing_to_base_receiver,
base_to_playing_sender,
features_in_need,

View file

@ -100,19 +100,18 @@ pub async fn start_playing(
}
pub async fn stop_playing(
decoded_to_playing_sender: Sender<f32>,
mut playing_to_base_receiver: Receiver<bool>,
base_to_playing_sender: Sender<bool>,
) -> State {
let thread_solver_task = tokio::spawn(thread_solver(decoded_to_playing_sender));
//let thread_solver_task = tokio::spawn(thread_solver(decoded_to_playing_sender));
let _ = base_to_playing_sender.send(false);
match playing_to_base_receiver.recv().await {
Ok(_) => {
thread_solver_task.abort();
//thread_solver_task.abort();
State::StopAudio
}
Err(err_val) => {
thread_solver_task.abort();
//thread_solver_task.abort();
eprintln!("Error: Communication | {}", err_val);
State::PlayingAudio
}
@ -128,17 +127,6 @@ pub async fn is_playing_finished(
while decoded_to_playing_sender.len() > 0 {
tokio::time::sleep(Duration::from_secs(1)).await;
}
stop_playing(
decoded_to_playing_sender,
playing_to_base_receiver,
base_to_playing_sender,
)
.await;
stop_playing(playing_to_base_receiver, base_to_playing_sender).await;
State::StopAudio
}
async fn thread_solver(decoded_to_playing_sender: Sender<f32>) {
loop {
let _ = decoded_to_playing_sender.send(0.0);
}
}

View file

@ -46,14 +46,16 @@ pub async fn play(
let output_data_fn = move |data: &mut [f32], _: &cpal::OutputCallbackInfo| {
for sample in data {
let single = match decoded_to_playing_receiver.blocking_recv() {
Ok(single) => single,
Err(_) => 0.0,
};
if audio_stream_sender.receiver_count() > 0 {
let _ = audio_stream_sender.send(single);
if decoded_to_playing_receiver.len() > 0 {
let single = match decoded_to_playing_receiver.blocking_recv() {
Ok(single) => single,
Err(_) => 0.0,
};
if audio_stream_sender.receiver_count() > 0 {
let _ = audio_stream_sender.send(single);
}
*sample = single;
}
*sample = single;
}
};