Commit Graph
49716 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5.5 5cdf4df765 Android: Don't enable MMAP beyond the device's own policy
setMMapEnabled(true) doesn't mean "allow it", it sets the process's MMAP
policy to AUTO, overriding a device whose aaudio.mmap_policy disables
MMAP. Since #22766 we did that on every audio start, and a Xiaomi Pad 5
Pro (Android 13) has been stuck on a blank screen at launch since then.
The likely cause, not yet confirmed on the device: opening a stream on a
MMAP path the vendor turned off, from the UI thread.

Now the checkbox can only turn MMAP off, as on the Bluetooth TV.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 13:49:04 +01:00
Henrik Rydgård 68c85fd694 Merge pull request #22768 from hrydgard/xmb-video-formats
XMB video: play MP4 and Motion JPEG from the memory stick
2026-10-25 12:03:10 +01:00
Henrik RydgårdandClaude Opus 5.5 b1401dcbf6 Docs: One HLE entry per function, other firmwares' NIDs go in hleKernelNids
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:38:51 +01:00
Henrik RydgårdandClaude Opus 5.5 2c0b9dbc4c Skip the logo when launched with a debugger port
A debugger client drives the app from a script, and the logo screen only
gets in its way.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:38:51 +01:00
Henrik RydgårdandClaude Opus 5.5 c88850a11a VSH: Alias sceMeBootStart's NIDs for firmware 2.80 to 6.39
The video player only gets the AAC flags it needs when the XMB has booted
the ME in mode 3, and an XMB older than 6.60 asks for that under another
NID, which stayed unresolved: on 6.00, SAMPLE.MP4 said "This video cannot
be played". The NIDs come from matching the function in each version's
me_wrapper.prx. hleKernelNids grows three columns for the generations
before 3.95.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:38:51 +01:00
Henrik RydgårdandClaude Opus 5.5 ee093844bf Docs: On Windows, the PSP toolchain and PSPLink tools run in WSL
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:29:16 +01:00
Henrik RydgårdandClaude Opus 5.5 9daf26c01f sceMpegbase: sceMpegBaseCscVme converts two fields, like CscAvc
- Fixes #22764

pspautotests video/mpeg/cscvme shows the two luma buffers are fields, each
with its own chroma, and that the rows land as they do for
sceMpegBaseCscAvc: woven together without a second buffer, packed one per
buffer with one. The XMB's Motion JPEG player passes the second buffer
right after the first with the picture's halves as the fields, which is
why the halves model happened to work for it.

