test(libSceVideoOut): cover turning requests into host volume commands

Register pad_host_volume. An empty request set changes nothing, volume up and down move one step and return to exactly unity, mute toggles, combined requests run up then down then mute, and the other host requests are ignored.
This commit is contained in:
MarcZX10 authored and Adrià committed 2026-10-30 16:29:55 +01:00
1 parent 22cb1123a0
commit addfd6a8ee
2 files changed
+94

No files matched your search

@@ -190,6 +190,17 @@ if(BUILD_TESTING)
endif()
endif()
if(BUILD_TESTING)
add_test_executable(pad_host_volume_tests tests/HostVolumeInput.cpp ${CMAKE_CURRENT_SOURCE_DIR}/../libSceAudioOut/src/HostVolumeState.cpp)
target_include_directories(pad_host_volume_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include)
target_link_libraries(pad_host_volume_tests PRIVATE SDL2-static)
if(MINGW)
target_compile_options(pad_host_volume_tests PRIVATE -fasynchronous-unwind-tables)
target_link_options(pad_host_volume_tests PRIVATE -static -static-libgcc -static-libstdc++)
endif()
add_test(NAME pad_host_volume COMMAND pad_host_volume_tests)
endif()
if(BUILD_TESTING)
add_test_executable(pad_keyboard_mouse_tests tests/KeyboardMouse.cpp src/KeyboardMouse.cpp)
target_include_directories(pad_keyboard_mouse_tests PRIVATE ${LIBS_INCLUDE_DIR} ${CMAKE_SOURCE_DIR}/3rdparty/SDL2/include)
@@ -0,0 +1,83 @@
#include "prx/libSceVideoOut/include/HostVolumeInput.hpp"
#include <cstdio>
#include <exception>
#include <stdexcept>
namespace {
void require(bool condition, const char* message) {
if (!condition) throw std::runtime_error(message);
}
void noRequestChangesNothing() {
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
HostVolume after;
require(!ApplyHostVolumeRequests(Pad::InputRequests{}, &after), "an empty request set asks for nothing");
require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "an empty request set leaves unity");
require(after.Volume() == 100 && !after.Muted(), "the out parameter is untouched without a request");
}
void volumeRequestsMoveTheVolume() {
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
HostVolume after;
Pad::InputRequests down;
down.volumeDown = true;
require(ApplyHostVolumeRequests(down, &after), "a volume down request is handled");
require(after.Volume() == 95 && HostVolumeGain_nid_no_patch() == after.Gain(), "volume down lowers the shared volume by one step");
Pad::InputRequests up;
up.volumeUp = true;
require(ApplyHostVolumeRequests(up, &after), "a volume up request is handled");
require(after.Volume() == 100 && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "volume up returns to exactly unity");
require(ApplyHostVolumeRequests(up, &after), "a volume up request at the top is still handled");
require(after.Volume() == 100, "volume up at the top stays at 100");
}
void muteRequestToggles() {
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
HostVolume after;
Pad::InputRequests mute;
mute.toggleMute = true;
require(ApplyHostVolumeRequests(mute, &after) && after.Muted() && HostVolumeGain_nid_no_patch() == 0, "the first mute request silences the output");
require(ApplyHostVolumeRequests(mute, &after) && !after.Muted() && HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the second mute request restores the output");
}
void requestsRunInOrder() {
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
HostVolume after;
Pad::InputRequests all;
all.volumeUp = true;
all.volumeDown = true;
all.toggleMute = true;
require(ApplyHostVolumeRequests(all, &after), "a combined request is handled");
require(after.Volume() == 95 && after.Muted(), "up, then down, then mute leaves 95 muted");
}
void otherRequestsAreIgnored() {
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
HostVolume after;
Pad::InputRequests other;
other.toggleFullscreen = true;
other.togglePerformanceOverlay = true;
other.screenshot = true;
other.toggleMouse = true;
other.releaseMouse = true;
require(!ApplyHostVolumeRequests(other, &after), "the other host requests are not volume requests");
require(HostVolumeGain_nid_no_patch() == HostVolume::UnityGain, "the other host requests leave the volume alone");
}
}
int main() try {
noRequestChangesNothing();
volumeRequestsMoveTheVolume();
muteRequestToggles();
requestsRunInOrder();
otherRequestsAreIgnored();
HostVolumeConfigure_nid_no_patch(nullptr, nullptr);
std::puts("host volume input tests passed");
return 0;
} catch (const std::exception& error) {
std::fprintf(stderr, "%s\n", error.what());
return 1;
}