MCPcopy Create free account
hub / github.com/PCSX2/pcsx2 / cdvdBlockReadTime

Function cdvdBlockReadTime

pcsx2/CDVD/CDVD.cpp:874–913  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

872}
873
874static uint cdvdBlockReadTime(CDVD_MODE_TYPE mode) noexcept
875{
876 // CAV Read speed is roughly 41% in the centre full speed on outer edge. I imagine it's more logarithmic than this
877 if (cdvd.SpindlCtrl & CDVD_SPINDLE_CAV)
878 {
879 int numSectors = 0;
880 int offset = 0;
881
882 // Sector counts are taken from google for Single layer, Dual layer DVD's and for 700MB CD's
883 switch (cdvd.DiscType)
884 {
885 case CDVD_TYPE_DETCTDVDS:
886 case CDVD_TYPE_PS2DVD:
887 case CDVD_TYPE_DETCTDVDD:
888 numSectors = 2298496;
889 u32 layer1Start;
890 s32 dualType;
891
892 // Layer 1 needs an offset as it goes back to the middle of the disc
893 cdvdReadDvdDualInfo(&dualType, &layer1Start);
894 if (cdvd.SeekToSector >= layer1Start)
895 offset = layer1Start;
896 break;
897 default: // Pretty much every CD format
898 numSectors = 360000;
899 break;
900 }
901
902 // 0.40f is the "base" inner track speed.
903 const float sectorSpeed = ((static_cast<float>(cdvd.SeekToSector - offset) / static_cast<float>(numSectors)) * 0.60f) + 0.40f;
904 const float cycles = static_cast<float>(PSXCLK) / (static_cast<float>(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * cdvd.Speed) * sectorSpeed);
905
906 return static_cast<int>(cycles);
907 }
908
909 // CLV Read Speed is constant
910 const float cycles = static_cast<float>(PSXCLK) / static_cast<float>(((mode == MODE_CDROM) ? CD_SECTORS_PERSECOND : DVD_SECTORS_PERSECOND) * std::min(static_cast<float>(cdvd.Speed), (mode == MODE_CDROM) ? 10.3f : 1.6f));
911
912 return static_cast<int>(cycles);
913}
914
915void cdvdReset()
916{

Callers 2

cdvdResetFunction · 0.85
cdvdStartSeekFunction · 0.85

Calls 2

cdvdReadDvdDualInfoFunction · 0.85
minFunction · 0.50

Tested by

no test coverage detected