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();