diff --git a/tools/linuxfs/overlay/usr/local/bin/steam-compatibility b/tools/linuxfs/overlay/usr/local/bin/steam-compatibility index cc68575e5..fb84fd94d 100755 --- a/tools/linuxfs/overlay/usr/local/bin/steam-compatibility +++ b/tools/linuxfs/overlay/usr/local/bin/steam-compatibility @@ -244,6 +244,10 @@ bl_vacdiag() { BL_DIRECTAUDIO_SETUP = """ bl_directaudio() { + case "${verb:-}" in + run|waitforexitandrun|runinprefix) ;; + *) return 0 ;; + esac base=$1 [ -n "${BL_DIRECTAUDIO:-}" ] || return 0 [ -d "$BL_DIRECTAUDIO" ] || return 0 diff --git a/tools/tests/test_game_environment.py b/tools/tests/test_game_environment.py index d22331e6e..9c8a98c20 100644 --- a/tools/tests/test_game_environment.py +++ b/tools/tests/test_game_environment.py @@ -849,12 +849,12 @@ class DirectAudioPrefixTest(unittest.TestCase): (self.windows / folder).mkdir(parents=True) self.reg = self.compat / "pfx/user.reg" - def run_setup(self): - script = COMPAT["BL_DIRECTAUDIO_SETUP"] + '\nbl_directaudio "$1"\necho "WINEDLLPATH=$WINEDLLPATH"\necho "WINE_AUDIO_DRIVER=${WINE_AUDIO_DRIVER:-}"\n' + def run_setup(self, verb="waitforexitandrun"): + script = COMPAT["BL_DIRECTAUDIO_SETUP"] + '\nverb=$2\nbl_directaudio "$1"\necho "WINEDLLPATH=$WINEDLLPATH"\necho "WINE_AUDIO_DRIVER=${WINE_AUDIO_DRIVER:-}"\n' env = dict(os.environ, BL_DIRECTAUDIO=str(self.sets), STEAM_COMPAT_DATA_PATH=str(self.compat)) env.pop("WINEDLLPATH", None) env.pop("WINE_AUDIO_DRIVER", None) - return subprocess.run(["bash", "-c", script, "bash", str(self.tool)], env=env, capture_output=True, text=True, check=True) + return subprocess.run(["bash", "-c", script, "bash", str(self.tool), verb], env=env, capture_output=True, text=True, check=True) def audio_values(self): found, current = [], None @@ -869,6 +869,27 @@ class DirectAudioPrefixTest(unittest.TestCase): path = self.windows / folder / "winedirectaudio.drv" return os.readlink(path) if path.is_symlink() else None + def test_non_launch_verbs_preserve_audio_configuration(self): + for verb in ("getcompatpath", "getnativepath", "destroyprefix"): + with self.subTest(verb=verb): + self.reg.write_text('WINE REGISTRY Version 2\n\n[Software\\\\Wine\\\\Drivers] 1\n"Audio"="pulse"\n') + before = self.reg.read_bytes() + result = self.run_setup(verb) + self.assertEqual(self.reg.read_bytes(), before) + self.assertIsNone(self.link("system32")) + self.assertIsNone(self.link("syswow64")) + self.assertIn("WINEDLLPATH=\n", result.stdout) + self.assertIn("WINE_AUDIO_DRIVER=\n", result.stdout) + + def test_other_windows_launch_verbs_still_set_up_audio(self): + self.reg.write_text("WINE REGISTRY Version 2\n") + for verb in ("run", "runinprefix"): + with self.subTest(verb=verb): + result = self.run_setup(verb) + self.assertIn("DirectAudio ready", result.stderr) + self.assertIn("WINE_AUDIO_DRIVER=directaudio,pulse\n", result.stdout) + self.assertEqual(self.link("system32"), str(self.audio / "lib/wine/aarch64-windows/winedirectaudio.drv")) + def test_the_driver_is_placed_and_selected_the_way_wine_reads_it(self): self.reg.write_text("WINE REGISTRY Version 2\n;; All keys relative to \\\\User\\\\S-1-5-21-0-0-0-1000\n\n#arch=win64\n") result = self.run_setup()