## Link to GitHub Issue, if one exists
Regressed by #401
## Description of change
Two things from testing SDVX Live2D -
1. ColorFill is almost always too expensive and will lead to drops
1. Scale factor of 0.5 causes GPU to sync and causes drops
(ARGB/XRGB doesn't matter, linear filtering doesn't matter)
1 is fixed by removing ColorFill calls on every frame - instead only do
this once when the user changes the duplicate option (on the next frame)
2 is fixed by updating the UI (limit the slider) though people can
ctrl+click to override these slider limits.
The warning label will be kept with slightly reworded text.
## Testing
tested in sdvx eg final (sudden death) - on my RTX 4070, my FPS is rock
solid 120 fps even with image resize on now.
## Link to GitHub Issue, if one exists
#345
## Description of change
Turn existing warnings for DDR codec issues into deferred error
messages.
## Testing
Tested DDR World with faked codec issues.
## Link to GitHub Issue, if one exists
n/a
## Description of change
Turning on Image Resize feature completely tanks performance of Live2D
in some SDVX songs. Add a giant warning next to the UI.
On my system with RTX 4070, Sudden Death is normally a rock solid
120FPS, but drops to 30-40FPS when resizing is on.
* linear filter does not affect this at all
* window resize options also have no effect
It's really just rendering on a larger surface + calling `StretchRect`
that does this.
Additionally, hide the resolution swap option since it sees very low
usage & has potential gotchas likes this.
## Link to GitHub Issue, if one exists
n/a
## Description of change
Apply SOCD cleaner algorithm to deal with the case where both
counter-clockwise and clockwise buttons are pressed at the same time.
In SDVX, default algorithm is to prefer the most recently pressed
direction. This is better for dealing with slams in rapid succession,
for example, as you don't have to completely let go of one direction to
hit the other now.
In IIDX, default algorithm is neutral (same behavior as before). Using
last or first algorithm results in double scratches which means you'll
likely end up with an excessive poor after hitting a scratch, so neutral
is actually beneficial. Besides, if you are serious about playing on the
keyboard, you should be using `TT +/-` and `TT +/- Alternate`.
## Testing
Tested SDVX 3, EG (old cab), EG valk cab modes, IIDX 24, 27, 33
(tdj/ldj)
## Link to GitHub Issue, if one exists
see my previous attempt #496, which has been reverted by #500
## Description of change
Two issues:
1. the original implementation of bi2x_hook for iidx misunderstood what
`aioNMgrIob2_Create` does. In the original I/O code it returns a pointer
to a C++ class instance, which would also have a vptr (pointer to a
vtable) in the beginning. The original author of this code of the hook
in spice thought that `aioNMgrIob2_Create` returns a pointer to a
pointer. This may happen to work but it's not 100% accurate, so this has
been fixed by separating out the class and the vtable allocation.
Without this, the game could have accessed memory outside this buffer.
2. And then the SDVX implementation blindly copy-pasted the IIDX
`bi2x_hook`. Along with the issue above, they also forgot to check the
I/O DLLs to see how much memory needs to be allocated and change that.
Instead, they kept the same value as IIDX, which was too small. Fix that
as well.
## Testing
Doing some extensive testing with IIDX (27-33) and SDVX versions (EG).
## Link to GitHub Issue, if one exists
n/a
## Description of change
Both games take the address returned by `aioNMgrIob2_Create` and reads
values offset from that address as part of the I/O routine. This means
that the I/O routines of these games have been accessing random
variables in data/bss segments for years, they just happened to get a
value that doesn't lead to a crash.
Stumbled upon this while trying to add a new feature that required
adding more globals, but suddenly the game stopped polling I/O when I
changed a value of my global. Scary.
## Testing
Tested both games I/O
## Link to GitHub Issue, if one exists
#477
## Description of change
Add a new option for scaling the overlay.
Gitadora Arena will receive 250% by default.
Various overlay windows have been updated to scale properly, not perfect
but they are at least usable.
## Link to GitHub Issue, if one exists
#477
## Description of change
F11 menu (window settings) did not work for arena model because the game
engine races to create many windows, so our logic of grabbing the first
window created doesn't always get the main window.
## Testing
## Link to GitHub Issue, if one exists
#477
## Description of change
Add lights for J region cab. I can't figure out how the extra lights on
U region cab are wired up.
## Testing
Tested guitar and drums, J and U regions.
## Link to GitHub Issue, if one exists
n/a
## Description of change
Get rid of log messages when adapter modes are removed, since these have
never been all that useful.
## Link to GitHub Issue, if one exists
n/a
## Description of change
Make the text color cyan to make the messages stand out.
## Testing
Verified in terminal.
## Link to GitHub Issue, if one exists
n/a
## Description of change
SDVX EG final started to pick an ASIO driver at random and tries to open
it, which causes crashes / hangs if the driver is not compatible
(ASIO4ALL in particular)
Only allow the game to access `HKLM\SOFTWARE\ASIO` if the user has a
Xonar AE, or if ASIO was configured using -sdvxasio.
## Testing
Tested year 1 data and EG final.
## Link to GitHub Issue, if one exists
#477
## Description of change
Plumb through headphone jack detection. Touch screen menu for headphone
volume lights up.
## Testing
Tested guitar.
## Link to GitHub Issue, if one exists
N/A
## Description of change
in current implementation j32d analog values are not encoded properly,
values are supposed to go up to 1023, but they show up as 771 in game
## Testing
tested with M32-007-2025092400, used DM PAD CALIBRATION menu
## Link to GitHub Issue, if one exists
N/A
## Description of change
prevents the game from creating folders on F: drive
## Testing
tested with M32-007-2025092400
## Link to GitHub Issue, if one exists
#477
## Description of change
Fix Japanese text broken in the game UI when system ACP is not
SHIFT-JIS.
## Testing
Checked song select and in-game title display.
## Link to GitHub Issue, if one exists
#477
## Description of change
Add analog and digital wail for the arena model guitar.
Fix the picking code to be the same algorithm as extdev - detect rising
edges and insert 1 frame of input.
## Testing
Tested x/y/z and digital y up/down. Only Y gets used in game though.
## Link to GitHub Issue, if one exists
Fixes#479
## Description of change
When p3io / p4io is in use with Gold Cab spec, use the old init code.
## Testing
Verified p3io / p4io / bio2 booting with 2024040200.
## Link to GitHub Issue, if one exists
#477
## Description of change
Arena cab has two sound cards and it uses `WrappedIMMDeviceCollection`
to set the volume to 100% on boot on both, instead of the typical
`GetDefaultAudioEndpoint`.
## Testing
Testing Delta, testing other games as well as they are affected.
## Link to GitHub Issue, if one exists
None
## Description of change
- Added bi2x_hook
- Added J32D (drum) and J33I (guitar) emulations
- AMI2000 card reader (this game uses this instead of ICCA)
## Testing
Played through a 15-minute session on Drummania.
Guitar mode works with keyboard input.
## Link to GitHub Issue, if one exists
None
## Description of change
Increase the heap size for GITADORA games.
Later releases of GITADORA attempt to allocate a block of memory (size
of 0x7ECF78) for notes_info.xml but fail due to heap size being too
small, leading to HDD ERROR 5-1502-0008.
## Testing
Tested with current and previous GITADORA releases.
## Link to GitHub Issue, if one exists
https://codeberg.org/nixac/spicetools/issues/4
## Description of change
Inspired by the Linux issue above in the fork, cache lstat calls for
thumbnail. IIDX 32 and 33 make a call for this every frame which can
cause significant overhead on Linux.
This is being enabled for all versions and not just the Linux variant of
the executables since it provides some marginal performance gain on
Windows.
## Testing
Tested IIDX 32/33, with the option on/off, and with AVS verbose logging
on/off.
Tested with ifs_layeredfs hook as well just to verify functionality.
## Link to GitHub Issue, if one exists
#345
## Description of change
If TDJ / VM mode is active AND user is enabled `-monitor` option (and
the value isn't 0, the primary monitor)
then disable the subscreen overlay, show an error message instead.
We're doing this because both games cannot accept emulated touch input
if `-monitor` option is in use. There is not much point in displaying
the second screen's image, other than to REALLY confuse people when
nothing happens when they click on it.
## Testing
Tested both games with `-monitor`.
## Link to GitHub Issue, if one exists
#345
## Description of change
For IIDX31+, detect if BI2A or BI2X I/O emulation becomes active, and
see if there is a mismatch between the -iidxtdj setting.
Right now a mismatch results in warning in log + deferred error log, but
in the future we could turn this into a fatal error and crash the game
to make it more obvious.
## Testing
Tested 4 combinations:
1. DLL in LDJ mode + -iidxtdj off (pass)
2. DLL in LDJ mode + -iidxtdj on (error)
3. DLL in TDJ mode + -iidxtdj off (error)
4. DLL in TDJ mode + -iidxtdj on (pass)
## Link to GitHub Issue, if one exists
#345
## Description of change
In the main menu (Esc key), instead of just saying `Show subscreen`,
detect game and say `Show TDJ Subscreen` `Show LDJ LED Ticker` etc.
For the LED ticker window, show the title bar by default, and add an
option to hide it back.
This is to help with cases where people get stuck with being in LDJ mode
when they meant to turn on TDJ.
## Testing
Tested all configurations (IIDX LDJ/TDJ, SDVX UFC, DRS)
## Link to GitHub Issue, if one exists
#452
## Description of change
Added `Sleep(4)` call to regulate how fast the `device_io` function will
call `getState` for each button. The panel buttons were commented out
because those are handled by the MDXF Control Status Buffer functions
anyways, so the work was redundant. It's also why the timing precision
from this function doesn't matter, so it can afford a longer sleep
## Testing
- Verified IO still functions properly
- Verified decrease in overall CPU usage
## Link to GitHub Issue, if one exists
#452
## Description of change
* Split the MDXF I/O option into three: auto, thread, and backfill.
`auto` is the same as what `thread` used to be before this change (based
on I/O poll rate), but `thread` now always forces thread poll mode.
`auto` is the default (behavior wise, same as before)
* For the poll rate measurement, start polling after 20s mark to avoid
frame drops during game boot
* Minor code clean up
## Testing
manual test in windowed + full screen
## Description of change
Extension of #460
An option was exposed to `spicecfg` (`P4IOBufferMode`) for toggling
between the Thread and Backfill buffer fill implementations from the
prior PR.
## Testing
- Verified the option properly toggled between the two implementations
## Link to GitHub Issue, if one exists
n/a
## Description of change
When touch monitors send touch area size information
(`TOUCHEVENTFMASK_CONTACTAREA` flag and `cxContact` / `cyContact` fields
of `TOUCHINPUT` struct) from `GetTouchInputInfo`, IIDX gets confused and
does some unexpected things when interacting with the subscreen.
As a workaround, hook `GetTouchInputInfo` and clear out the flag &
values.
This is only done for IIDX AND when -iidxnativetouch is on.
## Testing
Tested on a Dell touch monitor, simulating "bad" values.
## Link to GitHub Issue, if one exists
#452
## Description of change
(Another extension of #450)
Merged the old threading implementation into the current backfill
implementation because it was showing signs of having slightly better
timing performance. The following description is taken from the
strikethrough text from the referenced PR above:
>When the module is booted, it counts how many times
ac_io_mdxf_update_control_status_buffer was called in the first three
seconds, then calculates the approximate refresh rate of the current
game instance. If the refresh rate is under THRESHOLD_REFRESH_RATE
(120Hz), a low-priority thread dedicated to inserting polls into the
ring buffers is started and run at THREAD_REFRESH_RATE_HZ (125Hz).
Combined with the polls inserted by the main arkmdxp4 thread and
rawinput real-time events, the 125Hz update cadence is enough to bring
the span of poll history represented by the ring buffers closer to
parity with what arkmdxp4 expects.
The default mode is `THREAD_MODE` but can be switched to `BACKFILL_MODE`
(which could possibly be made as a `spicecfg` option).
There was also a fixed bug in the `ac_io_mdxf_get_control_status_buffer`
function, which should not have been writing to the `head` pointer. This
was allowing for an edge case situation where the `head` pointer was
advanced in another thread then rewound back to the previous `head` in
this thread. The real implementation only reads the pointer and returns
it.
## Testing
- Logged the ring buffer states after many iterations and verified
regular structure
- Same playtesting as the prior PRs
## Link to GitHub Issue, if one exists
Related to #458
## Description of change
Truncate text if button's identifier string might overflow the popup
dialog width
## Testing
## Link to GitHub Issue, if one exists
n/a
## Description of change
This would save a handful of instructions at best but it was bothering
me
## Testing
Tested with two controllers + naive with ddr