From 3cb584646c53163fa83cda86d0649dc935da28bd Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Sun, 1 Mar 2026 23:09:28 +0100 Subject: [PATCH] =?UTF-8?q?Pipeline:=20Ajout=20de=20la=20reprise=20depuis?= =?UTF-8?q?=20la=20position=20paus=C3=A9e=20et=20am=C3=A9lioration=20des?= =?UTF-8?q?=20logs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implémente la reprise depuis la position pausée lors du redémarrage de la source, en conservant la position dans l'état. Met à jour les logs pour mieux refléter le comportement de pause et d'arrêt. Les modifications incluent : - Ajout du seek lors du redémarrage de la source - Mise à jour de la gestion de la pause pour conserver la position - Amélioration des messages de log pour plus de clarté --- pmowebrenderer/src/pipeline.rs | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/pmowebrenderer/src/pipeline.rs b/pmowebrenderer/src/pipeline.rs index 37b27dfc..71c4d2d7 100644 --- a/pmowebrenderer/src/pipeline.rs +++ b/pmowebrenderer/src/pipeline.rs @@ -210,7 +210,11 @@ async fn run_pipeline( // Redémarrer la source si elle n'est pas en cours if current_source_stop.is_none() { if let Some(uri) = current_uri.clone() { - info!(udn = %udn, uri = %uri, "Pipeline: Play — restarting source"); + // Reprendre depuis la position pausée (0.0 si pas de pause) + let seek = state.read().position.as_deref() + .map(upnp_time_to_seconds) + .unwrap_or(0.0); + info!(udn = %udn, uri = %uri, seek = seek, "Pipeline: Play — restarting source"); let src_stop = stop_token.child_token(); current_source_stop = Some(src_stop.clone()); let tx = segment_tx.clone(); @@ -221,7 +225,7 @@ async fn run_pipeline( let cp = control_point.clone(); tokio::spawn(async move { stream_source( - uri, 0.0, tx, src_stop, st, udn_c, + uri, seek, tx, src_stop, st, udn_c, #[cfg(feature = "pmoserver")] cp, ).await; @@ -236,7 +240,12 @@ async fn run_pipeline( } Some(PipelineControl::Pause) => { - debug!(udn = %udn, "Pipeline: Pause (not supported on live stream)"); + info!(udn = %udn, "Pipeline: Pause — stopping source, position preserved"); + if let Some(src_stop) = current_source_stop.take() { + src_stop.cancel(); + } + state.write().playback_state = PlaybackState::Paused; + // position reste dans state pour la reprise via Play } Some(PipelineControl::Stop) => {