3.9.5 (2026-10-16)
Encoder library: CHDSharp 1.4.4 / 1.4.5
- Redump Dreamcast multi-cues convert byte-identically to
chdman. A.cueholding both images of a GD-ROM (REM SINGLE-DENSITY AREA/REM HIGH-DENSITY AREA) previously produced a plain-CD layout; the parser now applies MAME'sis_gdicuerules — pregaps move onto the previous track as split regions, the last single-density track pads up to LBA 45000, and the CHD is stamped withCHGDGD-ROM metadata. Verified against a real 1.19 GB Redump multi-cue: identical SHA-1 and metadata tochdman createcd, andchdman extractcdon the app's output restores every track byte-for-byte. - Multisession cues (IsoBuster/ImgBurn/Redump/DiscImageCreator) are laid out like chdman.
REM SESSION/REM LEAD-IN/REM LEAD-OUTand sessionREM PREGAPare now honored: single-bin images trim the session's last track at the declared lead-out and turn the inter-session dummy data into zero-filled pad frames (with DiscImageCreator's.imgno-padding heuristic); multi-bin images get the synthesized standard lead-in/lead-out values. An inconsistent lead-out that would go negative is rejected with a clear error instead of being encoded as a silently wrong image. Byte-parity is pinned bychdman createcdfixtures for all three layouts. - cdrdao
.tocfiles with a bareSTARTline convert. MAME accepts a numberlessSTART(no pregap); the built-in parser rejected it withMalformed START command, failing every.tocchdman converts. BothSTARTforms now produce byte-identical output to chdman.
cdrdao .toc staging and malformed-cue fixes (#68261, #68249)
- A staged
.tockeeps its extension. When a descriptor needed the work directory (UTF-8 BOM, non-ASCII names, …) it was always renamed togame.cue; cdrdao syntax (TRACK MODE2_RAW,DATAFILE …) then reached the CUE parser in both encoders and failed withMalformed TRACK command: TRACK MODE2_RAW. The work descriptor is nowgame.tocfor.tocinput, and itsDATAFILE/AUDIOFILEreferences are copied and rewritten with theirSWAP/offset/length arguments preserved. - Backslash-escaped quotes and missing
BINARYtokens are repaired. A cue written asFILE \"track01.bin\"(escape backslashes, no type token) could not resolve its bin and made the fallback reportMalformed FILE command. The normalizer now unescapes the name and infers the missing type from the extension, producing a canonical cue that both encoders accept. - A descriptor that describes more data than its file holds (truncated rip) is documented and classified.
chdmanreportsError reading input file, the built-in encoderUnexpected end of file— both reject the same files, so it is a user-data condition; the troubleshooting page explains it and it files no bug report.
chdman crash handling (#68281)
- One conversion-time crash switches the batch to the built-in encoder. The startup probe only runs
chdman help; a chdman that dies later withSTATUS_ILLEGAL_INSTRUCTION(a CPU without the build's SIMD extensions) used to crash again for every file. The first negative exit code now sets a per-batch flag: the remaining files are encoded in-process, and the crash summary is excluded from bug reports as an installation problem (matching the startup-check policy).
Fewer false bug reports (#68256, #68260)
chdman exited with code N and its output is not a valid CHD (…); discarding it.— the intermediate validation notice for a partial output no longer files a report; the classified final message still reports the real cause.Source file appears to be corrupt: …(a CRC/data error while copying a source for the temp retry) is a user-data condition; it is now excluded from reports and logs the underlying exception to the local log file.
Housekeeping
- Package updates: CHDSharp 1.4.3 → 1.4.5 (two parity releases, see above), NAudio 3.1.0 → 3.2.0.
- Test suite: 1146 tests (1117 unit + 29 integration) across 58 test classes; CHDSharp 1.4.5 ships 451 green tests, including the
chdmanbyte-parity suites for the three descriptor fixes.