Skip to content

release_3.5.0

Latest

Choose a tag to compare

@drpetersonfernandes drpetersonfernandes released this 31 Aug 03:24

What's New in Batch Convert to CHD 3.5.0

Released August 31, 2026 — previous release 3.4.2

New Features

Smart input routing by content (PR #8)

Every input is now identified by its leading bytes, not by its file extension. A raw 2352-byte CD dump named .iso, .img, .bin or .isz converts correctly as the CD it is, instead of failing with "Data size is not divisible by sector size". Sector-size validation now also understands the 2448 and 2368 subchannel layouts.

Three new image formats — all decoded in-process, no external tools

  • ISZ (EZB Systems spec 1.00) — zlib, bzip2, stored and all-zero chunks, including images split across .i01/.i02 segments matched by volume serial number
  • ECM — full in-process decoding with EDC and Reed–Solomon parity regeneration, verified byte-for-byte against Neill Corlett's reference implementation; the external unecm.exe dependency is gone and ARM64 gets the same feature set
  • Alcohol 120% .mds/.mdf — track table parsed into a matching cue, subchannel tail stripped from 2448/2368-byte sectors, and a 2048-byte .mdf converts as a DVD image

Split-volume and split-track support

  • Multi-part sets (.001/.002, .i00/.i01) are rejoined before conversion; a missing part is reported instead of handing the encoder a partial image (only the first volume is listed)
  • A bare .bin is accepted as an input with a generated cue, and split-track (Track N) bin sets get a multi-FILE cue so the CDDA audio survives
  • Raw images already covered by a sibling descriptor (cue/bin, CloneCD) are dropped from the batch, so a set converts once through its descriptor rather than once per file

CHDSharp encoder with chdman fallback

Conversions now run on CHDSharp (v1.4.3), the project's own managed CHD encoder, which produces byte-identical output to chdman (verified by an exhaustive battleground comparison across the full corpus of CD, GD-ROM, DVD and HDD images). If CHDSharp fails for any reason, the conversion automatically falls back to the bundled chdman 0.289. ARM64 builds use OS-native binaries with fallback to the other architecture.

Safer conversion staging

Conversions are written to a .chdtmp file and moved into place only on success — a failed or retried conversion can no longer truncate a working CHD that shares its output name. Free-space is checked immediately before the encoder starts, and inputs that collide on the same output name are warned about at batch start.

Extraction no longer overwrites

Extraction never overwrites existing files and never asks. If a disc's output would land on same-named files, the whole set is diverted into a subfolder named after the disc instead — cue/gdi FILE entries stay valid without rewriting. Discs with nothing in their way are unaffected.

Update check with redundant sources

Update checks try the purelogiccode releases API first and fall back to the legacy releases URL; GitHub rate limits (403/429) skip the check silently instead of logging errors.

Static dark theme

The window background is now a solid dark color. The previous adaptive Mica backdrop tinted the window with your desktop wallpaper — it doesn't anymore.

Bug Fixes

  • Non-ASCII / overlong paths — chdman is now routed around them anywhere in the path (not just file names); conversions are staged in ASCII-safe temp directories and cue work directories avoid a non-ASCII %TEMP%
  • chdman startup crashes (e.g. 0xC000001D) are detected with actionable guidance instead of a silent hang; the encoder-lock probe is relaxed and output-folder writability is pre-flighted
  • Folders accidentally passed as disc images are skipped
  • cue-referenced .raw audio tracks are auto-detected and converted with -us 2352
  • Generated cues are written on the image's own volume (chdman cannot follow absolute FILE paths), and CCDSharp cue output no longer writes a BOM that chdman's cue parser can't skip
  • Broken cue FILE lines are resolved by name beside the cue, by extension swap, or — for single-FILE cues — by elimination
  • Encoder failure messages are descriptive even when chdman only prints a fatal-error summary
  • Fixed a trailing-period removal loop in filename sanitization, a CTS disposal leak, an OCE on cancellation during file loading, GDI handle leaks in screenshots, endianness issues (BinaryPrimitives), and 17 other issues found in a deep code audit
  • Failed extractions and conversions clean up after themselves; file copies retry on transient locks

Engineering & Housekeeping

  • New CHDBattleTest battleground harness — benchmarking and verifying chdman vs. CHDSharp decode/encode parity across a 56-file corpus (CD, GD-ROM, DVD, HDD), including head-to-head byte-parity, SHA1 and decode verify rows
  • NAudio 3.0.1 migration with a corrected MPEG-2 L3 test fixture; WPF-UI 4.3.0
  • Repository migrated to the purelogiccode organization
  • Documentation wiki overhauled and published at https://purelogiccode.github.io/BatchConvertToCHD/ (13 pages covering user guide, architecture, services, testing and troubleshooting)
  • Full path/crash hardening documented in the wiki; PBPSharp error codes (TruncatedPsar/InvalidSfo) are now distinguishable
  • 151 new tests — 751 total

Upgrade Notes

  • The external unecm.exe dependency has been removed — no action needed, ECM files just work
  • If you relied on extraction overwriting existing files, note that duplicates are now diverted to a disc-named subfolder instead
  • Update-check URLs now point at purelogiccode; the old drpetersonfernandes releases remain as a fallback

What's Changed

  • feat: route inputs by content and add ISZ, ECM and Alcohol support by @catchem88 in #8

New Contributors

Full Changelog: release_3.4.2...release_3.5.0