cd-da-reader 0.3.1

CD-DA (audio CD) reading library
Documentation
use cd_da_reader::{CdReader, RetryConfig, TrackStreamConfig};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    let drive_path = default_drive_path();
    read_cd(drive_path)
}

#[cfg(target_os = "windows")]
fn default_drive_path() -> &'static str {
    r"\\.\E:"
}

#[cfg(target_os = "macos")]
fn default_drive_path() -> &'static str {
    "disk14"
}

#[cfg(target_os = "linux")]
fn default_drive_path() -> &'static str {
    "/dev/sr0"
}

fn read_cd(path: &str) -> Result<(), Box<dyn std::error::Error>> {
    let reader = CdReader::open(path)?;
    let toc = reader.read_toc()?;
    println!("{toc:#?}");

    let last_audio_track = toc
        .tracks
        .iter()
        .rev()
        .find(|track| track.is_audio)
        .ok_or_else(|| std::io::Error::other("no audio tracks in TOC"))?;

    println!("Reading track {}", last_audio_track.number);
    let stream_cfg = TrackStreamConfig {
        sectors_per_chunk: 27,
        retry: RetryConfig {
            max_attempts: 5,
            initial_backoff_ms: 30,
            max_backoff_ms: 500,
            reduce_chunk_on_retry: true,
            min_sectors_per_read: 1,
        },
    };
    let mut stream = reader.open_track_stream(&toc, last_audio_track.number, stream_cfg)?;

    let mut pcm = Vec::new();
    while let Some(chunk) = stream.next_chunk()? {
        pcm.extend_from_slice(&chunk);
    }
    let wav = CdReader::create_wav(pcm);
    std::fs::write("myfile.wav", wav)?;

    Ok(())
}