The hardware's colours match the scalar conversion exactly, so CscVme uses
that rather than swscale. Fields packed back to back now reach the GPU as
one write, so a texture over the whole picture isn't cut at the first.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:29:16 +01:00
Henrik RydgårdandClaude Opus 5.5 ae7f312d34 sceMpegbase: Add the Vme copy and colour conversion, fix YCrCbCopy's size
The XMB's video player renders Motion JPEG AVIs with sceMpegBaseYCrCbCopyVme
and sceMpegBaseCscVme (JPCSP's names), which take planar YCbCr in two halves
rather than the ME's tiled layout. The copy sizes follow mpegbase_260.prx.

sceMpegBaseYCrCbCopy took the frame size from the destination descriptor,
which the same player leaves unset. mpegbase_260.prx reads it from the
source, in pixels.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:29:16 +01:00
Henrik RydgårdandClaude Opus 5.5 fcff5a981c VSH: Play MP4 video from the memory stick
- Fixes #22763

The XMB's video player boots the ME in mode 3 through sceMeCore_driver's
sceMeBootStart (5dff5c50), where games get mode 2. Mode 3 only changes the
argument to ME command 0x185 (me_wrapper.prx), and the player sets the AAC
context flag at 0x2d on anything newer than a PSP-1000 and plays those
files, so sceAudiocodecInit now accepts the 0x2c/0x2d flags in mode 3.
Games still get the failure pspautotests audio/audiocodec/context records.

Also implements the two vaudio calls the player uses: a ChReserveBuffering
that routes each buffer through an ME effect (E8E78DC8), and the setter for
its parameter (504E4745). The effect isn't known, so audio goes out as is.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 11:29:16 +01:00
Henrik Rydgård b7349813ea Merge pull request #22767 from hrydgard/more-ui-fixes
More UI fixes - round off a lot more corners, fix layouts
2026-10-25 11:03:54 +01:00
Henrik Rydgård b970cfece6 Skip the logo when launching the vsh, also add --skip-logo cmdline param 2026-10-25 10:42:12 +01:00
Henrik Rydgård 965b07c527 A lot more round corner fixes and layout fixes. 2026-10-25 10:28:40 +01:00
Henrik Rydgård daadd1a15c Change default background animation to wave. 2026-10-25 10:12:32 +01:00
Henrik RydgårdandClaude Opus 5.5 5567f51eb8 UI: Don't apply the large-screen inset on phones and tablets
They're held close and have their own system insets.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 09:41:38 +01:00
Henrik RydgårdandClaude Opus 5.5 8e353761c7 UI: Let scroll views extend under the bottom inset when they don't quite reach the edge
A vertical ScrollView that extends into the bottom inset (like a navigation bar) adds
that much space after its contents, so the end can be scrolled out from under it.
It only did that when the view reached the very bottom of the screen, and then added
the whole inset. Since 58fa522d48 inset the content area of dialog screens on
screens over 600 dp, a phone like the S21 Ultra (617 dp wide) got a 1.7 dp inset,
which turned the extra space off. Add exactly the part of the view that lies in the
inset instead, and skip the bottom shadow in that case.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 09:41:38 +01:00
Henrik Rydgård 4e7f1d15c0 Merge pull request #22766 from hrydgard/android-tv-opensl
Android: Use OpenSL ES for audio on TVs, add audio API and MMAP settings
2026-10-25 09:24:24 +01:00
Henrik RydgårdandClaude Opus 5.5 4aaebf45cf langtool: add-new-key uses the English string as the placeholder
It wrote Key = Key, which for a key like PacketRelayHint that isn't its own
English text puts the key name itself in the UI of every untranslated
language. Now it takes the value from en_US.ini, falling back to the key.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 08:57:51 +01:00
Henrik RydgårdandClaude Opus 5.5 c3fb7ae2c1 Translations: Audio API and low-latency (MMAP) settings, with hints
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-25 08:55:44 +01:00
Henrik RydgårdandClaude Opus 5.5 a5c90b61df Android: Use OpenSL ES for audio on TVs, add audio API and MMAP settings
An Android 11 TV played nothing over a Bluetooth headset since the switch
to Oboe, while its speakers worked. Testing on it showed AAudio with MMAP
is silent there and AAudio without MMAP works, as does OpenSL ES (also
when the headset is connected mid-game), whatever the stream usage. MMAP
should never be used for a Bluetooth route, so it's a firmware bug.

Audio settings get an Audio API choice and a Low-latency audio (MMAP)
checkbox, with hints, so other devices with the same kind of bug can be
worked around. The API defaults to OpenSL ES on TVs and before Android
8.1, where the choice isn't offered, and AAudio elsewhere. Changing them
reopens the streams right away. System Information shows the output
stream that got opened (API, MMAP or not, rate, buffers, device) and any
audio error.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 23:58:42 +02:00
Henrik Rydgård b438655479 Merge pull request #22760 from hrydgard/ui-max-width
Better layouts for large screens
2026-10-24 22:15:46 +02:00
Henrik RydgårdandClaude Opus 5.5 58fa522d48 UI: Limit the width of dialog screens, and keep content off the edges of large screens
Dialog screens (tabbed, two-pane, simple and the others built on
UIBaseDialogScreen) center their content at up to 1400 wide, instead of
stretching settings rows and buttons across very wide windows.

On large screens, those screens and the main screen also get an inset on all
sides, since controls right at the edge are hard to see there. It grows with
the screen's smaller dimension, from nothing at 600 to the full inset at
1000, and is always full on TVs. The game, popups, and the screens that
position things to match the game's screen (display layout, touch control
layout and tests, custom button and visual mapping) are left as they were.

