test(audio): isolate AudioOut2 tests from APS5_PAD_SPEAKER_FALLBACK_DB

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 <[email protected]>
This commit is contained in:
Biologisten committed 2026-10-29 05:46:33 +01:00
1 parent 315050d000
commit 80df59b666
7 files changed
+45 -7

No files matched your search

@@ -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<unsigned char>(*dbText))) dbText++;
if (IsMutedText(dbText)) return 0.0f;
char* end = nullptr;
const float db = std::strtof(dbText, &end);
while (std::isspace(static_cast<unsigned char>(*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);
}
@@ -1,4 +1,5 @@
#include "prx/libSceAudioOut/libSceAudioOut.hpp"
#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp"
#include "SceTypes.hpp"
#include <cstddef>
@@ -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());
@@ -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<typename TAction>
template<typename TException, typename TAction>
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<std::invalid_argument>([&] { AudioOut2AccumulatePadFrame(AudioOut2Route::Main, data, 2, unity, out.data()); }), "a main-mix port is refused");
Require(Throws<std::invalid_argument>([&] { 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<std::runtime_error>([] { AudioPadSpeakerFallbackGain(); }), "an invalid environment stops the title");
UnsetEnvironment(AUDIO_PAD_SPEAKER_FALLBACK_ENV);
{
@@ -1,4 +1,5 @@
#include "prx/libSceAudioOut/include/AudioOut2.hpp"
#include "prx/libSceAudioOut/src/AudioOut2PadMix.hpp"
#include "SceTypes.hpp"
#include <algorithm>
@@ -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();
@@ -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}) {
@@ -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 <chrono>
@@ -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();
@@ -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();