From 4db3e788ee2a4da2a56f9da946e31410dbc97a54 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Thu, 24 May 2018 01:40:04 -0700 Subject: [PATCH 1/4] GetAudioRendererWorkBufferSize impl Impl of GetAudioRendererWorkBufferSize based on RE, if this can be cleaned up, please contribute! --- src/core/hle/service/audio/audren_u.cpp | 63 ++++++++++++++++++++++++- src/core/hle/service/audio/audren_u.h | 26 ++++++++++ 2 files changed, 87 insertions(+), 2 deletions(-) diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 38bc65d955..bd1b48666f 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -256,12 +256,61 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { } void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { + IPC::RequestParser rp{ctx}; + auto params = rp.PopRaw(); + + u64 buffer_sz = ((4 * params.Unknown8 + 0x3f) & ~0x3f); + buffer_sz += (params.UnknownC * 1024); + buffer_sz += 0x940 * (params.UnknownC + 1); + buffer_sz += 0x3F0 * params.voiceCount; + buffer_sz += (8 * params.UnknownC + 0x17) & ~0xF; + buffer_sz += (8 * params.voiceCount + 0xF) & ~0xF; + buffer_sz += ((0x3C0 * (params.sinkCount + params.UnknownC) + 4 * params.sampleCount) * + (params.Unknown8 + 6) + + 0x3F) & + ~0x3f; + + if (IsFeatureSupported(AudioFeatures::Splitter, params.MAGIC)) { + u32 count = params.UnknownC + 1; + u64 nodeCount = (count + 0x3f) & ~0x3f; + u64 NodeStateBufferSz = 4 * (nodeCount * nodeCount) + 0xC * nodeCount + 2 * (nodeCount / 8); + u64 EdgeMatrixBufferSz = 0; + nodeCount = (count * count + 0x3f) & ~0x3f; + if (nodeCount >> 31 != 0) { + EdgeMatrixBufferSz = (nodeCount | 7) / 8; + } else { + EdgeMatrixBufferSz = nodeCount / 8; + } + buffer_sz += (NodeStateBufferSz + EdgeMatrixBufferSz + 0xF) & ~0xF; + } + + buffer_sz += 0x20 * (params.effectCount + 4 * params.voiceCount) + 0x50; + if (IsFeatureSupported(AudioFeatures::Splitter, params.MAGIC)) { + buffer_sz += 0xE0 * params.Unknown2C; + buffer_sz += 0x20 * params.splitterCount; + buffer_sz += ((4 * params.Unknown2C + 0xF) & ~0xF); + } + buffer_sz = ((buffer_sz + 0x3F) & ~0x3F) + 0x170 * params.sinkCount; + u64 output_sz = buffer_sz + 0x280 * params.sinkCount + 0x4B0 * params.effectCount + + ((params.voiceCount * 256) | 0x40); + + if (params.Unknown1C >= 1) { + output_sz = + ((((16 * params.sinkCount + 16 * params.effectCount + 16 * params.voiceCount + 16) + + 0x658) * + (params.Unknown1C + 1) + + 0xFF) & + ~0x3f) + + output_sz; + } + output_sz = (output_sz + 0x1907d) & ~0xFFF; + IPC::ResponseBuilder rb{ctx, 4}; rb.Push(RESULT_SUCCESS); - rb.Push(0x4000); + rb.Push(output_sz); - NGLOG_WARNING(Service_Audio, "(STUBBED) called"); + NGLOG_DEBUG(Service_Audio, "called, buffer_size=0x{:X}", output_sz); } void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) { @@ -273,4 +322,14 @@ void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) { NGLOG_DEBUG(Service_Audio, "called"); } +bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le Revision) { + u32_be version_num = (Revision - 0x30564552); // Byte swap + switch (feature) { + case AudioFeatures::Splitter: + return version_num >= 2; + default: + return false; + } +} + } // namespace Service::Audio diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 71b632e801..940125c540 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -21,6 +21,32 @@ private: void OpenAudioRenderer(Kernel::HLERequestContext& ctx); void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); void GetAudioDevice(Kernel::HLERequestContext& ctx); + + struct WorkerBufferParameters { + u32_le sampleRate; + u32_le sampleCount; + u32_le Unknown8; + u32_le UnknownC; + u32_le voiceCount; + u32_le sinkCount; + u32_le effectCount; + u32_le Unknown1C; + u8 Unknown20; + u8 padding1[3]; + u32_le splitterCount; + u32_le Unknown2C; + u8 padding2[4]; + u32_le MAGIC; + }; + static_assert(sizeof(WorkerBufferParameters) == 52, + "WorkerBufferParameters is an invalid size"); + + enum class AudioFeatures : u32 { + UNKNOWN = 0, // Placeholder + Splitter, + }; + + bool IsFeatureSupported(AudioFeatures feature, u32_le Revision); }; } // namespace Service::Audio From b4f6ae4ae4be9d6103f576e0717e026a351ec8de Mon Sep 17 00:00:00 2001 From: David Marcec Date: Thu, 24 May 2018 01:45:46 -0700 Subject: [PATCH 2/4] Naming conventions --- src/core/hle/service/audio/audren_u.cpp | 59 +++++++++++++------------ src/core/hle/service/audio/audren_u.h | 24 +++++----- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index bd1b48666f..54238563c5 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -259,46 +259,47 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { IPC::RequestParser rp{ctx}; auto params = rp.PopRaw(); - u64 buffer_sz = ((4 * params.Unknown8 + 0x3f) & ~0x3f); - buffer_sz += (params.UnknownC * 1024); - buffer_sz += 0x940 * (params.UnknownC + 1); - buffer_sz += 0x3F0 * params.voiceCount; - buffer_sz += (8 * params.UnknownC + 0x17) & ~0xF; - buffer_sz += (8 * params.voiceCount + 0xF) & ~0xF; - buffer_sz += ((0x3C0 * (params.sinkCount + params.UnknownC) + 4 * params.sampleCount) * - (params.Unknown8 + 6) + + u64 buffer_sz = ((4 * params.unknown8 + 0x3f) & ~0x3f); + buffer_sz += (params.unknownC * 1024); + buffer_sz += 0x940 * (params.unknownC + 1); + buffer_sz += 0x3F0 * params.voice_count; + buffer_sz += (8 * params.unknownC + 0x17) & ~0xF; + buffer_sz += (8 * params.voice_count + 0xF) & ~0xF; + buffer_sz += ((0x3C0 * (params.sink_count + params.unknownC) + 4 * params.sample_count) * + (params.unknown8 + 6) + 0x3F) & ~0x3f; - if (IsFeatureSupported(AudioFeatures::Splitter, params.MAGIC)) { - u32 count = params.UnknownC + 1; - u64 nodeCount = (count + 0x3f) & ~0x3f; - u64 NodeStateBufferSz = 4 * (nodeCount * nodeCount) + 0xC * nodeCount + 2 * (nodeCount / 8); - u64 EdgeMatrixBufferSz = 0; - nodeCount = (count * count + 0x3f) & ~0x3f; - if (nodeCount >> 31 != 0) { - EdgeMatrixBufferSz = (nodeCount | 7) / 8; + if (IsFeatureSupported(AudioFeatures::Splitter, params.magic)) { + u32 count = params.unknownC + 1; + u64 node_count = (count + 0x3f) & ~0x3f; + u64 node_state_buffer_sz = + 4 * (node_count * node_count) + 0xC * node_count + 2 * (node_count / 8); + u64 edge_matrix_buffer_sz = 0; + node_count = (count * count + 0x3f) & ~0x3f; + if (node_count >> 31 != 0) { + edge_matrix_buffer_sz = (node_count | 7) / 8; } else { - EdgeMatrixBufferSz = nodeCount / 8; + edge_matrix_buffer_sz = node_count / 8; } - buffer_sz += (NodeStateBufferSz + EdgeMatrixBufferSz + 0xF) & ~0xF; + buffer_sz += (node_state_buffer_sz + edge_matrix_buffer_sz + 0xF) & ~0xF; } - buffer_sz += 0x20 * (params.effectCount + 4 * params.voiceCount) + 0x50; - if (IsFeatureSupported(AudioFeatures::Splitter, params.MAGIC)) { - buffer_sz += 0xE0 * params.Unknown2C; - buffer_sz += 0x20 * params.splitterCount; - buffer_sz += ((4 * params.Unknown2C + 0xF) & ~0xF); + buffer_sz += 0x20 * (params.effect_count + 4 * params.voice_count) + 0x50; + if (IsFeatureSupported(AudioFeatures::Splitter, params.magic)) { + buffer_sz += 0xE0 * params.unknown2c; + buffer_sz += 0x20 * params.splitter_count; + buffer_sz += ((4 * params.unknown2c + 0xF) & ~0xF); } - buffer_sz = ((buffer_sz + 0x3F) & ~0x3F) + 0x170 * params.sinkCount; - u64 output_sz = buffer_sz + 0x280 * params.sinkCount + 0x4B0 * params.effectCount + - ((params.voiceCount * 256) | 0x40); + buffer_sz = ((buffer_sz + 0x3F) & ~0x3F) + 0x170 * params.sink_count; + u64 output_sz = buffer_sz + 0x280 * params.sink_count + 0x4B0 * params.effect_count + + ((params.voice_count * 256) | 0x40); - if (params.Unknown1C >= 1) { + if (params.unknown1c >= 1) { output_sz = - ((((16 * params.sinkCount + 16 * params.effectCount + 16 * params.voiceCount + 16) + + ((((16 * params.sink_count + 16 * params.effect_count + 16 * params.voice_count + 16) + 0x658) * - (params.Unknown1C + 1) + + (params.unknown1c + 1) + 0xFF) & ~0x3f) + output_sz; diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index 940125c540..df55cd48d2 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -23,20 +23,20 @@ private: void GetAudioDevice(Kernel::HLERequestContext& ctx); struct WorkerBufferParameters { - u32_le sampleRate; - u32_le sampleCount; - u32_le Unknown8; - u32_le UnknownC; - u32_le voiceCount; - u32_le sinkCount; - u32_le effectCount; - u32_le Unknown1C; - u8 Unknown20; + u32_le sample_rate; + u32_le sample_count; + u32_le unknown8; + u32_le unknownC; + u32_le voice_count; + u32_le sink_count; + u32_le effect_count; + u32_le unknown1c; + u8 unknown20; u8 padding1[3]; - u32_le splitterCount; - u32_le Unknown2C; + u32_le splitter_count; + u32_le unknown2c; u8 padding2[4]; - u32_le MAGIC; + u32_le magic; }; static_assert(sizeof(WorkerBufferParameters) == 52, "WorkerBufferParameters is an invalid size"); From 60807c3a50eedb656aec4efc15e30714a6b3a7a9 Mon Sep 17 00:00:00 2001 From: David Marcec Date: Thu, 24 May 2018 01:47:11 -0700 Subject: [PATCH 3/4] Removed unneeded placeholder --- src/core/hle/service/audio/audren_u.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h index df55cd48d2..d40ba50a0d 100644 --- a/src/core/hle/service/audio/audren_u.h +++ b/src/core/hle/service/audio/audren_u.h @@ -42,7 +42,6 @@ private: "WorkerBufferParameters is an invalid size"); enum class AudioFeatures : u32 { - UNKNOWN = 0, // Placeholder Splitter, }; From 4879fa0a9422fa7028c6885cfc1217a2d97c3039 Mon Sep 17 00:00:00 2001 From: NekokoTime <38867013+NekokoTime@users.noreply.github.com> Date: Thu, 24 May 2018 15:26:12 -0300 Subject: [PATCH 4/4] GetAudioRendererWorkBufferSize impl #465 Impl of GetAudioRendererWorkBufferSize based on RE, if this can be cleaned up, please contribute! --- src/core/hle/service/audio/audren_u.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp index 54238563c5..787023e2a2 100644 --- a/src/core/hle/service/audio/audren_u.cpp +++ b/src/core/hle/service/audio/audren_u.cpp @@ -323,7 +323,7 @@ void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) { NGLOG_DEBUG(Service_Audio, "called"); } -bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le Revision) { +bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le lowercase) { u32_be version_num = (Revision - 0x30564552); // Byte swap switch (feature) { case AudioFeatures::Splitter: