diff --git a/src/common/cd_image.cpp b/src/common/cd_image.cpp index f2f2ed423..a235df51e 100644 --- a/src/common/cd_image.cpp +++ b/src/common/cd_image.cpp @@ -255,6 +255,11 @@ bool CDImage::ReadSubChannelQ(SubChannelQ* subq) return true; } +bool CDImage::HasNonStandardSubchannel() const +{ + return false; +} + const CDImage::Index* CDImage::GetIndexForDiscPosition(LBA pos) { for (const Index& index : m_indices) diff --git a/src/common/cd_image.h b/src/common/cd_image.h index 1977cc2e9..088e74f7b 100644 --- a/src/common/cd_image.h +++ b/src/common/cd_image.h @@ -242,6 +242,9 @@ public: // Reads sub-channel Q for the current LBA. virtual bool ReadSubChannelQ(SubChannelQ* subq); + // Returns true if the image has replacement subchannel data. + virtual bool HasNonStandardSubchannel() const; + // Reads a single sector from an index. virtual bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) = 0; diff --git a/src/common/cd_image_bin.cpp b/src/common/cd_image_bin.cpp index f62d48f40..6cc9cef36 100644 --- a/src/common/cd_image_bin.cpp +++ b/src/common/cd_image_bin.cpp @@ -14,6 +14,7 @@ public: bool Open(const char* filename); bool ReadSubChannelQ(SubChannelQ* subq) override; + bool HasNonStandardSubchannel() const override; protected: bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) override; @@ -103,6 +104,11 @@ bool CDImageBin::ReadSubChannelQ(SubChannelQ* subq) return CDImage::ReadSubChannelQ(subq); } +bool CDImageBin::HasNonStandardSubchannel() const +{ + return (m_sbi.GetReplacementSectorCount() > 0); +} + bool CDImageBin::ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) { const u64 file_position = index.file_offset + (static_cast(lba_in_index) * index.file_sector_size); diff --git a/src/common/cd_image_chd.cpp b/src/common/cd_image_chd.cpp index afd26066d..eae155555 100644 --- a/src/common/cd_image_chd.cpp +++ b/src/common/cd_image_chd.cpp @@ -49,6 +49,7 @@ public: bool Open(const char* filename); bool ReadSubChannelQ(SubChannelQ* subq) override; + bool HasNonStandardSubchannel() const override; protected: bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) override; @@ -262,6 +263,11 @@ bool CDImageCHD::ReadSubChannelQ(SubChannelQ* subq) return CDImage::ReadSubChannelQ(subq); } +bool CDImageCHD::HasNonStandardSubchannel() const +{ + return (m_sbi.GetReplacementSectorCount() > 0); +} + // There's probably a more efficient way of doing this with vectorization... ALWAYS_INLINE static void CopyAndSwap(void* dst_ptr, const u8* src_ptr, u32 data_size) { diff --git a/src/common/cd_image_cue.cpp b/src/common/cd_image_cue.cpp index 7be980fe5..a893bc4ec 100644 --- a/src/common/cd_image_cue.cpp +++ b/src/common/cd_image_cue.cpp @@ -18,6 +18,7 @@ public: bool OpenAndParse(const char* filename); bool ReadSubChannelQ(SubChannelQ* subq) override; + bool HasNonStandardSubchannel() const override; protected: bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) override; @@ -258,6 +259,11 @@ bool CDImageCueSheet::ReadSubChannelQ(SubChannelQ* subq) return CDImage::ReadSubChannelQ(subq); } +bool CDImageCueSheet::HasNonStandardSubchannel() const +{ + return (m_sbi.GetReplacementSectorCount() > 0); +} + bool CDImageCueSheet::ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) { DebugAssert(index.file_index < m_files.size()); diff --git a/src/common/cd_image_memory.cpp b/src/common/cd_image_memory.cpp index c3e38cb0b..57711f2ee 100644 --- a/src/common/cd_image_memory.cpp +++ b/src/common/cd_image_memory.cpp @@ -18,6 +18,7 @@ public: bool CopyImage(CDImage* image, ProgressCallback* progress); bool ReadSubChannelQ(SubChannelQ* subq) override; + bool HasNonStandardSubchannel() const override; protected: bool ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) override; @@ -123,6 +124,11 @@ bool CDImageMemory::ReadSubChannelQ(SubChannelQ* subq) return CDImage::ReadSubChannelQ(subq); } +bool CDImageMemory::HasNonStandardSubchannel() const +{ + return (m_sbi.GetReplacementSectorCount() > 0); +} + bool CDImageMemory::ReadSectorFromIndex(void* buffer, const Index& index, LBA lba_in_index) { DebugAssert(index.file_index == 0);