Add support for DVD CHDs.

This commit is contained in:
Jean-Philip Desjardins 2023-06-22 17:47:19 -04:00
parent a36557c1a2
commit 40e49e58b1
3 changed files with 25 additions and 10 deletions

View file

@ -117,10 +117,12 @@ static DiskUtils::OpticalMediaPtr CreateOpticalMediaFromChd(const fs::path& imag
default:
assert(false);
[[fallthrough]];
case CChdCdImageStream::TRACK_TYPE_MODE1:
case CChdCdImageStream::TRACK_TYPE_CD_MODE1:
return std::make_pair(std::make_shared<ISO9660::CBlockProviderCustom<0x990, 0>>(imageStream), COpticalMedia::TRACK_DATA_TYPE_MODE1_2048);
case CChdCdImageStream::TRACK_TYPE_MODE2_RAW:
case CChdCdImageStream::TRACK_TYPE_CD_MODE2_RAW:
return std::make_pair(std::make_shared<ISO9660::CBlockProviderCustom<0x990, 0x18>>(imageStream), COpticalMedia::TRACK_DATA_TYPE_MODE2_2352);
case CChdCdImageStream::TRACK_TYPE_DVD:
return std::make_pair(std::make_shared<ISO9660::CBlockProvider2048>(imageStream), COpticalMedia::TRACK_DATA_TYPE_MODE1_2048);
}
}();
return COpticalMedia::CreateCustomSingleTrack(std::move(trackInfo.first), trackInfo.second);

View file

@ -3,12 +3,11 @@
#include <cassert>
#include <cstring>
#define DVD_METADATA_TAG CHD_MAKE_TAG('D', 'V', 'D', ' ')
CChdCdImageStream::CChdCdImageStream(std::unique_ptr<Framework::CStream> baseStream)
: CChdImageStream(std::move(baseStream))
{
//We only support 2448 bytes units
assert(m_unitSize == 2448);
ReadMetadata();
}
@ -24,6 +23,8 @@ void CChdCdImageStream::ReadMetadata()
UINT32 outlen = 0;
if(chd_get_metadata(m_chd, CDROM_TRACK_METADATA2_TAG, 0, &metadata, sizeof(metadata), &outlen, nullptr, nullptr) == CHDERR_NONE)
{
assert(m_unitSize == 2448);
metadata[outlen] = 0;
int track = 0, frames = 0, preGap = 0, postGap = 0;
@ -33,12 +34,23 @@ void CChdCdImageStream::ReadMetadata()
type[bufferSize - 1] = 0;
if(!strcmp(type, "MODE2_RAW"))
{
m_track0Type = TRACK_TYPE_MODE2_RAW;
m_track0Type = TRACK_TYPE_CD_MODE2_RAW;
}
else
{
m_track0Type = TRACK_TYPE_MODE1;
m_track0Type = TRACK_TYPE_CD_MODE1;
}
}
}
else if(chd_get_metadata(m_chd, DVD_METADATA_TAG, 0, &metadata, sizeof(metadata), &outlen, nullptr, nullptr) == CHDERR_NONE)
{
assert(m_unitSize == 2048);
m_track0Type = TRACK_TYPE_DVD;
}
else
{
//No interesting metadata found, assuming MODE1 CD
assert(m_unitSize == 2448);
m_track0Type = TRACK_TYPE_CD_MODE1;
}
}

View file

@ -7,8 +7,9 @@ class CChdCdImageStream : public CChdImageStream
public:
enum TRACK_TYPE
{
TRACK_TYPE_MODE1,
TRACK_TYPE_MODE2_RAW,
TRACK_TYPE_CD_MODE1,
TRACK_TYPE_CD_MODE2_RAW,
TRACK_TYPE_DVD,
};
CChdCdImageStream(std::unique_ptr<Framework::CStream>);
@ -18,5 +19,5 @@ public:
private:
void ReadMetadata();
TRACK_TYPE m_track0Type = TRACK_TYPE_MODE1;
TRACK_TYPE m_track0Type = TRACK_TYPE_CD_MODE1;
};