Skip to content

Add pluggable AudioSectorReader file backing (1.0)#58

Open
danifunker wants to merge 3 commits into
Bloomca:mainfrom
danifunker:file-backend-on-1.0
Open

Add pluggable AudioSectorReader file backing (1.0)#58
danifunker wants to merge 3 commits into
Bloomca:mainfrom
danifunker:file-backend-on-1.0

Conversation

@danifunker

Copy link
Copy Markdown
Contributor

Summary

Adds a hardware-independent seam for reading CD-DA tracks from a file/image
(CHD, BIN/CUE, in-memory, network, …) reusing the crate's existing TOC/track
machinery, with no image-format dependencies pulled into the crate. Also bumps
to 1.0.0, the first release carrying the breaking 1.0 API already on main.

This is the file-based-backend work rebuilt on top of the 1.0 API rather than
git-rebased: main and that branch had independently built data-track support, so
a literal rebase would have collided and dragged back the older implementation.
Only the genuinely-unique file backing is ported here.

Public API additions

  • AudioSectorReader trait — implement read_audio_sectors(start_lba, count) for
    any backing that yields raw CD-DA sectors (2352 B, 16-bit signed LE, stereo).
  • read_track(&src, &toc, n) -> Result<Vec<u8>, TrackReadError<E>> — the
    file/image counterpart to CdReader::read_track; TrackReadError keeps a bad
    track request (Toc) separate from a backing failure (Backend(E)).
  • Free create_wav(Vec<u8>) and public lba_to_msf(u32) — the support surface a
    backing needs (WAV wrapping without naming CdReader; building a Toc from
    image metadata).
  • CdReader itself implements AudioSectorReadeked code share the generic read_track` path.

No changes to existing drive behavior.

Examples

  • examples/file_backend.rs — dependency-free ihe seam
    without a decoder).
  • examples/save_data_track.rs — detect a data it
    cooked to a mountable .iso (bounded memory),t command;
    Mode 2 falls back to saving complete raw secto

Docs

  • docs/consuming-cd-da-reader.md — downstream-del,
    sector formats, detect_track_format, the dats Mode 2,
    file backing, and a pre-1.0 → 1.0 migration ta
  • README: "Reading data tracks" and "Reading from a file image" sections.

Verification

cargo fmt --check, cargo clippy --all-targets -- -D warnings, and
cargo test (49 unit + 6 doctests) all pass. fnd (valid RIFF…WAVE, correct sizes). The drive-dependent examples (save_data_track, read_data_track`) are compit path
needs a physical mixed-mode disc.

Note for reviewers

The 1.0.0 bump rides along with this feature. If you'd rather tag the release
independently, land the version commit (`885335ed keep
this PR purely additive — or just squash-merge.

danifunker and others added 3 commits July 12, 2026 18:44
Reconstructs the pluggable file/image backing from the pre-1.0
`file-based-backend` branch on top of main's unified read API, since a
literal rebase would collide with main's independently-built data-track
support.

- backend.rs: AudioSectorReader trait, `read_track` free fn, and
  TrackReadError, with the CdReader impl now reading via
  `read_sector_range(.., &ReadOptions::default())`.
- Expose the support surface the seam needs: free `create_wav` and a
  public `lba_to_msf` (for building a Toc from image metadata).
- examples: file_backend (dependency-free backing) and save_data_track
  (detect -> read cooked -> save .iso -> mount).
- docs/consuming-cd-da-reader.md: downstream-consumer guide covering the
  options model, sector formats, detection, the data-track workflow,
  Mode 1 vs Mode 2, file backing, and a pre-1.0 -> 1.0 migration table.
- README: data-track and file-image sections.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The data-track example read the entire track into a Vec before writing —
a full data track can be hundreds of MB. Switch it to the streaming API
(open_track_stream_with_options) so cooked/raw chunks are written as they
arrive and peak memory is one ~64 KB chunk regardless of track size.

Both the ISO (Mode1Cooked) and Mode 2 branches now share one
stream_track_to_file helper with a progress line, which also showcases
that reading and streaming run over the same options/read path. Docs
updated to recommend streaming for large images.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
First release carrying the breaking 1.0 API (SectorReadFormat, per-read
ReadOptions, detect_track_format) plus the AudioSectorReader file backing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant