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:
1 file changed
+31
-16
@@ -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,
|
||||
|
||||
Reference in new issue
Block a user