diff --git a/Core/PSPLoaders.cpp b/Core/PSPLoaders.cpp index 01572b51cb..94d06b87b6 100644 --- a/Core/PSPLoaders.cpp +++ b/Core/PSPLoaders.cpp @@ -55,6 +55,7 @@ #include "Core/PSPLoaders.h" #include "Core/HLE/sceKernelModule.h" #include "Core/HLE/PopsBoot.h" +#include "Core/Util/PSARUnpack.h" static void UseLargeMem(int memsize) { if (memsize != 1) { @@ -474,7 +475,7 @@ bool Load_PSP_ISO(FileLoader *fileLoader, std::string *error_string) { if (pspFileSystem.GetFileInfo("disc0:/SYSTEM.CNF;1").exists || pspFileSystem.GetFileInfo("disc0:/PSX.EXE;1").exists) { *error_string = "PPSSPP plays PSP games, not PlayStation 1 or 2 games."; } else if (pspFileSystem.GetFileInfo("disc0:/UMD_VIDEO/PLAYLIST.UMD").exists) { - *error_string = "PPSSPP doesn't support UMD Video."; + *error_string = std::string("UMD Video plays in the XMB, which needs PSP firmware ") + UMD_VIDEO_MIN_FIRMWARE + " or later."; } else if (pspFileSystem.GetFileInfo("disc0:/UMD_AUDIO/PLAYLIST.UMD").exists) { *error_string = "PPSSPP doesn't support UMD Music."; } else if (pspFileSystem.GetDirListing("disc0:/").empty()) { diff --git a/Core/System.cpp b/Core/System.cpp index 5f23bc1735..f3d758cd69 100644 --- a/Core/System.cpp +++ b/Core/System.cpp @@ -292,7 +292,7 @@ static void GetBootError(IdentifiedFileType type, std::string *errorString) { case IdentifiedFileType::PPSSPP_SAVESTATE: *errorString = "This is a saved state, not a game."; break; // Actually, we could make it load it... case IdentifiedFileType::PSP_SAVEDATA_DIRECTORY: *errorString = "This is save data, not a game."; break; case IdentifiedFileType::PSP_PS1_PBP: *errorString = "PS1 EBOOTs are not supported by PPSSPP."; break; - case IdentifiedFileType::PSP_UMD_VIDEO_ISO: *errorString = "UMD Video ISOs are not supported by PPSSPP."; break; + case IdentifiedFileType::PSP_UMD_VIDEO_ISO: *errorString = std::string("UMD Video plays in the XMB, which needs PSP firmware ") + UMD_VIDEO_MIN_FIRMWARE + " or later."; break; case IdentifiedFileType::UNKNOWN_BIN: case IdentifiedFileType::UNKNOWN_ELF: case IdentifiedFileType::UNKNOWN_ISO: @@ -468,9 +468,10 @@ static bool CPU_Init(FileLoader *fileLoader, IdentifiedFileType type, std::strin break; case IdentifiedFileType::PSP_UMD_VIDEO_ISO: { - ERROR_LOG(Log::Loader, "PPSSPP doesn't support UMD Video."); + // The game list boots the XMB for these, which plays them. + ERROR_LOG(Log::Loader, "UMD Video can't be booted directly, only played in the XMB"); auto er = GetI18NCategory(I18NCat::ERRORS); - *errorString = er->T("PPSSPP doesn't support UMD Video."); + *errorString = ApplySafeSubstitutions(er->T("PSP firmware version %1 or later must be installed to play UMD video"), UMD_VIDEO_MIN_FIRMWARE); return false; } default: diff --git a/Core/Util/PSARUnpack.cpp b/Core/Util/PSARUnpack.cpp index 4821bf7df8..71db0d54db 100644 --- a/Core/Util/PSARUnpack.cpp +++ b/Core/Util/PSARUnpack.cpp @@ -1356,11 +1356,13 @@ bool FirmwareVersionSupportsVSH(std::string_view version) { return FirmwareVersionToInt(version) >= 150; } +// Measured by booting Bourne Supremacy with auto-start on: 2.71 through 6.61 reach its disc menu. +// 1.50, 2.00 and 2.60 crash in video_plugin or paf as soon as the disc is in the drive, and 2.50 +// says the system software (version ".") is too old for it. +const char *const UMD_VIDEO_MIN_FIRMWARE = "2.71"; + bool FirmwareVersionPlaysUmdVideo(std::string_view version) { - // Measured by booting Bourne Supremacy with auto-start on: 2.71 through 6.61 reach its disc menu. - // 1.50, 2.00 and 2.60 crash in video_plugin or paf as soon as the disc is in the drive, and - // 2.50 says the system software (version ".") is too old for it. - return FirmwareVersionSupportsVSH(version) && FirmwareVersionToInt(version) >= 271; + return FirmwareVersionSupportsVSH(version) && FirmwareVersionToInt(version) >= FirmwareVersionToInt(UMD_VIDEO_MIN_FIRMWARE); } std::string BundledUpdateInfo::Describe() const { diff --git a/Core/Util/PSARUnpack.h b/Core/Util/PSARUnpack.h index d19bf69329..19ae34b655 100644 --- a/Core/Util/PSARUnpack.h +++ b/Core/Util/PSARUnpack.h @@ -187,6 +187,8 @@ bool FirmwareVersionSupportsVSH(std::string_view version); // Whether that VSH's own player plays UMD Video discs. bool FirmwareVersionPlaysUmdVideo(std::string_view version); +// The oldest firmware that does. +extern const char *const UMD_VIDEO_MIN_FIRMWARE; // Installs a firmware into the NAND directory. Two firmwares can't be merged - a file the new one // doesn't have would linger and still get loaded - so this replaces rather than overlays. diff --git a/UI/GameScreen.cpp b/UI/GameScreen.cpp index 8ab9c69deb..6176b901e1 100644 --- a/UI/GameScreen.cpp +++ b/UI/GameScreen.cpp @@ -43,6 +43,7 @@ #include "Core/Util/GameDB.h" #include "Core/Util/RecentFiles.h" #include "Core/Util/PathUtil.h" +#include "Core/Util/PSARUnpack.h" #include "Core/Util/VideoPlayer.h" #include "UI/OnScreenDisplay.h" #include "UI/Background.h" @@ -369,7 +370,7 @@ void GameScreen::CreateContentViews(UI::ViewGroup *parent) { if (info_->fileType == IdentifiedFileType::PSP_UMD_VIDEO_ISO && GetUmdVideoVSHPath().empty()) { auto er = GetI18NCategory(I18NCat::ERRORS); - leftColumn->Add(new NoticeView(NoticeLevel::INFO, er->T("PPSSPP doesn't support UMD Video."), "")); + leftColumn->Add(new NoticeView(NoticeLevel::INFO, ApplySafeSubstitutions(er->T("PSP firmware version %1 or later must be installed to play UMD video"), UMD_VIDEO_MIN_FIRMWARE), "")); leftColumn->Add(new Choice(di->T("More info"), ImageID("I_LINK_OUT_QUESTION"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)))->OnClick.Add([](UI::EventParams &e) { System_LaunchUrl(LaunchUrlType::BROWSER_URL, "https://www.ppsspp.org/docs/reference/umd-video/"); });