From 80df59b666afa48a6b04545a8ea5e5c0733df4de Mon Sep 17 00:00:00 2001 From: Biologisten Date: Thu, 29 Oct 2026 05:46:33 +0100 Subject: [PATCH] test(audio): isolate AudioOut2 tests from APS5_PAD_SPEAKER_FALLBACK_DB MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit CreateContext() reads the variable, so a value exported in the developer's shell reached the AudioOut2 tests: garbage aborted seven of the sixty audio tests and -15 broke the unity fold in audio_out2_port_layouts. Every test that creates a context now unsets the variable at the start of main(), and the tests that exercise it set it themselves. Throws() now takes the exception type it expects, so the two port checks still require std::invalid_argument while the environment check requires std::runtime_error. The rejection error keeps the original pointer to the value, so a value with leading whitespace is reported verbatim and the test checks the name=value prefix. 🤖 Generated with Codebuff Co-Authored-By: Codebuff --- .../prx/libSceAudioOut/src/AudioOut2PadMix.cpp | 3 ++- .../libSceAudioOut/tests/AudioOut2DeviceState.cpp | 10 ++++++++++ .../prx/libSceAudioOut/tests/AudioOut2PadMix.cpp | 15 +++++++++------ .../libSceAudioOut/tests/AudioOut2PortBuffers.cpp | 10 ++++++++++ .../libSceAudioOut/tests/AudioOut2PortLayouts.cpp | 1 + .../prx/libSceAudioOut/tests/AudioOut2Timing.cpp | 10 ++++++++++ .../prx/libSceAudioOut/tests/AudioOutShutdown.cpp | 3 +++ 7 files changed, 45 insertions(+), 7 deletions(-) diff --git a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp index 8732ab428e..f49efa446b 100644 --- a/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp +++ b/core/libs/prx/libSceAudioOut/src/AudioOut2PadMix.cpp @@ -31,13 +31,14 @@ static bool IsMutedText(const char* text) { float AudioPadSpeakerFallbackGainFrom(const char* dbText) { if (dbText == nullptr) return DEFAULT_PAD_SPEAKER_FALLBACK_GAIN; + const char* const text = dbText; while (std::isspace(static_cast(*dbText))) dbText++; if (IsMutedText(dbText)) return 0.0f; char* end = nullptr; const float db = std::strtof(dbText, &end); while (std::isspace(static_cast(*end))) end++; if (end == dbText || !std::isfinite(db) || *end != '\0' || db < PAD_SPEAKER_FALLBACK_MIN_DB || db > PAD_SPEAKER_FALLBACK_MAX_DB) { - throw std::runtime_error(std::string(AUDIO_PAD_SPEAKER_FALLBACK_ENV) + '=' + dbText + ": expected mute, off, -inf or a number of dB from -60 to 0"); + throw std::runtime_error(std::string(AUDIO_PAD_SPEAKER_FALLBACK_ENV) + '=' + text + ": expected mute, off, -inf or a number of dB from -60 to 0"); } return std::pow(10.0f, db / 20.0f); } diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp index dffab531e6..2e1956f746 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2DeviceState.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAudioOut/libSceAudioOut.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -37,6 +38,14 @@ void SetEnvironment(const char* name, const std::string& value) { #endif } +void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + AudioOut2PortState StateOfPort(AudioOut2ContextHandle context, std::uint32_t format) { AudioOut2PortParam params{}; params.port_type = portTypeMain; @@ -145,6 +154,7 @@ void SystemStateIsSilentAndRejectsNull() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); const auto path = std::filesystem::temp_directory_path() / ("anyps5_audio_out2_device_state-" + std::to_string(std::random_device{}()) + ".raw"); std::filesystem::remove(path); SetEnvironment("SDL_DISKAUDIOFILE", path.string()); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp index 5a23bce489..e967ba8200 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PadMix.cpp @@ -36,18 +36,20 @@ static void RequireRejected(const char* text, const char* message) { AudioPadSpeakerFallbackGainFrom(text); } catch (const std::exception& error) { const std::string what(error.what()); - Require(what.find(AUDIO_PAD_SPEAKER_FALLBACK_ENV) != std::string::npos && what.find("expected") != std::string::npos, message); + Require(what.find(std::string(AUDIO_PAD_SPEAKER_FALLBACK_ENV) + '=' + text) != std::string::npos && what.find("expected") != std::string::npos, message); return; } Require(false, message); } -template +template static bool Throws(TAction action) { try { action(); - } catch (const std::exception&) { + } catch (const TException&) { return true; + } catch (...) { + return false; } return false; } @@ -131,8 +133,8 @@ int main() { { auto out = Silence<1>(); const float data[8] = {1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f}; - Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::Main, data, 2, unity, out.data()); }), "a main-mix port is refused"); - Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::PadVibration, data, 8, unity, out.data()); }), "an 8-channel pad port is refused"); + Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::Main, data, 2, unity, out.data()); }), "a main-mix port is refused"); + Require(Throws([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::PadVibration, data, 8, unity, out.data()); }), "an 8-channel pad port is refused"); for (float sample : out) Require(sample == 0.0f, "a refused port mixes nothing"); } @@ -152,6 +154,7 @@ int main() { RequireRejected("5", "a value above the range is rejected"); RequireRejected("garbage", "invalid input is rejected"); RequireRejected("-15x", "trailing text is rejected"); + RequireRejected(" -15x", "leading whitespace is reported verbatim"); UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); Require(std::fabs(AudioPadSpeakerFallbackGain() - 1.0f) <= 1e-6f, "unset environment keeps unity"); @@ -160,7 +163,7 @@ int main() { SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "mute"); Require(AudioPadSpeakerFallbackGain() == 0.0f, "muted environment"); SetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV, "garbage"); - Require(Throws([] { AudioPadSpeakerFallbackGain(); }), "an invalid environment stops the title"); + Require(Throws([] { AudioPadSpeakerFallbackGain(); }), "an invalid environment stops the title"); UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); { diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp index a46559d5ae..f14b1d290e 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortBuffers.cpp @@ -1,4 +1,5 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -28,6 +29,14 @@ static void SetEnvironment(const char* name, const std::string& value) { #endif } +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + namespace { constexpr std::uint32_t grain = 256; @@ -300,6 +309,7 @@ void TestBufferReusedAcrossPortsKeepsEachPortsGrain(bool advanced) { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); SetEnvironment("SDL_AUDIODRIVER", "disk"); TestAdvanceRetainsRewrittenBuffer(); TestAdvanceRetainsVolume(); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp index 8183b58da8..c6fec59e84 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2PortLayouts.cpp @@ -383,6 +383,7 @@ void TestMeasuredMainPortFormats() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); TestUserAttributes(); SetEnvironment("SDL_AUDIODRIVER", "disk"); for (const Layout* layout : {&mono, &stereo, &surround71, &surround714}) { diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp index d0b85c57cc..60218552ec 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOut2Timing.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" #include "prx/libSceAudioOut/src/AudioOut2Internal.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include @@ -27,6 +28,14 @@ static void SetEnvironment(const char* name, const std::string& value) { #endif } +static void UnsetEnvironment(const char* name) { +#ifdef _WIN32 + _putenv_s(name, ""); +#else + unsetenv(name); +#endif +} + namespace { constexpr std::uint32_t grain = 256; @@ -352,6 +361,7 @@ void TestLowLatencyQueueLevelFillsToTheDepth() { } int main() { + UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV); SetEnvironment("SDL_AUDIODRIVER", "disk"); TestReadAtNextPush(); TestRecreatedPort(); diff --git a/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp b/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp index fcadcec548..46ea98cb5e 100644 --- a/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp +++ b/core/libs/prx/libSceAudioOut/tests/AudioOutShutdown.cpp @@ -1,5 +1,6 @@ #include "prx/libSceAudioOut/include/AudioOut2.hpp" #include "prx/libSceAudioOut/include/AudioOut.hpp" +#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp" #include "SceTypes.hpp" #include "prx/libc/include/general/VabiMacros.hpp" #include "prx/libc/include/Shutdown.hpp" @@ -125,8 +126,10 @@ void OutputAudioOut() { int main(int argc, char** argv) { #ifdef _WIN32 _putenv_s("SDL_AUDIODRIVER", "dummy"); + _putenv_s(AUDIO_PAD_SPEAKER_FALLBACK_ENV, ""); #else setenv("SDL_AUDIODRIVER", "dummy", 1); + unsetenv(AUDIO_PAD_SPEAKER_FALLBACK_ENV); #endif const bool waiting = argc == 2 && std::strcmp(argv[1], "--audio-out2-waiting-push") == 0; if (argc == 2 && std::strcmp(argv[1], "--audio-out2") == 0) PushAudioOut2();