Compare commits

...

5 Commits

Author SHA1 Message Date
NekokoTime
e49d11b599 Merge 4879fa0a94 into 55e6296e71 2018-05-24 18:27:13 +00:00
NekokoTime
4879fa0a94 GetAudioRendererWorkBufferSize impl #465
Impl of GetAudioRendererWorkBufferSize based on RE, if this can be cleaned up, please contribute!
2018-05-24 15:26:12 -03:00
David Marcec
60807c3a50 Removed unneeded placeholder 2018-05-24 01:47:11 -07:00
David Marcec
b4f6ae4ae4 Naming conventions 2018-05-24 01:45:46 -07:00
David Marcec
4db3e788ee GetAudioRendererWorkBufferSize impl
Impl of GetAudioRendererWorkBufferSize based on RE, if this can be cleaned up, please contribute!
2018-05-24 01:40:04 -07:00
2 changed files with 87 additions and 2 deletions

View File

@@ -256,12 +256,62 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
}
void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx};
auto params = rp.PopRaw<WorkerBufferParameters>();
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 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 {
edge_matrix_buffer_sz = node_count / 8;
}
buffer_sz += (node_state_buffer_sz + edge_matrix_buffer_sz + 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.sink_count;
u64 output_sz = buffer_sz + 0x280 * params.sink_count + 0x4B0 * params.effect_count +
((params.voice_count * 256) | 0x40);
if (params.unknown1c >= 1) {
output_sz =
((((16 * params.sink_count + 16 * params.effect_count + 16 * params.voice_count + 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<u64>(0x4000);
rb.Push<u64>(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 +323,14 @@ void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) {
NGLOG_DEBUG(Service_Audio, "called");
}
bool AudRenU::IsFeatureSupported(AudioFeatures feature, u32_le lowercase) {
u32_be version_num = (Revision - 0x30564552); // Byte swap
switch (feature) {
case AudioFeatures::Splitter:
return version_num >= 2;
default:
return false;
}
}
} // namespace Service::Audio

View File

@@ -21,6 +21,31 @@ private:
void OpenAudioRenderer(Kernel::HLERequestContext& ctx);
void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
void GetAudioDevice(Kernel::HLERequestContext& ctx);
struct WorkerBufferParameters {
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 splitter_count;
u32_le unknown2c;
u8 padding2[4];
u32_le magic;
};
static_assert(sizeof(WorkerBufferParameters) == 52,
"WorkerBufferParameters is an invalid size");
enum class AudioFeatures : u32 {
Splitter,
};
bool IsFeatureSupported(AudioFeatures feature, u32_le Revision);
};
} // namespace Service::Audio