mirror of
https://github.com/jpd002/Play-.git
synced 2025-04-28 13:47:57 +03:00
Add support for DVD CHDs.
This commit is contained in:
parent
a36557c1a2
commit
40e49e58b1
3 changed files with 25 additions and 10 deletions
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue