Commit Graph
226 Commits
Author SHA1 Message Date
LeandroLP23andClaude Opus 5.5 3c949c1dd4 fix(pad): scale the Bluetooth DualSense haptics stream by ANYPS5_RUMBLE
The controller sound card path already scales its samples by ANYPS5_RUMBLE, but
the Bluetooth haptics stream took the vibration port samples before that, so
ANYPS5_RUMBLE=0 still left a Bluetooth DualSense vibrating.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 21:47:03 +01:00
LeandroLP23andClaude Opus 5.5 986ae87c8a fix(pad): pace Bluetooth DualSense haptics reports and keep a failed stream silent
The worker sent a backlog of buffered blocks back to back. It now sends at
most one report 0x32 per 10.67 ms, the length of one 32-frame block at
3 kHz, without a catch-up burst after a pause.

A failed report write cleared the stream-open flag, which sent the vibration
ports to motor rumble. The flag now stays set until the controller
disconnects, so the ports stay silent while the stream is stopped.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 21:47:03 +01:00
e0b0f2b91d fix(pad): send a DualSense haptics report once two blocks are buffered
The 10.672 ms timer took a block only when it fired, so audio arriving in
blocks smaller than 32 haptic frames (16 from a 256-frame legacy port)
regularly found fewer than 32 frames and the report was skipped; catching
up after falling behind sent two reports back to back and left a ~21 ms
hole. The controller, asked to queue only 16 frames, then ran dry, and
the haptics dropped out about once per second on hardware.

The stream thread now waits on a condition variable until two blocks are
buffered and sends one, so reports follow the audio clock, and report
0x32 asks the controller to queue 64 frames (21 ms) to absorb Bluetooth
jitter and the difference between the title's rate and the controller's
crystal. Closing the stream wakes the waiting thread before the join.

