From 69ef4ce9fb07c6e4c42dd25839c91cb8032dd8e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrik=20Rydg=C3=A5rd?= Date: Fri, 23 Oct 2026 11:36:50 +0200 Subject: [PATCH] UMD Video: Say which firmware is needed, instead of that it isn't supported Without firmware that can play UMD Video (2.71 or later), the info screen and the boot error said "PPSSPP doesn't support UMD Video", which is no longer true. They now say the firmware version needed, from UMD_VIDEO_MIN_FIRMWARE, the same constant the check uses. Co-Authored-By: Claude Opus 5.5 (1M context) --- Core/PSPLoaders.cpp | 3 ++- Core/System.cpp | 7 ++++--- Core/Util/PSARUnpack.cpp | 10 ++++++---- Core/Util/PSARUnpack.h | 2 ++ UI/GameScreen.cpp | 3 ++- 5 files changed, 16 insertions(+), 9 deletions(-) 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/"); });