Files
pmomusic/pmoaudio/examples/play_with_resampling.rs

77 lines
2.4 KiB
Rust
Raw Normal View History

//! Exemple de lecture audio avec resampling et conversion de format
//!
//! Cet exemple montre comment construire un pipeline audio complet:
//! FileSource → ResamplingNode → ToI24Node → AudioSink
//!
//! Usage:
//! cargo run --example play_with_resampling -- <fichier.flac> [sample_rate]
use pmoaudio::{AudioSink, FileSource, ResamplingNode, ToI24Node};
use std::env;
use tokio_util::sync::CancellationToken;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
// Initialiser le logging
tracing_subscriber::fmt::init();
// Récupérer les arguments
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("Usage: {} <fichier.flac> [sample_rate]", args[0]);
eprintln!("\nExemple:");
eprintln!(" {} music.flac # Lecture normale", args[0]);
eprintln!(" {} music.flac 48000 # Resample vers 48kHz", args[0]);
std::process::exit(1);
}
let file_path = &args[1];
let target_sample_rate = if args.len() >= 3 {
args[2].parse::<u32>()?
} else {
48000 // Par défaut
};
println!("Lecture de: {}", file_path);
println!("Sample rate cible: {} Hz", target_sample_rate);
// Construire le pipeline: Source → Resampler → Converter → Sink
let sink = AudioSink::new();
let mut converter = ToI24Node::new();
converter.register(sink.boxed());
let mut resampler = ResamplingNode::new(target_sample_rate);
resampler.register(converter.boxed());
let mut source = FileSource::new(file_path);
source.register(resampler.boxed());
2025-11-14 10:43:53 +01:00
println!(
"Pipeline créé: FileSource → Resampling({} Hz) → ToI24 → AudioSink",
target_sample_rate
);
println!("Démarrage de la lecture...");
println!("Appuyez sur Ctrl+C pour arrêter");
// Créer un token d'annulation
let stop_token = CancellationToken::new();
let stop_token_clone = stop_token.clone();
// Gérer Ctrl+C
tokio::spawn(async move {
2025-11-14 10:43:53 +01:00
tokio::signal::ctrl_c()
.await
.expect("Failed to listen for Ctrl+C");
println!("\nArrêt demandé...");
stop_token_clone.cancel();
});
// Lancer le pipeline
match Box::new(source).run(stop_token).await {
Ok(()) => println!("\nLecture terminée"),
Err(e) => eprintln!("\nErreur pendant la lecture: {}", e),
}
Ok(())
}