Co-authored-by: seradavid <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 21:46:45 +01:00
115c187398 feat(pad): stream vibration ports to a Bluetooth DualSense as haptics reports
Co-Authored-By: beecrepaldi-afk <[email protected]>
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-04 21:46:30 +01:00
Dean 08f19f9dbe Merge pull request #14313 from oneandonlydean/carry-7499
feat(libScePad): read per-title input profiles beside the shared input file
2026-11-05 08:20:08 +13:00
Dean 9ab6a281ea Merge pull request #11860 from rooklz/fix/input-mapper-settings-roundtrip
fix(tools): round-trip input mapping settings in the input mapper
2026-11-05 06:36:17 +13:00
Dean Galvin 7ceffb3974 Merge main 086c0686c8 into #7978 (04f9490487) 2026-11-04 08:19:39 +13:00
fma-rc 04f9490487 test(videoout): hold the deferred flip behind a GPU wait instead of an output callback the title releases 2026-11-03 12:59:28 +01:00
Savvanis SpyrosandClaude Opus 5.5 f070b16201 Merge main into perf/agc-stores-without-drains
Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-03 09:18:32 +02:00
rooklz 36b213d86b fix(tools): accept a signed zero stick deadzone like the native parser 2026-11-03 06:44:55 +00:00
Dean d67a40f692 Merge pull request #14438 from xXPBSXx/fix/q-padidentify-quit-order
fix(tests): destroy the pad input before the pad identify test quits SDL
2026-11-03 11:36:22 +13:00
Dean f6b6491c08 Merge pull request #13041 from wrocketdev/fix/videoout-delete-event-handle
fix(libSceVideoOut): return INVALID_HANDLE when deleting events on ports that are not open
2026-11-03 06:26:20 +13:00
Dean aec75fb2bf Merge pull request #11987 from dantdmdarealguy/test/videoout-timing-log-ordered-cpu-flips
test(videoout): expect ordered CPU flips in timing log builds
2026-11-03 01:28:48 +13:00
Dean 504d1217be Merge pull request #11220 from p3n1cillin/claude/videoout-register-slot-occupied
fix(libSceVideoOut): return SLOT_OCCUPIED for a registration over registered buffers as the console does
2026-11-02 23:27:18 +13:00
xXPBSXxandClaude Sonnet 5.5 185adf1624 fix(tests): destroy the pad input before the pad identify test quits SDL
Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
2026-11-01 12:54:03 +01:00
Dean Galvin 4b4e398ca0 Merge main into fix/mouse-button-mapping
# Conflicts:
#	core/libs/prx/libSceVideoOut/tests/MouseInput.cpp
2026-11-01 21:04:04 +13:00
Dean Galvin 6e6d28c588 docs(input): use a fictional title ID in profile examples 2026-11-01 20:59:05 +13:00
Dean Galvin 4d0d546853 Merge main into pr/input-profiles
# Conflicts:
#	core/libs/prx/libSceVideoOut/src/PadInput.cpp
#	docs/user/INPUT_MAPPING.md
2026-11-01 20:58:59 +13:00
Savvanis SpyrosandClaude Opus 5.5 87e6918b69 Merge main into perf/agc-stores-without-drains
Recorder keeps both this branch's LookupStoredBytes and main's UnlandedOwnLabel, with both test groups in --completion-labels-only and the full recorder run.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 09:16:31 +02:00
MarcZX10 858d2c886e test(videoout): pin that ANYPS5_FPS_LIMIT holds the window's flips
Six flips under ANYPS5_FPS_LIMIT=20 may not complete in under five periods
of 50 ms. The check is a lower bound only, so a loaded host cannot fail it;
without the hook the six flips complete in about 100 ms at the output's
rate.
2026-11-01 01:49:57 +00:00
Savvanis SpyrosandClaude Opus 5.5 bebaf6e59d Merge main into perf/agc-stores-without-drains
main moved the AGC test registrations into tests/cmake; tools/agc_test_split.py resolve moved this branch's lines to their fragments.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-01 02:33:42 +02:00
MarcZX10 a1c1c41ad8 fix(libSceVideoOut): set ANYPS5_PAD_IDENTIFY with _putenv_s on Windows
setenv is not part of the MinGW Windows CRT. The test sets the variable
for the process, which PadIdentify.hpp reads with std::getenv. SDL_setenv
calls SetEnvironmentVariableA on Windows, which does not update the CRT
table that std::getenv reads, so _putenv_s is used there. Linux keeps
setenv.
2026-11-01 00:04:38 +01:00
MarcZX10 a626b6f836 test(libSceVideoOut): cover the identify pulse on a virtual controller
Four process-level checks on an SDL virtual controller whose rumble
callback records the motor edges: connect sends exactly one pulse for
player 1 after the quiet window; off sends nothing; a title rumbling
at 200 gets no identify pulse while it rumbles and one pulse after it
stops; an invalid ANYPS5_PAD_IDENTIFY stops the start with an error
naming the variable and the value. The test skips with code 77 when the
host has joysticks, as pad_sdl does.
2026-11-01 00:04:30 +01:00
MarcZX10 3a03e58b31 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state
# Conflicts:
#	core/libs/prx/libScePad/src/PadState.cpp
2026-10-31 06:53:37 +00:00
Adrià 50a261e7e4 Merge pull request #13478 from JJenkx/fix/pad-injected-capture-hold
fix(pad): hold injected buttons that answered a dialog until released
2026-10-31 04:09:53 +01:00
JJenkxandClaude Opus 5.5 2e2f6b5eef fix(pad): expire a held injected button when its scripted press ends
A scripted button that answered a dialog stayed masked from the title
until a title read sampled it released. When the title did not read
during the release, a later scripted press of the same button was
masked as well. The mask now keeps only the buttons the command
timeline held without a break since the last read, so a press that
ends, or a new command, clears it whether or not it was sampled.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 20:57:09 -04:00
MarcZX10 672ead67ec test(libSceVideoOut): keep keyboard input out of port 0 while it is withdrawn 2026-10-30 23:48:23 +00:00
MarcZX10 68a4689e62 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state 2026-10-30 23:46:32 +00:00
Adrià 93f5331fd7 Merge pull request #13463 from notHaze/feat/configurable-mouse-stick
feat(input): add configurable mouse stick target
2026-10-30 22:50:29 +01:00
MarcZX10 bc37a818a0 Merge remote-tracking branch 'upstream/main' into fix/pad-port0-connected-state
# Conflicts:
#	core/libs/prx/libSceVideoOut/include/PadInput.hpp
2026-10-30 18:52:51 +00:00
MarcZX10 156ca91120 test(libSceVideoOut): check the hold halfway through as well as at its edge
The removal and reconnect checks sampled only at the hold's edge, so a hold
of zero still passed them. A sample halfway through the hold must now stay
pending, which a zero hold does not do.
2026-10-30 18:51:20 +00:00
JJenkxandClaude Opus 5.5 c2a766ec22 fix(pad): hold injected buttons that answered a dialog until released
A scripted press that answers a modal dialog or the IME was merged into
the host state for the capture, but video out's heldThroughCapture only
sees host buttons, so once the capture ended Pad::ReadState OR-ed the
still-active injected press into the title's read. A 400 ms Cross that
answered the dialog then also reached the title for the rest of the
press.

