mirror of
https://github.com/boykopovar/AnyPS5.git
synced 2026-11-07 13:39:55 +00:00
The rebase onto main dropped main's 4.03 module citation for the selector and size table and its checks of every rejected selector and size. The debt entry names the module again, and the test again checks selectors -1, 4, 7, 9 and 100, the wrong sizes for 0/2/6, 1/3/5 and 8, and endpoint local + 1; all of them still return the invalid-argument error before any port call. Fix-up on Eduardo Ruiz's change.
219 lines
14 KiB
C++
219 lines
14 KiB
C++
#include "prx/libSceVoice/include/Api.hpp"
|
|
#include "prx/libSceVoiceQoS/include/Api.hpp"
|
|
#include "prx/libc/include/general/VabiMacros.hpp"
|
|
#include <cstdint>
|
|
#include <cstdlib>
|
|
#include <stdexcept>
|
|
#include <string_view>
|
|
#include <vector>
|
|
|
|
static void Require(bool value) { if (!value) std::abort(); }
|
|
|
|
template <typename TCall>
|
|
static bool NotImplemented(TCall call) {
|
|
try {
|
|
call();
|
|
} catch (const std::runtime_error&) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
template <typename TCall>
|
|
static bool NotImplementedMessage(TCall call, std::string_view message) {
|
|
try {
|
|
call();
|
|
} catch (const std::runtime_error& error) {
|
|
return std::string_view(error.what()).find(message) != std::string_view::npos;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
int main(int argc, char** argv) {
|
|
Require(argc == 2);
|
|
constexpr int argumentInvalid = static_cast<int>(0x804E0902);
|
|
constexpr int initialized = static_cast<int>(0x804E0905);
|
|
constexpr int notInitialized = static_cast<int>(0x804E0901);
|
|
constexpr int voiceNotInitialized = static_cast<int>(0x804E0801);
|
|
const auto appType = static_cast<std::int32_t>(std::strtoul(argv[1], nullptr, 16));
|
|
std::vector<std::uint8_t> memory(0x40000, 0xAA);
|
|
Require(sceVoiceQoSEnd() == notInitialized);
|
|
Require(sceVoiceQoSEnableChat() == notInitialized);
|
|
Require(sceVoiceQoSDisableChat() == notInitialized);
|
|
std::int32_t uninitLocal = -1;
|
|
std::int32_t uninitRemote = -1;
|
|
Require(sceVoiceQoSGetLocalEndpoint(1, &uninitLocal) == notInitialized);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(1, &uninitRemote) == notInitialized);
|
|
Require(sceVoiceQoSInit(nullptr, 0x40000, appType) == argumentInvalid);
|
|
Require(sceVoiceQoSInit(nullptr, 0, appType) == argumentInvalid);
|
|
Require(sceVoiceQoSInitHQ(nullptr, 0x40000, appType) == argumentInvalid);
|
|
Require(sceVoiceQoSInitHQ(nullptr, 0, appType) == argumentInvalid);
|
|
for (std::uint32_t size : {0u, 1u, 0x100u, 0x3FFFFu, 0x40001u, 0x80000u, 0xFFFFFFFFu}) Require(sceVoiceQoSInit(memory.data(), size, appType) == argumentInvalid);
|
|
for (std::int32_t type : {0, 1, 0x08000000, 0x20000001, 0x30000000, 0x40000000, static_cast<std::int32_t>(0x80000000), -1}) {
|
|
Require(sceVoiceQoSInit(memory.data(), 0x40000, type) == argumentInvalid);
|
|
}
|
|
for (std::uint8_t byte : memory) Require(byte == 0xAA);
|
|
Require(sceVoiceQoSInit(memory.data(), 0x40000, appType) == 0);
|
|
VoiceInitParam voiceParam{};
|
|
voiceParam.app_type = appType;
|
|
Require(sceVoiceInit(&voiceParam, 100) == static_cast<int>(0x804E0802));
|
|
Require(sceVoiceQoSInit(memory.data(), 0x40000, appType) == initialized);
|
|
Require(sceVoiceQoSInit(nullptr, 0, 0) == initialized);
|
|
Require(sceVoiceQoSInitHQ(memory.data(), 0x40000, appType) == initialized);
|
|
Require(sceVoiceQoSInitHQ(nullptr, 0, 0) == initialized);
|
|
|
|
VoicePortParam titlePortParam{};
|
|
titlePortParam.port_type = 0;
|
|
titlePortParam.volume = 0.25f;
|
|
titlePortParam.device.user_id = 1;
|
|
titlePortParam.device.type = 0;
|
|
titlePortParam.device.index = 0;
|
|
std::uint32_t titlePort = 255;
|
|
Require(sceVoiceCreatePort(&titlePort, &titlePortParam) == 0 && titlePort == 0);
|
|
float titleVolume = 0.0f;
|
|
bool titleMute = true;
|
|
Require(sceVoiceGetVolume(titlePort, &titleVolume) == 0 && titleVolume == 0.25f);
|
|
Require(sceVoiceGetMuteFlag(titlePort, &titleMute) == 0 && !titleMute);
|
|
const float otherVolume = 0.5f;
|
|
const std::uint8_t otherMute = 1;
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(0, 0, &otherVolume, sizeof(otherVolume)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(0, 1, &otherMute, sizeof(otherMute)) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(0, 0, &titleVolume, sizeof(titleVolume)) == argumentInvalid);
|
|
Require(sceVoiceGetVolume(titlePort, &titleVolume) == 0 && titleVolume == 0.25f);
|
|
Require(sceVoiceGetMuteFlag(titlePort, &titleMute) == 0 && !titleMute);
|
|
|
|
std::int32_t local = -1;
|
|
std::int32_t remote = -1;
|
|
std::int32_t connection = -1;
|
|
Require(sceVoiceQoSCreateLocalEndpoint(nullptr, 1, 0, 0) == argumentInvalid);
|
|
Require(sceVoiceQoSCreateLocalEndpoint(&local, 1, 0, 0) == 0 && local == 0);
|
|
Require(sceVoiceQoSCreateRemoteEndpoint(&remote) == 0 && remote == 0);
|
|
float volume = 0.0f;
|
|
std::uint8_t mute = 1;
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 0, &volume, sizeof(volume)) == 0 && volume == 1.0f);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 1, &mute, sizeof(mute)) == 0 && mute == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 2, &volume, sizeof(volume)) == 0 && volume == 1.0f);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 3, &mute, sizeof(mute)) == 0 && mute == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 4, &volume, sizeof(volume)) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 7, &volume, sizeof(volume)) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 0, &volume, 1) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 1, &mute, 4) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local + 100, 0, &volume, sizeof(volume)) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 0, nullptr, sizeof(volume)) == argumentInvalid);
|
|
std::uint32_t attributeValue = 0;
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local + 1, 0, &attributeValue, sizeof(attributeValue)) == argumentInvalid);
|
|
for (std::int32_t attribute : {-1, 4, 7, 9, 100}) Require(sceVoiceQoSGetLocalEndpointAttribute(local, attribute, &attributeValue, sizeof(attributeValue)) == argumentInvalid);
|
|
for (std::int32_t attribute : {0, 2, 6}) {
|
|
for (std::int32_t size : {0, 1, 2, 8, -1}) Require(sceVoiceQoSGetLocalEndpointAttribute(local, attribute, &attributeValue, size) == argumentInvalid);
|
|
}
|
|
for (std::int32_t attribute : {1, 3, 5}) {
|
|
for (std::int32_t size : {0, 2, 4, 8, -1}) Require(sceVoiceQoSGetLocalEndpointAttribute(local, attribute, &attributeValue, size) == argumentInvalid);
|
|
}
|
|
for (std::int32_t size : {0, 1, 4, 8, -1}) Require(sceVoiceQoSGetLocalEndpointAttribute(local, 8, &attributeValue, size) == argumentInvalid);
|
|
const float halfVolume = 0.5f;
|
|
const std::uint8_t enabled = 1;
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 0, &halfVolume, sizeof(halfVolume)) == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 0, &volume, sizeof(volume)) == 0 && volume == halfVolume);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 1, &enabled, sizeof(enabled)) == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 1, &mute, sizeof(mute)) == 0 && mute == 1);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 2, &halfVolume, sizeof(halfVolume)) == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 2, &volume, sizeof(volume)) == 0 && volume == halfVolume);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 3, &enabled, sizeof(enabled)) == 0);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 3, &mute, sizeof(mute)) == 0 && mute == 1);
|
|
Require(sceVoiceQoSConnect(&connection, 1, remote) == argumentInvalid);
|
|
Require(sceVoiceQoSConnect(&connection, local, remote) == 0 && connection == 0);
|
|
std::int32_t queriedLocal = -1;
|
|
std::int32_t queriedRemote = -1;
|
|
Require(sceVoiceQoSGetLocalEndpoint(connection, nullptr) == argumentInvalid);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(connection, nullptr) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpoint(connection + 100, &queriedLocal) == argumentInvalid);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(connection + 100, &queriedRemote) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpoint(connection, &queriedLocal) == 0 && queriedLocal == local);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(connection, &queriedRemote) == 0 && queriedRemote == remote);
|
|
std::int32_t duplicate = -1;
|
|
Require(sceVoiceQoSConnect(&duplicate, local, remote) == 0 && duplicate > 0 && duplicate != connection);
|
|
Require(sceVoiceQoSDisconnect(duplicate) == 0);
|
|
|
|
constexpr int limitReached = static_cast<int>(0x804E0907);
|
|
std::int32_t otherLocal = 12;
|
|
Require(sceVoiceQoSCreateLocalEndpoint(&otherLocal, 1, 0, 0) == limitReached && otherLocal == -1);
|
|
Require(sceVoiceQoSCreateLocalEndpoint(&otherLocal, 2, 0, 0) == limitReached && otherLocal == -1);
|
|
|
|
const std::uint32_t level = 0x1234;
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 3, &level, sizeof(level)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 3, nullptr, sizeof(level)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 3, &level, 0) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 3, &level, -1) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local + 100, 3, &level, sizeof(level)) == argumentInvalid);
|
|
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote, 3, &level, sizeof(level)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote, 3, nullptr, sizeof(level)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote, 3, &level, 0) == argumentInvalid);
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote, 3, &level, -1) == argumentInvalid);
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote + 100, 3, &level, sizeof(level)) == argumentInvalid);
|
|
|
|
std::vector<std::uint8_t> packet(1024, 0);
|
|
std::uint32_t packetSize = static_cast<std::uint32_t>(packet.size());
|
|
Require(sceVoiceQoSReadPacket(connection, packet.data(), &packetSize) == 0 && packetSize == 0);
|
|
Require(sceVoiceQoSReadPacket(connection, nullptr, &packetSize) == argumentInvalid);
|
|
Require(sceVoiceQoSReadPacket(connection, packet.data(), nullptr) == argumentInvalid);
|
|
Require(sceVoiceQoSReadPacket(connection + 100, packet.data(), &packetSize) == argumentInvalid);
|
|
|
|
packetSize = 100;
|
|
Require(sceVoiceQoSWritePacket(connection, packet.data(), &packetSize) == 0);
|
|
Require(sceVoiceQoSWritePacket(connection, nullptr, &packetSize) == argumentInvalid);
|
|
Require(sceVoiceQoSWritePacket(connection, packet.data(), nullptr) == argumentInvalid);
|
|
Require(sceVoiceQoSWritePacket(connection + 100, packet.data(), &packetSize) == argumentInvalid);
|
|
|
|
Require(NotImplemented([&] { sceVoiceQoSSetRemoteEndpointAttribute(remote, 7, &level, 1); }));
|
|
Require(sceVoiceQoSDisconnect(connection) == 0);
|
|
Require(sceVoiceQoSDisconnect(connection) == 0);
|
|
Require(sceVoiceQoSGetLocalEndpoint(connection, &queriedLocal) == 0 && queriedLocal == -1);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(connection, &queriedRemote) == 0 && queriedRemote == -1);
|
|
Require(sceVoiceQoSDeleteLocalEndpoint(local) == 0);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 0, &otherVolume, sizeof(otherVolume)) == argumentInvalid);
|
|
Require(sceVoiceQoSSetLocalEndpointAttribute(local, 1, &otherMute, sizeof(otherMute)) == argumentInvalid);
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(local, 0, &titleVolume, sizeof(titleVolume)) == argumentInvalid);
|
|
Require(sceVoiceGetVolume(titlePort, &titleVolume) == 0 && titleVolume == 0.25f);
|
|
Require(sceVoiceGetMuteFlag(titlePort, &titleMute) == 0 && !titleMute);
|
|
Require(sceVoiceDeletePort(titlePort) == 0);
|
|
Require(sceVoiceQoSDeleteLocalEndpoint(local) == argumentInvalid);
|
|
Require(sceVoiceQoSDeleteRemoteEndpoint(remote) == 0);
|
|
|
|
const int endpointLimit = appType == 0x10000000 ? 15 : 7;
|
|
for (int index = 0; index < endpointLimit; ++index) Require(sceVoiceQoSCreateRemoteEndpoint(&remote) == 0 && remote == index);
|
|
Require(sceVoiceQoSCreateRemoteEndpoint(&remote) == limitReached && remote == -1);
|
|
Require(sceVoiceQoSDeleteRemoteEndpoint(2) == 0);
|
|
Require(sceVoiceQoSCreateRemoteEndpoint(&remote) == 0 && remote == 2);
|
|
Require(sceVoiceQoSEnd() == 0);
|
|
Require(sceVoiceQoSEnd() == notInitialized);
|
|
Require(sceVoiceQoSGetLocalEndpoint(connection, &queriedLocal) == notInitialized);
|
|
Require(sceVoiceQoSGetRemoteEndpoint(connection, &queriedRemote) == notInitialized);
|
|
Require(sceVoiceQoSDeleteRemoteEndpoint(remote) == notInitialized);
|
|
Require(sceVoiceQoSCreateLocalEndpoint(&local, 1, 0, 0) == notInitialized);
|
|
Require(sceVoiceQoSSetRemoteEndpointAttribute(remote, 3, &level, sizeof(level)) == notInitialized);
|
|
Require(sceVoiceQoSReadPacket(connection, packet.data(), &packetSize) == notInitialized);
|
|
Require(sceVoiceQoSWritePacket(connection, packet.data(), &packetSize) == notInitialized);
|
|
Require(sceVoiceQoSInit(memory.data(), 0x40000, appType) == 0);
|
|
Require(sceVoiceQoSDeleteRemoteEndpoint(remote) == argumentInvalid);
|
|
Require(sceVoiceQoSEnd() == 0);
|
|
Require(sceVoiceQoSEnd() == notInitialized);
|
|
Require(sceVoiceQoSEnableChat() == notInitialized);
|
|
Require(sceVoiceQoSDisableChat() == notInitialized);
|
|
Require(sceVoiceQoSInitHQ(nullptr, 0x40000, appType) == argumentInvalid);
|
|
Require(sceVoiceQoSInitHQ(memory.data(), 0x40000, appType) == 0);
|
|
Require(sceVoiceQoSEnd() == 0);
|
|
Require(sceVoiceQoSEnableChat() == notInitialized);
|
|
Require(sceVoiceQoSDisableChat() == notInitialized);
|
|
Require(sceVoiceQoSInit(nullptr, 0x40000, appType) == argumentInvalid);
|
|
|
|
Require(sceVoiceQoSGetLocalEndpointAttribute(0, 0, nullptr, 0) == notInitialized);
|
|
Require(NotImplemented([] { sceVoiceQoSGetRemoteEndpointAttribute(1, 1, nullptr, 0); }));
|
|
Require(NotImplemented([] { sceVoiceQoSGetConnectionAttribute(1, 1, nullptr, 0); }));
|
|
Require(NotImplemented([] { sceVoiceQoSGetStatus(1, 1, nullptr, 0); }));
|
|
Require(NotImplemented([] { sceVoiceQoSDebugGetStatus(0, 200, nullptr, 4); }));
|
|
Require(NotImplemented([] { sceVoiceQoSSetMode(); }));
|
|
Require(NotImplemented([] { sceVoiceQoSTerminate(); }));
|
|
Require(sceVoiceEnd_nid_postfix() == voiceNotInitialized);
|
|
}
|