From 76f401de957f237603ae912b7f0a8e31ab5996f0 Mon Sep 17 00:00:00 2001 From: bicarus-dev <202771338+bicarus-dev@users.noreply.github.com> Date: Fri, 5 Dec 2025 15:33:09 -0800 Subject: [PATCH] iidx: rework wasapi/asio detection for iidx33+ (#433) ## Link to GitHub Issue, if one exists Fixes #432 ## Description of change Newer versions of iidx33+ reintroduces `SOUND_OUTPUT_DEVICE` env var. iidx module must account for its return ## Testing --- src/spice2x/games/iidx/iidx.cpp | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/spice2x/games/iidx/iidx.cpp b/src/spice2x/games/iidx/iidx.cpp index 97018b7..4e668fb 100644 --- a/src/spice2x/games/iidx/iidx.cpp +++ b/src/spice2x/games/iidx/iidx.cpp @@ -813,7 +813,15 @@ namespace games::iidx { // <=24 : 32-bit only // 25-26: has neither (no patch needed - WASAPI Exclusive by default) // 27-30: has both (envvar will be respected, ASIO or WASAPI) - // 31+: only has XONAR (ASIO by default, signature patch can be used to force WASAPI - for now) + // 31-32: only has XONAR (ASIO by default, signature patch can be used to force WASAPI - for now) + // 33 : early versions only have XONAR, but later datecodes have both; SOUND_OUTPUT_DEVICE + // returned and it works again when set as env var + + log_info( + "iidx", + "has_SOUND_OUTPUT_DEVICE: {}, has_XONAR_SOUND_CARD: {}", + (has_SOUND_OUTPUT_DEVICE != 0), + (has_XONAR_SOUND_CARD != 0)); if (!has_SOUND_OUTPUT_DEVICE && !has_XONAR_SOUND_CARD) { // iidx 25-26 @@ -821,16 +829,10 @@ namespace games::iidx { return; } - if (has_SOUND_OUTPUT_DEVICE && has_XONAR_SOUND_CARD) { - // iidx 27-30 - log_info("iidx", "This game accepts SOUND_OUTPUT_DEVICE environment variable"); - return; - } - - log_info("iidx", "This game supports ASIO but does not accept SOUND_OUTPUT_DEVICE environment variable"); - - // patch game to force wasapi - if (SOUND_OUTPUT_DEVICE_IN_EFFECT.has_value() && SOUND_OUTPUT_DEVICE_IN_EFFECT.value() == "wasapi") { + // if the game doesn't accept SOUND_OUTPUT_DEVICE, patch game to force wasapi + if (!has_SOUND_OUTPUT_DEVICE && + SOUND_OUTPUT_DEVICE_IN_EFFECT.has_value() && + SOUND_OUTPUT_DEVICE_IN_EFFECT.value() == "wasapi") { intptr_t result = replace_pattern( avs::game::DLL_INSTANCE, "FF5008E8??????FF83780803740D", @@ -848,8 +850,6 @@ namespace games::iidx { "Successfully forced WASAPI as audio engine using signature matching @ 0x{:x}.", result); } - } else { - log_info("iidx", "Not applying force wasapi patch; game will use ASIO"); } // patch iidx32+ for asio compatibility @@ -857,7 +857,8 @@ namespace games::iidx { // the patch is only really needed for (some) non-XONAR devices but since people sometimes disguise // other devices as a XONAR, don't check for the exact string (common ASIO workaround for INF) if (avs::game::is_ext(2024090100, MAXINT) && - !(SOUND_OUTPUT_DEVICE_IN_EFFECT.has_value() && SOUND_OUTPUT_DEVICE_IN_EFFECT.value() == "wasapi")) { + !(SOUND_OUTPUT_DEVICE_IN_EFFECT.has_value() && + SOUND_OUTPUT_DEVICE_IN_EFFECT.value() == "wasapi")) { // in iidx32 final: // ff 50 08 call QWORD PTR [rax+0x8] ; ASIO instance AddRef