Record port 0's injected buttons while the pad is captured and mask them
from the title until they are released, as host buttons already are.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-30 12:11:50 -04:00
Adrià cca2d08bd2 test(libSceVideoOut): count the three host volume default bindings 2026-10-30 16:29:56 +01:00
Adrià df480a5049 fix(libSceVideoOut): close the pad status request test before the volume tests 2026-10-30 16:29:56 +01:00
Adrià b18234a5fd fix(libSceVideoOut): close the pad status conflicts test before the volume tests 2026-10-30 16:29:56 +01:00
MarcZX10 a9124c157f test(libSceVideoOut): print the line of the pad_sdl check that fails
Require aborted without saying which check failed, so a failure on a CI host that cannot be reproduced locally left no trace of the assertion in the log. It now prints the source line before aborting.
2026-10-30 16:29:55 +01:00
MarcZX10 cb77b10b3d test(libSceVideoOut): cover the focus rule for the host volume
Nothing happens by default, focus lost silences and focus gained restores exactly unity with the option on, other window events, other windows and key events are ignored, and the user's own mute survives a focus round trip.
2026-10-30 16:29:55 +01:00
MarcZX10 addfd6a8ee test(libSceVideoOut): cover turning requests into host volume commands
Register pad_host_volume. An empty request set changes nothing, volume up and down move one step and return to exactly unity, mute toggles, combined requests run up then down then mute, and the other host requests are ignored.
2026-10-30 16:29:55 +01:00
MarcZX10 93a613aed4 test(libSceVideoOut): cover that the host volume keys collide with nothing
No built-in key is bound twice, the three host volume keys are bound by default as plain keyboard keys, a key the user shares with another action keeps both bindings as it does for the existing actions, and action names are exact and case-insensitive.
2026-10-30 16:29:55 +01:00
MarcZX10 562654de68 test(libSceVideoOut): cover the default ToggleMute binding
F8 is the only built-in ToggleMute key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 67cc1b2888 test(libSceVideoOut): cover the default VolumeUp binding
F6 is the only built-in VolumeUp key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 54e10becde test(libSceVideoOut): cover the default VolumeDown binding
F5 is the only built-in VolumeDown key, a mapping line replaces it, the built-in table raises the request, and the key does not reach the pad state.
2026-10-30 16:29:55 +01:00
MarcZX10 8402d91c86 test(libSceVideoOut): cover the ToggleMute input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 f57856aee2 test(libSceVideoOut): cover the VolumeDown input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 30d0a1392c test(libSceVideoOut): cover the VolumeUp input mapping action
It takes a key and alternates case-insensitively, ignores a duplicate line, and refuses mouse buttons, the wheel, unknown keys, empty sources and sources without a type.
2026-10-30 16:29:55 +01:00
MarcZX10 50c1d2f4a3 test(libSceVideoOut): cover the ToggleMute request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
MarcZX10 3ccda9b131 test(libSceVideoOut): cover the VolumeDown request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
MarcZX10 114b16ab41 test(libSceVideoOut): cover the VolumeUp request from the keyboard
A bound key asks once per press, repeat and release ask for nothing, the other host requests stay false, and the pad state is unchanged.
2026-10-30 16:29:55 +01:00
Florent Combet 26d36e9645 feat(input): add configurable mouse stick target 2026-10-30 15:41:51 +01:00
MarcZX10 0d0db3570b test(libSceVideoOut): check port 0 follows the controller in both modes
Runs the default mode first (port 0 and user 0 stay connected after the only
controller is removed), then controller mode with virtual SDL controllers:
the removal is committed after the hold, user 0 logs out and back in, a
withdrawn port 0 reads zeroed, and a brief removal does not flap port 0.
2026-10-30 13:58:49 +00:00