Merge 4879fa0a94 into 55e6296e71
This commit is contained in:
@@ -256,12 +256,62 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void AudRenU::GetAudioRendererWorkBufferSize(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};
|
IPC::ResponseBuilder rb{ctx, 4};
|
||||||
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
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) {
|
void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) {
|
||||||
@@ -273,4 +323,14 @@ void AudRenU::GetAudioDevice(Kernel::HLERequestContext& ctx) {
|
|||||||
NGLOG_DEBUG(Service_Audio, "called");
|
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
|
} // namespace Service::Audio
|
||||||
|
|||||||
@@ -21,6 +21,31 @@ private:
|
|||||||
void OpenAudioRenderer(Kernel::HLERequestContext& ctx);
|
void OpenAudioRenderer(Kernel::HLERequestContext& ctx);
|
||||||
void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
|
void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
|
||||||
void GetAudioDevice(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
|
} // namespace Service::Audio
|
||||||
|
|||||||
Reference in New Issue
Block a user