UI: Play UMD Video discs in the XMB, straight from the game list

With firmware 2.71 or later installed, picking a UMD Video disc boots the XMB with the disc in the
drive and UMD auto-start forced on for that boot, so the disc's menu comes up. Without one, the
info screen saying UMD Video isn't supported shows as before. The info screen's Play does the same.

A disc with both a game and video asks which to start. For the video, the XMB comes up with
auto-start forced off, since auto-start runs the game.

Older firmware can't play these: 1.50, 2.00 and 2.60 crash in video_plugin or paf with a video disc
in the drive, and 2.50 refuses it. 2.71 through 6.61 reach Bourne Supremacy's menu.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Henrik RydgårdandClaude Opus 5.5 committed 2026-10-23 10:46:59 +02:00
1 parent bf1f88d6e6
commit d331bd6c8c
10 files changed
+105 -16

No files matched your search

+10 -4
View File
@@ -367,7 +367,7 @@ void GameScreen::CreateContentViews(UI::ViewGroup *parent) {
LinearLayout *infoLayout = new LinearLayout(ORIENT_VERTICAL, new AnchorLayoutParams(10, 200, NONE, NONE));
leftColumn->Add(infoLayout);
if (info_->fileType == IdentifiedFileType::PSP_UMD_VIDEO_ISO) {
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 Choice(di->T("More info"), ImageID("I_LINK_OUT_QUESTION"), new LinearLayoutParams(WRAP_CONTENT, WRAP_CONTENT)))->OnClick.Add([](UI::EventParams &e) {
@@ -553,10 +553,16 @@ void GameScreen::CreateSettingsViews(UI::ViewGroup *rightColumn) {
rightColumnItems->SetSpacing(0.0f);
rightColumn->Add(rightColumnItems);
if (!inGame_ && FileTypeIsPlayable(info_->fileType)) {
// UMD Video plays in the XMB, with the disc in the drive.
const Path vshPath = info_->fileType == IdentifiedFileType::PSP_UMD_VIDEO_ISO ? GetUmdVideoVSHPath() : Path();
if (!inGame_ && (FileTypeIsPlayable(info_->fileType) || !vshPath.empty())) {
Choice *play = rightColumnItems->Add(new Choice(ga->T("Play"), ImageID("I_PLAY")));
play->OnClick.Add([this](UI::EventParams &e) {
screenManager()->switchScreen(new EmuScreen(gamePath_));
play->OnClick.Add([this, vshPath](UI::EventParams &e) {
if (vshPath.empty()) {
screenManager()->switchScreen(new EmuScreen(gamePath_));
} else {
screenManager()->switchScreen(new EmuScreen(vshPath, gamePath_, true));
}
});
// The file is being read, and maybe about to be replaced.
play->SetEnabled(!GamePacker::IsPacking(gamePath_));