The root's bounds are computed by UIScreen::GetContentBounds, since
UI::Margins can't hold widths this large.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 16:12:01 +02:00
Henrik Rydgård 53a7127618 Merge pull request #22742 from hrydgard/touch-home-button
Touch controls: Make HOME button more prominent. Also quick fix for ImDebugger
2026-10-24 14:40:26 +02:00
Henrik Rydgård 61a6b37a9a Merge pull request #22759 from hrydgard/rework-ui-margins
UI: Simplify spacing across the app using padding instead of margins where possible.
2026-10-24 14:39:41 +02:00
Henrik RydgårdandClaude Opus 5.5 70988aa50c ImGui: Keep the context and debugger state when Android switches away
NativeShutdownGraphics, which Android runs whenever the app loses its
surface, destroyed the imgui context and the ImDebugger along with the
device objects, so window layout and debugger state reset on return.
Now only the device objects go there (the backend already recreates
them), and the context and debugger are torn down in NativeShutdown.
Both configs are still saved on device loss, in case the app is killed
in the background.

imgui.ini is now read and written through our File API rather than
imgui's fopen, which can't reach a memstick behind a content URI.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 14:14:42 +02:00
Henrik Rydgård c37498808c Home key improved look 2026-10-24 14:14:41 +02:00
Henrik RydgårdandClaude Opus 5.5 0da3129a69 Touch controls: Add a HOME button, and list HOME with the standard PSP controls
POPS (the PS1 emulator) uses HOME for its menu. The touch button is hidden by
default, and HOME still has no default key mapping. It's also appended to the
custom button and gesture key lists.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 14:14:17 +02:00
Henrik Rydgård 695fc865ab Fix some look problems on TabbedDialogScreen 2026-10-24 14:12:53 +02:00
Henrik RydgårdandClaude Opus 5.5 b54056685e UI: Space ChoiceGroups from their container instead of their own margins
ChoiceGroups no longer have hardcoded margins. A new ChoiceGroupList holds them,
with padding and spacing that give the same look as before. Settings tabs, developer
tools, the two-pane settings columns, the pause menu and the rest put their groups in
one, and a few screens adjust its padding and spacing to their layout.

