From 185ea7e3f1df3ddd8e323751805da61a79bad830 Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sat, 7 Sep 2024 16:05:43 +1000 Subject: [PATCH] CDImage: Support reading MODE1 sectors --- src/util/cd_image.cpp | 21 +++++++++++++++++++-- src/util/cd_image.h | 2 ++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/util/cd_image.cpp b/src/util/cd_image.cpp index 810b6f4ad..043bfe703 100644 --- a/src/util/cd_image.cpp +++ b/src/util/cd_image.cpp @@ -267,9 +267,26 @@ u32 CDImage::Read(ReadMode read_mode, u32 sector_count, void* buffer) switch (read_mode) { case ReadMode::DataOnly: - std::memcpy(buffer_ptr, raw_sector + 24, DATA_SECTOR_SIZE); + { + const SectorHeader* header = reinterpret_cast(raw_sector + SECTOR_SYNC_SIZE); + if (header->sector_mode == 1) + { + std::memcpy(buffer_ptr, raw_sector + SECTOR_SYNC_SIZE + MODE1_HEADER_SIZE, DATA_SECTOR_SIZE); + } + else if (header->sector_mode == 2) + { + std::memcpy(buffer_ptr, raw_sector + SECTOR_SYNC_SIZE + MODE2_HEADER_SIZE, DATA_SECTOR_SIZE); + } + else + { + ERROR_LOG("Invalid sector mode {} at LBA {}", header->sector_mode, + m_current_index->start_lba_on_disc + m_position_in_track); + break; + } + buffer_ptr += DATA_SECTOR_SIZE; - break; + } + break; case ReadMode::RawNoSync: std::memcpy(buffer_ptr, raw_sector + SECTOR_SYNC_SIZE, RAW_SECTOR_SIZE - SECTOR_SYNC_SIZE); diff --git a/src/util/cd_image.h b/src/util/cd_image.h index 503974abd..0471439bb 100644 --- a/src/util/cd_image.h +++ b/src/util/cd_image.h @@ -30,6 +30,8 @@ public: DATA_SECTOR_SIZE = 2048, SECTOR_SYNC_SIZE = 12, SECTOR_HEADER_SIZE = 4, + MODE1_HEADER_SIZE = 4, + MODE2_HEADER_SIZE = 12, FRAMES_PER_SECOND = 75, // "sectors", or "timecode frames" (not "channel frames") SECONDS_PER_MINUTE = 60, FRAMES_PER_MINUTE = FRAMES_PER_SECOND * SECONDS_PER_MINUTE,