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.
2mod common;
3
4use cd_da_reader::{CdReader, create_wav};
5
6fn main() -> Result<(), Box<dyn std::error::Error>> {
7    let output_dir = common::fresh_output_dir("read_all_tracks")?;
8    let reader = CdReader::open_default()?;
9    let toc = reader.read_toc()?;
10
11    let audio_tracks: Vec<_> = toc.tracks.iter().filter(|t| t.is_audio).collect();
12    println!("Found {} audio track(s)\n", audio_tracks.len());
13
14    let mut failed = Vec::new();
15
16    for track in &audio_tracks {
17        print!("Reading track {:>2}... ", track.number);
18        match reader.read_track(&toc, track.number) {
19            Ok(data) => {
20                let wav = create_wav(data);
21                let output_path = output_dir.join(format!("track{:02}.wav", track.number));
22                std::fs::write(&output_path, wav)?;
23                println!("saved {}", output_path.display());
24            }
25            Err(e) => {
26                println!("FAILED: {}", e);
27                failed.push(track.number);
28            }
29        }
30    }
31
32    if !failed.is_empty() {
33        eprintln!("\nFailed to read tracks: {:?}", failed);
34    }
35
36    Ok(())
37}