Also add the two groups in the remote disc streaming settings that were created but
never added, and make the settings search look inside groups: it only checked a tab's
direct children, so with ChoiceGroups a filter hid everything.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 14:01:58 +02:00
Henrik Rydgård 13ffe2873f Merge pull request #22757 from hrydgard/more-ui-work
UI: Manual additions and some Claude code review
2026-10-24 13:46:50 +02:00
Henrik Rydgård c844c0c049 Merge pull request #22754 from hrydgard/syphon-filter-handoff
Syphon Filter: Make cutscene timing frame rate independent (Dark Mirror, Logan's Shadow)
2026-10-24 13:46:28 +02:00
Henrik Rydgård 5a20ef6616 Merge pull request #22753 from hrydgard/pathbrowser-network-folder
PathBrowser: Add a Network folder on Windows
2026-10-24 13:16:21 +02:00
Henrik Rydgård ff4ba2094a More ChoiceGroups 2026-10-24 13:04:13 +02:00
Henrik Rydgård 505ae1c965 Cleanup 2026-10-24 12:54:49 +02:00
Henrik RydgårdandClaude Opus 5.5 8b1ffb9b39 UI: Apply GridLayout children's margins, drop the unused grid orientation
Grid children are given LinearLayoutParams almost everywhere, so their margins are
taken from those as well as from GridLayoutParams, which gains margins.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:49:45 +02:00
Henrik RydgårdandClaude Opus 5.5 7ddd0ce33b UI: Skip hidden views in AnchorLayout
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:49:44 +02:00
Henrik RydgårdandClaude Opus 5.5 5c4b1be7f5 UI: Let LinearLayout place its children as a group along its direction
SetContentGravity centers the children, or moves them to the end, when they don't
fill the layout.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:49:44 +02:00
Henrik RydgårdandClaude Opus 5.5 bff97cbb09 UI: Fix two LinearLayout measuring and layout bugs
Lay out children across the layout direction within the layout's bounds rather than
its measured size, which differ when a parent clamps it. And count weighted
children's margins when growing to fit them.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:49:32 +02:00
Henrik RydgårdandClaude Opus 5.5 e5b1760bff UI: Add padding to GridLayout
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:36:17 +02:00
Henrik RydgårdandClaude Opus 5.5 d9126ad685 UI: Remove the unused FrameLayout
Nothing used it, and it didn't work: it never set its own size, centered vertically
using the width, and didn't lay out its children.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:36:16 +02:00
Henrik RydgårdandClaude Opus 5.5 7fa69ac27f UI: Center views inside their margins
Centering gravity centered in the whole cell, ignoring the margins, so a view with
uneven margins ended up off center.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:36:07 +02:00
Henrik RydgårdandClaude Opus 5.5 81d078efc4 UI: Fix ScrollView's handling of its child's margins
The child was measured inside its margins, then had them subtracted from its bounds
again, and the leading margin along the scroll direction was never applied, so the
end of the content couldn't be scrolled to. Also include the margins when wrapping
the content, and page horizontally by the width rather than the x position.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:35:56 +02:00
Henrik RydgårdandClaude Opus 5.5 cfb0b1131b UI: Clamp fixed-size views to an AT_MOST spec
MeasureBySpec compared the spec against the view's previous measurement instead of
its fixed size, so a fixed-size view larger than the space offered wasn't clamped
unless an earlier measure happened to be larger.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:35:55 +02:00
Henrik RydgårdandClaude Opus 5.5 e30c8f7141 UI: Give LinearLayout a working padding setting
LinearLayout had a public padding member that only DisplayLayoutScreen set. Make it
private with a setter, and fix the measuring: the vertical retry used the horizontal
padding, the AT_MOST retries and the weighted children ignored it, and growing to fit
weighted children counted it twice.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 12:24:21 +02:00
Henrik RydgårdandClaude Opus 5.5 46bf080bd9 Syphon Filter: Forget the hooks' per-object state when the game shuts down
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 11:34:09 +02:00
Henrik Rydgård ad132d8f1b Apply rounded corners to all Choices by default, apply proper group rounding in many places. 2026-10-24 11:21:40 +02:00
Henrik Rydgård 038e4b67ca Merge pull request #22755 from hrydgard/another-adhoc-server
Another adhoc server ("SWAENET"), some logging reduction
2026-10-24 10:44:20 +02:00
Henrik Rydgård 3dc01bd318 Turn off roundrect test on LogoScreen, reduce logging 2026-10-24 10:35:11 +02:00
Henrik Rydgård e16cc84d9f Add SWAENET adhoc relay server 2026-10-24 10:33:34 +02:00
Henrik RydgårdandClaude Opus 5.5 a5550cb853 Syphon Filter: Logan's Shadow: Hold the black screen before a cutscene for PSP time
Part of #22669.

An in-mission cutscene starts on a black screen held for a number of updates
set by the cutscene, while its setup moves the actors at a speed given in
time. In Episode 1 Part 4 the hold is 12 updates: at 60fps the fade in starts
0.25s in, and Gabe is seen sliding across the room for 0.3s on his way to his
start position. Count the hold at 20fps, which starts the fade 0.6s in, right
after he arrives, as in the PSP footage.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 10:21:13 +02:00
Henrik RydgårdandClaude Opus 5.5 adfbd7a259 PathBrowser: Abandon a network listing when navigating away
PathBrowser lists on one thread, so going up from the network folder
waited for its listing to finish (up to 8 seconds) before the drive list
showed. Pass GetFilesInDir a cancel flag that PathBrowser sets whenever
the path changes, or on destruction, and check it while waiting.

Also don't probe the drives in the drive list for game folders.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-24 02:44:17 +02:00