feat: Audio3d

This commit is contained in:
auser1337 2025-03-22 18:56:10 -07:00 committed by squidbus
parent b98f528834
commit 5bd10c5f8a
2 changed files with 41 additions and 39 deletions

View File

@ -50,14 +50,21 @@ int PS4_SYSV_ABI sceAudio3dAudioOutOutput(const s32 handle, void* ptr) {
return ORBIS_AUDIO3D_ERROR_INVALID_PORT; return ORBIS_AUDIO3D_ERROR_INVALID_PORT;
} }
state->ports[handle].queue.emplace(ptr); state->ports[handle].queue.emplace_back(ptr);
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAudio3dAudioOutOutputs() { int PS4_SYSV_ABI sceAudio3dAudioOutOutputs(AudioOut::OrbisAudioOutOutputParam* param,
LOG_ERROR(Lib_Audio3d, "(STUBBED) called"); const u32 num) {
return ORBIS_OK; LOG_INFO(Lib_Audio3d, "called, param = {}, num = {}", static_cast<void*>(param), num);
if (!param || !num) {
LOG_ERROR(Lib_Audio3d, "!param || !num");
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
}
return sceAudioOutOutputs(param, num);
} }
int PS4_SYSV_ABI sceAudio3dBedWrite(const OrbisAudio3dPortId port_id, const u32 num_channels, int PS4_SYSV_ABI sceAudio3dBedWrite(const OrbisAudio3dPortId port_id, const u32 num_channels,
@ -67,15 +74,27 @@ int PS4_SYSV_ABI sceAudio3dBedWrite(const OrbisAudio3dPortId port_id, const u32
ORBIS_AUDIO3D_OUTPUT_BOTH, false); ORBIS_AUDIO3D_OUTPUT_BOTH, false);
} }
int PS4_SYSV_ABI sceAudio3dBedWrite2(OrbisAudio3dPortId port_id, u32 num_channels, int PS4_SYSV_ABI sceAudio3dBedWrite2(const OrbisAudio3dPortId port_id, const u32 num_channels,
OrbisAudio3dFormat format, void* buffer, u32 num_samples, const OrbisAudio3dFormat format, void* buffer,
OrbisAudio3dOutputRoute output_route, bool restricted) { const u32 num_samples,
const OrbisAudio3dOutputRoute output_route,
const bool restricted) {
LOG_INFO(Lib_Audio3d, LOG_INFO(Lib_Audio3d,
"called, port_id = {}, num_channels = {}, format = {}, num_samples = {}, output_route " "called, port_id = {}, num_channels = {}, format = {}, num_samples = {}, output_route "
"= {}, restricted = {}", "= {}, restricted = {}",
port_id, num_channels, magic_enum::enum_name(format), num_samples, port_id, num_channels, magic_enum::enum_name(format), num_samples,
magic_enum::enum_name(output_route), restricted); magic_enum::enum_name(output_route), restricted);
if (!state->ports.contains(port_id)) {
LOG_ERROR(Lib_Audio3d, "!state->ports.contains(port_id)");
return ORBIS_AUDIO3D_ERROR_INVALID_PORT;
}
if (output_route > ORBIS_AUDIO3D_OUTPUT_BOTH) {
LOG_INFO(Lib_Audio3d, "output_route > ORBIS_AUDIO3D_OUTPUT_BOTH");
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
}
if (format <= ORBIS_AUDIO3D_FORMAT_FLOAT && if (format <= ORBIS_AUDIO3D_FORMAT_FLOAT &&
((num_channels | 4) == 6 || (num_channels | 0x10) == 24) && buffer && num_samples) { ((num_channels | 4) == 6 || (num_channels | 0x10) == 24) && buffer && num_samples) {
if (format == ORBIS_AUDIO3D_FORMAT_FLOAT) { if (format == ORBIS_AUDIO3D_FORMAT_FLOAT) {
@ -88,17 +107,7 @@ int PS4_SYSV_ABI sceAudio3dBedWrite2(OrbisAudio3dPortId port_id, u32 num_channel
} }
} }
if (output_route > ORBIS_AUDIO3D_OUTPUT_BOTH) { state->ports[port_id].queue.emplace_back(buffer);
LOG_INFO(Lib_Audio3d, "output_route > ORBIS_AUDIO3D_OUTPUT_BOTH");
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
}
if (!state->ports.contains(port_id)) {
LOG_ERROR(Lib_Audio3d, "!state->ports.contains(port_id)");
return ORBIS_AUDIO3D_ERROR_INVALID_PORT;
}
state->ports[port_id].queue.emplace(buffer);
return ORBIS_OK; return ORBIS_OK;
} }
@ -139,8 +148,6 @@ int PS4_SYSV_ABI sceAudio3dGetSpeakerArrayMixCoefficients2() {
int PS4_SYSV_ABI sceAudio3dInitialize(const s64 reserved) { int PS4_SYSV_ABI sceAudio3dInitialize(const s64 reserved) {
LOG_INFO(Lib_Audio3d, "called, reserved = {}", reserved); LOG_INFO(Lib_Audio3d, "called, reserved = {}", reserved);
AudioOut::sceAudioOutInit();
if (reserved != 0) { if (reserved != 0) {
LOG_ERROR(Lib_Audio3d, "reserved != 0"); LOG_ERROR(Lib_Audio3d, "reserved != 0");
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER; return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
@ -152,6 +159,7 @@ int PS4_SYSV_ABI sceAudio3dInitialize(const s64 reserved) {
} }
state = std::make_unique<Audio3dState>(); state = std::make_unique<Audio3dState>();
AudioOut::sceAudioOutInit();
return ORBIS_OK; return ORBIS_OK;
} }
@ -177,9 +185,9 @@ int PS4_SYSV_ABI sceAudio3dObjectReserve(const OrbisAudio3dPortId port_id,
return ORBIS_OK; return ORBIS_OK;
} }
int PS4_SYSV_ABI sceAudio3dObjectSetAttributes(OrbisAudio3dPortId port_id, int PS4_SYSV_ABI sceAudio3dObjectSetAttributes(const OrbisAudio3dPortId port_id,
OrbisAudio3dObjectId object_id, OrbisAudio3dObjectId object_id,
size_t num_attributes, const size_t num_attributes,
const OrbisAudio3dAttribute* attribute_array) { const OrbisAudio3dAttribute* attribute_array) {
if (!state->ports.contains(port_id)) { if (!state->ports.contains(port_id)) {
LOG_ERROR(Lib_Audio3d, "!state->ports.contains(port_id)"); LOG_ERROR(Lib_Audio3d, "!state->ports.contains(port_id)");
@ -192,7 +200,7 @@ int PS4_SYSV_ABI sceAudio3dObjectSetAttributes(OrbisAudio3dPortId port_id,
switch (attribute.attribute_id) { switch (attribute.attribute_id) {
case 0x00000001: { // PCM case 0x00000001: { // PCM
const auto pcm_attribute = static_cast<OrbisAudio3dPcm*>(attribute.value); const auto pcm_attribute = static_cast<OrbisAudio3dPcm*>(attribute.value);
state->ports[port_id].queue.emplace(pcm_attribute->sample_buffer); state->ports[port_id].queue.emplace_back(pcm_attribute->sample_buffer);
break; break;
} }
default: default:
@ -289,15 +297,15 @@ int PS4_SYSV_ABI sceAudio3dPortGetQueueLevel(const OrbisAudio3dPortId port_id, u
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER; return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
} }
const size_t size = state->ports[port_id].queue.size(); const auto [parameters, queue] = state->ports[port_id];
const size_t size = queue.size();
if (queue_level) { if (queue_level) {
*queue_level = size; *queue_level = size;
} }
if (queue_available) { if (queue_available) {
*queue_available = *queue_available = parameters.queue_depth - size;
state->ports[port_id].parameters.queue_depth - state->ports[port_id].queue.size();
} }
return ORBIS_OK; return ORBIS_OK;
@ -364,9 +372,11 @@ int PS4_SYSV_ABI sceAudio3dPortPush(const OrbisAudio3dPortId port_id,
return ORBIS_OK; return ORBIS_OK;
} }
AudioOut::sceAudioOutOutput(1, queue.front()); for (const auto ptr : queue) {
AudioOut::sceAudioOutOutput(1, ptr);
}
queue.pop(); queue.clear();
return ORBIS_OK; return ORBIS_OK;
} }
@ -393,15 +403,7 @@ int PS4_SYSV_ABI sceAudio3dPortSetAttribute(const OrbisAudio3dPortId port_id,
return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER; return ORBIS_AUDIO3D_ERROR_INVALID_PARAMETER;
} }
/*switch (attribute_id) { // NOLINT(*-multiway-paths-covered) // TODO
case 0x00000001: { // PCM
const auto pcm_attribute = static_cast<OrbisAudio3dPcm*>(attribute);
state->ports[port_id].queue.emplace(pcm_attribute->sample_buffer);
break;
}
default:
break;
}*/
return ORBIS_OK; return ORBIS_OK;
} }

View File

@ -64,7 +64,7 @@ struct OrbisAudio3dAttribute {
struct Port { struct Port {
OrbisAudio3dOpenParameters parameters{}; OrbisAudio3dOpenParameters parameters{};
std::queue<void*> queue; // Only stores PCM buffers for now std::deque<void*> queue; // Only stores PCM buffers for now
}; };
struct Audio3dState { struct Audio3dState {
@ -76,7 +76,7 @@ int PS4_SYSV_ABI sceAudio3dAudioOutOpen(OrbisAudio3dPortId port_id, OrbisUserSer
s32 type, s32 index, u32 len, u32 freq, s32 type, s32 index, u32 len, u32 freq,
AudioOut::OrbisAudioOutParamExtendedInformation param); AudioOut::OrbisAudioOutParamExtendedInformation param);
int PS4_SYSV_ABI sceAudio3dAudioOutOutput(s32 handle, void* ptr); int PS4_SYSV_ABI sceAudio3dAudioOutOutput(s32 handle, void* ptr);
int PS4_SYSV_ABI sceAudio3dAudioOutOutputs(); int PS4_SYSV_ABI sceAudio3dAudioOutOutputs(AudioOut::OrbisAudioOutOutputParam* param, u32 num);
int PS4_SYSV_ABI sceAudio3dBedWrite(OrbisAudio3dPortId port_id, u32 num_channels, int PS4_SYSV_ABI sceAudio3dBedWrite(OrbisAudio3dPortId port_id, u32 num_channels,
OrbisAudio3dFormat format, void* buffer, u32 num_samples); OrbisAudio3dFormat format, void* buffer, u32 num_samples);
int PS4_SYSV_ABI sceAudio3dBedWrite2(OrbisAudio3dPortId port_id, u32 num_channels, int PS4_SYSV_ABI sceAudio3dBedWrite2(OrbisAudio3dPortId port_id, u32 num_channels,