file_backend/
file_backend.rs1mod common;
14
15use cd_da_reader::{
16 AudioSectorReader, Toc, Track, create_wav, lba_to_msf, open_track_stream, read_track,
17};
18
19struct InMemoryDisc {
21 pcm: Vec<u8>,
23}
24
25impl AudioSectorReader for InMemoryDisc {
26 type Error = std::io::Error;
27
28 fn read_audio_sectors(&self, start_lba: u32, count: u32) -> Result<Vec<u8>, Self::Error> {
29 let start = start_lba as usize * 2352;
30 let end = start + count as usize * 2352;
31 self.pcm.get(start..end).map(<[u8]>::to_vec).ok_or_else(|| {
32 std::io::Error::new(std::io::ErrorKind::UnexpectedEof, "read past end of disc")
33 })
34 }
35}
36
37fn main() -> Result<(), Box<dyn std::error::Error>> {
38 let output_dir = common::fresh_output_dir("file_backend")?;
39
40 let track1_sectors = 75 * 2;
43 let track2_sectors = 75 * 3;
44 let total_sectors = track1_sectors + track2_sectors;
45
46 let toc = Toc {
47 first_track: 1,
48 last_track: 2,
49 tracks: vec![
50 Track {
51 number: 1,
52 start_lba: 0,
53 start_msf: lba_to_msf(0),
54 is_audio: true,
55 },
56 Track {
57 number: 2,
58 start_lba: track1_sectors,
59 start_msf: lba_to_msf(track1_sectors),
60 is_audio: true,
61 },
62 ],
63 leadout_lba: total_sectors,
64 };
65
66 let disc = InMemoryDisc {
68 pcm: vec![0u8; total_sectors as usize * 2352],
69 };
70
71 for track in &toc.tracks {
72 let pcm = read_track(&disc, &toc, track.number)?;
73 println!(
74 "track {}: {} bytes ({} sectors)",
75 track.number,
76 pcm.len(),
77 pcm.len() / 2352
78 );
79
80 let wav = create_wav(pcm);
81 let output_path = output_dir.join(format!("track{:02}.wav", track.number));
82 std::fs::write(&output_path, wav)?;
83 println!(" wrote {}", output_path.display());
84 }
85
86 let mut stream = open_track_stream(&disc, &toc, 1)?;
93 let (mut chunks, mut bytes) = (0u32, 0usize);
94 while let Some(chunk) = stream.next_chunk()? {
95 chunks += 1;
96 bytes += chunk.len();
97 }
98 println!(
99 "streamed track 1: {bytes} bytes in {chunks} chunks ({:.1}s of audio)",
100 stream.total_seconds()
101 );
102
103 Ok(())
104}