Skip to main content

read_all_tracks/
read_all_tracks.rs

1/// Reads every audio track from the default CD drive and saves each as a WAV file.
2use cd_da_reader::CdReader;
3
4fn main() -> Result<(), Box<dyn std::error::Error>> {
5    let reader = CdReader::open_default()?;
6    let toc = reader.read_toc()?;
7
8    let audio_tracks: Vec<_> = toc.tracks.iter().filter(|t| t.is_audio).collect();
9    println!("Found {} audio track(s)\n", audio_tracks.len());
10
11    let mut failed = Vec::new();
12
13    for track in &audio_tracks {
14        print!("Reading track {:>2}... ", track.number);
15        match reader.read_track(&toc, track.number) {
16            Ok(data) => {
17                let wav = CdReader::create_wav(data);
18                let filename = format!("track{:02}.wav", track.number);
19                std::fs::write(&filename, wav)?;
20                println!("saved {}", filename);
21            }
22            Err(e) => {
23                println!("FAILED: {}", e);
24                failed.push(track.number);
25            }
26        }
27    }
28
29    if !failed.is_empty() {
30        eprintln!("\nFailed to read tracks: {:?}", failed);
31    }
32
33    Ok(())
34}