You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
feat(favourites): APA-HDD VCD favourites -- launch PS1 games off the internal HDD from Favourites
Completes VCD-favourite coverage: the APA-formatted internal HDD (HDD_MODE) now
implements itemLaunchVcd, so its PS1/.VCD games can be favourited and launched
from the Favourites tab like every other device. (Previously deferred -- R3 was a
no-op there.)
The challenge is that the HDD VCD list (hddVcdGames + the index-parallel
hddVcdParts, which records each game's owning __.POPS partition) is only built
while the HDD page is in its VCD view, so from the Favourites tab the owning
partition for a given name may be unknown. hddLaunchVcd resolves it by name:
- hddDoLaunchVcd() is the existing in-view POPSTARTER handoff, extracted verbatim
(selector + hdd0:<part>: target built on stack BEFORE deinit frees the list);
the in-view branch now calls it too -- one code path, behaviour-identical.
- hddLaunchVcd() finds the name in hddVcdGames; the WARM path (visited the HDD VCD
view this session -> the list persists across the L3 switch) needs no rescan. The
COLD path (re)scans via hddBuildVcdGameList -- the SAME single-pfs0:-slot partition
walk the VCD view uses (mounts each __.POPS on pfs0:, scans, restores pfs0:); it
never opens a 2nd pfs slot, so the documented pfs1: single-slot wedge can't fire.
FREEZE GUARD (adversarial review caught this): the cold rescan runs on the launch
(main) thread, where -- unlike the in-view rescan (IO thread, gated on no pending
art/IO) -- the cache worker can still hold an open fd reading a cover from pfs0:.
Umounting pfs0: under it is the HDD-freeze class. So hddLaunchVcd quiesces the art +
IO workers (cacheAbortMmceImageLoadsTimed + cacheCancelPendingImageLoadsTimed +
ioBlockOps) before the rescan, exactly as deinit() does, then restores. Verified
no use-after-free (name/part copied to stack before deinit) and graceful failure
when the HDD isn't mounted (scan returns 0 -> "POPSTARTER not found", no crash).
favResolve/favGetConfig/favGetImage already cover HDD generically via itemGetPrefix
(gHDDPrefix=pfs0:OPL/): HDD VCD favourites get the SAME pfs0:OPL/ART cover art as
the HDD VCD view + the PS1 #DiscType badge. The opl.c itemLaunchVcd==NULL guard
stays as a future-proof backstop. docs/VCD.md updated (caveat removed).
REMAINING: HW validation (HDD POPSTARTER launch + the cold-path rescan; no emulator
coverage for the HDD POPSTARTER path).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
0 commit comments