From 1f320d9771bac2780e5a09d6a3bc063b35cf58de Mon Sep 17 00:00:00 2001 From: salmonik Date: Tue, 5 May 2026 21:37:44 +0200 Subject: fix(audio): resolve deadlock preventing auto-advance to next track The audio callback deadlocked when trying to lock audio_data twice, preventing track_ended from being set and breaking auto-advance. Also removed erroneous track_ended.store(true) calls from error paths that were causing incorrect queue advancement when playback failed. --- src/audio.rs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'src/audio.rs') diff --git a/src/audio.rs b/src/audio.rs index 86c88f7..4e26263 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -204,6 +204,8 @@ fn audio_thread( let vol = vol.lock().map(|v| *v).unwrap_or(1.0); if let Ok(mut audio_data) = audio_data_clone.lock() { + let mut should_clear = false; + if let Some(ref mut state) = *audio_data { let channels = state.channels as usize; let mut offset = 0usize; @@ -298,16 +300,17 @@ fn audio_thread( if offset == 0 && state.sample_buffer.is_empty() { ended.store(true, Ordering::SeqCst); is_playing_clone.store(false, Ordering::SeqCst); - // Clear audio data so we don't keep triggering ended - if let Ok(mut audio_data) = audio_data_clone.lock() { - *audio_data = None; - } + should_clear = true; } } else { for sample in data.iter_mut() { *sample = 0.0; } } + + if should_clear { + *audio_data = None; + } } }, |err| { @@ -319,7 +322,6 @@ fn audio_thread( if let Err(e) = stream.play() { eprintln!("Failed to start stream: {}", e); is_playing.store(false, Ordering::SeqCst); - track_ended.store(true, Ordering::SeqCst); } else { current_stream = Some(stream); } @@ -327,14 +329,12 @@ fn audio_thread( Err(e) => { eprintln!("Failed to create stream: {}", e); is_playing.store(false, Ordering::SeqCst); - track_ended.store(true, Ordering::SeqCst); } } } Err(e) => { eprintln!("Failed to open audio: {}", e); is_playing.store(false, Ordering::SeqCst); - track_ended.store(true, Ordering::SeqCst); } } } -- cgit v1.2.3