Skip to main content

custom_retry/
custom_retry.rs

1/// Reads the first audio track with an aggressive retry configuration
2/// suitable for scratched or damaged discs.
3/// By default, it already retries multiple times with smaller number
4/// of sectors, so this usually should not be necessary, but you can see
5/// here that you can tweak details.
6use cd_da_reader::{CdReader, RetryConfig};
7
8fn main() -> Result<(), Box<dyn std::error::Error>> {
9    let reader = CdReader::open_default()?;
10    let toc = reader.read_toc()?;
11
12    let first_audio = toc
13        .tracks
14        .iter()
15        .find(|t| t.is_audio)
16        .ok_or("no audio tracks found")?;
17
18    // More attempts, longer backoff, and sector reduction down to 1
19    // for maximum resilience on scratched media.
20    let retry = RetryConfig {
21        max_attempts: 8,
22        initial_backoff_ms: 50,
23        max_backoff_ms: 1000,
24        reduce_chunk_on_retry: true,
25        min_sectors_per_read: 1,
26    };
27
28    println!(
29        "Reading track {} with aggressive retry...",
30        first_audio.number
31    );
32    let data = reader.read_track_with_retry(&toc, first_audio.number, &retry)?;
33
34    let wav = CdReader::create_wav(data);
35    let filename = format!("track{:02}.wav", first_audio.number);
36    std::fs::write(&filename, wav)?;
37    println!("Saved {}", filename);
38
39    Ok(())
40}