audio: WASAPI exclusive resampling, buffer size increase options (#727)

## Link to GitHub Issue or related Pull Request, if one exists
n/a

## Description of change

Resampler:
Implement resampler for exclusive mode streams, as we are seeing more
and more devices - not just laptops but onboard audio devices - that
only support 48khz and not 44.1khz. Should work with volume boost (gain
calculated inside resample) and also downmixer (hands off intermediate
scratch buffers).

Buffer size increase:
By default many of these games request a tiny buffer when in shared mode
(TDJ uses 3ms). On some audio setup this results in crackling due to
underflow. Add an option to forcibly increase the buffer size.

## Testing
With resampler set to 48kHz and buffer set to 20ms I can reliably boot
and play IIDX on my display port monitor's speakers; previously this
wasn't possible. IIDX is event-driven.

Tested SDVX7 as well at 48kHz, which opens timer-driven streams.
This commit is contained in:
bicarus
2026-06-02 01:55:50 -07:00
committed by GitHub
parent b517ef3182
commit 48033816a8
17 changed files with 967 additions and 128 deletions
+31
View File
@@ -1984,6 +1984,37 @@ static const std::vector<OptionDefinition> OPTION_DEFINITIONS = {
{"30", "+30 dB"},
},
},
{
// AudioResample
.title = "WASAPI Exclusive Mode Resampling",
.name = "resample",
.desc = "Resamples the hooked audio output to a fixed sample rate before it reaches the "
"device. Useful when a game requests a sample rate the device cannot output in "
"exclusive mode (e.g. the game wants 44100 Hz but the device is locked to 48000 Hz).\n\n"
"Select the TARGET sample rate (one that your audio card supports).\n\n"
"Will result in couple milliseconds of latency and increased CPU usage when active.",
.type = OptionType::Enum,
.category = "Audio",
.elements = {
{"44100", "44.1 kHz"},
{"48000", "48 kHz"},
{"88200", "88.2 kHz"},
{"96000", "96 kHz"},
{"176400", "176.4 kHz"},
{"192000", "192 kHz"},
},
},
{
// AudioExclusiveBuffer
.title = "WASAPI Exclusive Buffer Size",
.name = "exclusivebuffer",
.desc = "Enlarges the WASAPI exclusive-mode device buffer to the specified duration in milliseconds.\n\n"
"Try setting this to 10 or even 20 if you hear crackling or glitches "
"(at the cost of slightly increased latency).",
.type = OptionType::Integer,
.setting_name = "16",
.category = "Audio",
},
{
// DelayBy5Seconds
.title = "Delay by 5 Seconds (DEPRECATED - use -sleepduration instead)",