From f3d56f415019ca04dcb43d4bccd96e21ca6fdbfb Mon Sep 17 00:00:00 2001 From: Claude Date: Thu, 6 Nov 2025 21:57:16 +0000 Subject: [PATCH] Handle gracefully when file is already in cache MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Quand un fichier est déjà en cache, add_from_reader() retourne immédiatement sans lire le stream FLAC, ce qui ferme le channel PCM. Avant cette correction, pump_track_segments() retournait une erreur SendError, causant l'échec du pipeline download. Changements : - Dans pump_track_segments(), détecter quand le channel est fermé - Retourner Ok avec StopReason::ChannelClosed au lieu d'une erreur - Ceci permet au pipeline de se terminer gracieusement Cette situation est normale et attendue quand le fichier est déjà en cache. --- pmoaudio-ext/src/sinks/flac_cache_sink.rs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/pmoaudio-ext/src/sinks/flac_cache_sink.rs b/pmoaudio-ext/src/sinks/flac_cache_sink.rs index fd2e009c..150572f6 100755 --- a/pmoaudio-ext/src/sinks/flac_cache_sink.rs +++ b/pmoaudio-ext/src/sinks/flac_cache_sink.rs @@ -363,10 +363,12 @@ async fn pump_track_segments( if let Some(chunk) = first_segment.as_chunk() { let pcm_bytes = chunk_to_pcm_bytes(chunk, bits_per_sample)?; if !pcm_bytes.is_empty() { - pcm_tx - .send(pcm_bytes) - .await - .map_err(|_| AudioError::SendError)?; + // Si le send échoue, c'est que le receiver est fermé + // (par exemple, le fichier était déjà en cache et add_from_reader a retourné immédiatement) + if pcm_tx.send(pcm_bytes).await.is_err() { + drop(pcm_tx); + return Ok((chunks, samples, duration_sec, StopReason::ChannelClosed)); + } chunks += 1; samples += chunk.len() as u64; duration_sec += chunk.len() as f64 / expected_rate as f64; @@ -407,10 +409,12 @@ async fn pump_track_segments( continue; } - pcm_tx - .send(pcm_bytes) - .await - .map_err(|_| AudioError::SendError)?; + // Si le send échoue, c'est que le receiver est fermé + // (par exemple, le fichier était déjà en cache et add_from_reader a retourné immédiatement) + if pcm_tx.send(pcm_bytes).await.is_err() { + drop(pcm_tx); + return Ok((chunks, samples, duration_sec, StopReason::ChannelClosed)); + } chunks += 1; samples += chunk.len() as u64;