Reject sizes past the end of the state before allocating (FPL, PGF,
achievements, SAS grain, savedata list, the memory fast path), fail
instead of desyncing on a SAS voice count mismatch, and free what old
states' paths and shrinking pointer containers dropped.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The SAS mix estimate was a guess capped at 1200us. Measured on a PSP
(pspautotests audio/timing/sastiming), a mix costs 110us plus 0.49us per grain
sample, plus per voice and sample 0.445us + 0.0675us per unit of pitch ratio
(VAG; PCM and noise slightly less), plus 0.64us per sample with a reverb type
set. Linear to 1% across 64-2048 samples and 0-32 voices: 32 VAG voices at 512
samples take 8.7ms, not 1.2.
The mix runs on the Media Engine, as do video and audio decoding, so they now
queue behind each other there (MEScheduleJob). A game that keeps SAS running
during a movie - Star Wars: Lethal Alliance - decodes more slowly for it, like
on hardware.
Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
The reverb presets came from nocash's PS1 table. Six of the nine are
identical on the PSP, but three are not.
Also correct our linear interpolation expression: we were close but
our formula can produce an off by 1 at times.
* Rename LogType to Log
* Explicitly use the Log:: enum when logging. Allows for autocomplete when editing.
* Mac/ARM64 buildfix
* Do the same with the hle result log macros
* Rename the log names to mixed case while at it.
* iOS buildfix
* Qt buildfix attempt, ARM32 buildfix
Fixes#11442. Or at least should, I haven't tested this, just followed the
discussion in the issue.
According to this issue, this is a game bug that happens on real hardware
too, due to a lousy job porting the game to the PSP, most likely, which has
different ADSR (note envelope) behavior.
Not sure why everything is negative one indexed, but this prevents reading
beyond the size of the buffer.
This shouldn't change sound output, but it may fix a crash if VAG is at
the edge of memory (unlikely, though.)
We still need to walk during the delay to "use it up." Need to test more
to see if we can just walk once directly into ATTACK - might depend on
pitch.
This also makes the first play ignore the resampleHist, which matches
samples to tests properly, and ignores linear interp for exact pitch.
These changes fix all the sascore tests that used to work.