Merge pull request #584 from afonsojramos/bugfix/internal/seek-engine-restore

fix(player): clear playing state when seek rebuild fails
This commit is contained in:
Victor RH authored and GitHub committed 2026-07-12 19:39:57 -06:00
commit db2f21289c
1 file changed
+31 -16
+31 -16
View File
@@ -3117,18 +3117,25 @@ impl Player {
log::info!("Audio thread: seeking to {}s", position_secs);
// After take(), every failure path must clear playing
// state — otherwise UI can show "playing" with no engine.
if let Some(engine) = current_engine.take() {
engine.stop();
}
let seek_abort = |thread_state: &SharedState, why: &str| {
log::error!("Audio thread: seek aborted: {why}");
thread_state.is_playing.store(false, Ordering::SeqCst);
thread_state.set_stream_error(true);
};
let mut engine = match stream {
StreamType::Rodio { sink: mixer_sink, .. } => {
match PlaybackEngine::new_rodio(&mixer_sink.mixer()) {
Ok(e) => e,
Err(e) => {
log::error!(
"Failed to create rodio engine for seek: {}",
e
seek_abort(
&thread_state,
&format!("rodio engine create failed: {e}"),
);
return;
}
@@ -3175,18 +3182,18 @@ impl Player {
match IncrementalStreamingSource::new(stream_src.clone()) {
Ok(mut s) => {
if let Err(e) = s.seek_to(skip_duration) {
log::error!(
"Failed to native-seek streaming source: {}",
e
seek_abort(
&thread_state,
&format!("streaming native seek failed: {e}"),
);
return;
}
Box::new(s)
}
Err(e) => {
log::error!(
"Failed to create streaming source for seek: {}",
e
seek_abort(
&thread_state,
&format!("streaming source for seek failed: {e}"),
);
return;
}
@@ -3206,9 +3213,11 @@ impl Player {
match decode_with_fallback(audio_data) {
Ok(fb) => Box::new(fb.skip_duration(skip_duration)),
Err(e) => {
log::error!(
"Failed to decode audio for seek: {}",
e
seek_abort(
&thread_state,
&format!(
"decode for seek failed: {e}"
),
);
return;
}
@@ -3223,9 +3232,11 @@ impl Player {
match decode_with_fallback(audio_data) {
Ok(fb) => Box::new(fb.skip_duration(skip_duration)),
Err(e) => {
log::error!(
"Failed to decode audio for seek: {}",
e
seek_abort(
&thread_state,
&format!(
"decode for seek failed: {e}"
),
);
return;
}
@@ -3247,7 +3258,10 @@ impl Player {
&analyzer_enabled,
);
if let Err(e) = engine.append(skipped_source) {
log::error!("Failed to append source for seek: {}", e);
seek_abort(
&thread_state,
&format!("append source for seek failed: {e}"),
);
return;
}
@@ -3262,6 +3276,7 @@ impl Player {
}
*current_engine = Some(engine);
thread_state.set_stream_error(false);
log::info!(
"Audio thread: seeked to {}s (was_playing: {})",
position_secs,