Fix compilation errors in FlacCacheSink streaming implementation

Corrections :
- Removed unused Cursor import
- Fixed borrow checker issues by using tokio::join! instead of tokio::spawn
- Kept progressive streaming approach with add_from_reader

La solution finale utilise tokio::join! pour exécuter pump_track_segments
et add_from_reader en parallèle, évitant ainsi les problèmes de lifetime
avec tokio::spawn tout en conservant le streaming progressif.
This commit is contained in:
Claude
2025-11-06 21:49:17 +00:00
parent 06f514e6c6
commit 427c527810

View File

@@ -10,7 +10,6 @@ use pmoaudiocache::AudioTrackMetadataExt;
use pmoflac::{encode_flac_stream, EncoderOptions, PcmFormat};
use std::{
collections::VecDeque,
io::Cursor,
pin::Pin,
sync::Arc,
task::{Context, Poll},
@@ -133,36 +132,36 @@ impl NodeLogic for FlacCacheSinkLogic {
AudioError::ProcessingError(format!("FLAC encode init failed: {}", e))
})?;
// Lancer pump_track_segments en parallèle
let pump_handle = tokio::spawn(pump_track_segments(
// Ingérer le FLAC progressivement dans le cache
// add_from_reader lance l'ingestion en arrière-plan et retourne dès que
// le prebuffer (512 KB) est atteint, permettant un streaming progressif
let collection_ref = self.collection.as_deref();
let cache_future = self.cache.add_from_reader(
None,
flac_stream,
None, // Taille inconnue car streaming
collection_ref,
);
// Exécuter pump et add_from_reader en parallèle
let pump_future = pump_track_segments(
first_segment,
&mut rx,
pcm_tx,
bits_per_sample,
sample_rate,
stop_token.clone(),
));
&stop_token,
);
// Ingérer le FLAC progressivement dans le cache
// add_from_reader retourne dès que le prebuffer (512 KB) est atteint
let collection_ref = self.collection.as_deref();
let pk = self.cache
.add_from_reader(
None,
flac_stream,
None, // Taille inconnue car streaming
collection_ref,
)
.await
.map_err(|e| {
AudioError::ProcessingError(format!("Failed to add to cache: {}", e))
})?;
// Attendre les deux tâches en parallèle
let (cache_result, pump_result) = tokio::join!(cache_future, pump_future);
let pk = cache_result.map_err(|e| {
AudioError::ProcessingError(format!("Failed to add to cache: {}", e))
})?;
tracing::debug!("Track added to cache with pk {}, prebuffer complete", pk);
// Attendre la fin du pump
let pump_result = pump_handle.await
.map_err(|e| AudioError::ProcessingError(format!("Pump task failed: {}", e)))?;
let (_chunks, _samples, _duration_sec, stop_reason) = pump_result?;
// Copier les métadonnées du TrackBoundary dans le cache