mirror of
https://git.suyu.dev/suyu/suyu
synced 2024-11-02 13:27:52 +00:00
Service/Audio: update audren:u service
This commit is contained in:
parent
c3e95086b6
commit
c06d6b27f3
2 changed files with 60 additions and 49 deletions
|
@ -57,27 +57,26 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
|
void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
|
||||||
NGLOG_DEBUG(Service_Audio, "{}", ctx.Description());
|
AudioRendererConfig config;
|
||||||
AudioRendererResponseData response_data{};
|
auto buf = ctx.ReadBuffer();
|
||||||
|
std::memcpy(&config, buf.data(), sizeof(AudioRendererConfig));
|
||||||
|
|
||||||
response_data.section_0_size =
|
AudioRendererResponse response_data{config};
|
||||||
static_cast<u32>(response_data.state_entries.size() * sizeof(AudioRendererStateEntry));
|
|
||||||
response_data.section_1_size = static_cast<u32>(response_data.section_1.size());
|
|
||||||
response_data.section_2_size = static_cast<u32>(response_data.section_2.size());
|
|
||||||
response_data.section_3_size = static_cast<u32>(response_data.section_3.size());
|
|
||||||
response_data.section_4_size = static_cast<u32>(response_data.section_4.size());
|
|
||||||
response_data.section_5_size = static_cast<u32>(response_data.section_5.size());
|
|
||||||
response_data.total_size = sizeof(AudioRendererResponseData);
|
|
||||||
|
|
||||||
for (unsigned i = 0; i < response_data.state_entries.size(); i++) {
|
ASSERT(ctx.GetWriteBufferSize() == response_data.total_size);
|
||||||
// 4 = Busy and 5 = Ready?
|
|
||||||
response_data.state_entries[i].state = 5;
|
std::vector<u8> output(response_data.total_size);
|
||||||
|
std::memcpy(output.data(), &response_data, sizeof(AudioRendererResponse));
|
||||||
|
std::vector<MemoryPoolEntry> memory_pool(config.memory_pools_size / 0x20);
|
||||||
|
for (auto& entry : memory_pool) {
|
||||||
|
entry.state = 5;
|
||||||
}
|
}
|
||||||
|
std::memcpy(output.data() + sizeof(AudioRendererResponse), memory_pool.data(),
|
||||||
|
response_data.memory_pools_size);
|
||||||
|
|
||||||
ctx.WriteBuffer(&response_data, response_data.total_size);
|
ctx.WriteBuffer(output);
|
||||||
|
|
||||||
IPC::ResponseBuilder rb{ctx, 2};
|
IPC::ResponseBuilder rb{ctx, 2};
|
||||||
|
|
||||||
rb.Push(RESULT_SUCCESS);
|
rb.Push(RESULT_SUCCESS);
|
||||||
|
|
||||||
NGLOG_WARNING(Service_Audio, "(STUBBED) called");
|
NGLOG_WARNING(Service_Audio, "(STUBBED) called");
|
||||||
|
@ -109,43 +108,55 @@ private:
|
||||||
NGLOG_WARNING(Service_Audio, "(STUBBED) called");
|
NGLOG_WARNING(Service_Audio, "(STUBBED) called");
|
||||||
}
|
}
|
||||||
|
|
||||||
struct AudioRendererStateEntry {
|
struct MemoryPoolEntry {
|
||||||
u32_le state;
|
u32_le state;
|
||||||
u32_le unknown_4;
|
u32_le unknown_4;
|
||||||
u32_le unknown_8;
|
u32_le unknown_8;
|
||||||
u32_le unknown_c;
|
u32_le unknown_c;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(AudioRendererStateEntry) == 0x10,
|
static_assert(sizeof(MemoryPoolEntry) == 0x10, "MemoryPoolEntry has wrong size");
|
||||||
"AudioRendererStateEntry has wrong size");
|
|
||||||
|
|
||||||
struct AudioRendererResponseData {
|
struct AudioRendererConfig {
|
||||||
u32_le unknown_0;
|
u32 revision;
|
||||||
u32_le section_5_size;
|
u32 behavior_size;
|
||||||
u32_le section_0_size;
|
u32 memory_pools_size;
|
||||||
u32_le section_1_size;
|
u32 voices_size;
|
||||||
u32_le unknown_10;
|
u32 voice_resource_size;
|
||||||
u32_le section_2_size;
|
u32 effects_size;
|
||||||
u32_le unknown_18;
|
u32 mixes_size;
|
||||||
u32_le section_3_size;
|
u32 sinks_size;
|
||||||
u32_le section_4_size;
|
u32 performance_buffer_size;
|
||||||
u32_le unknown_24;
|
INSERT_PADDING_WORDS(6);
|
||||||
u32_le unknown_28;
|
u32 total_size;
|
||||||
u32_le unknown_2c;
|
|
||||||
u32_le unknown_30;
|
|
||||||
u32_le unknown_34;
|
|
||||||
u32_le unknown_38;
|
|
||||||
u32_le total_size;
|
|
||||||
|
|
||||||
std::array<AudioRendererStateEntry, 0x18e> state_entries;
|
|
||||||
|
|
||||||
std::array<u8, 0x600> section_1;
|
|
||||||
std::array<u8, 0xe0> section_2;
|
|
||||||
std::array<u8, 0x20> section_3;
|
|
||||||
std::array<u8, 0x10> section_4;
|
|
||||||
std::array<u8, 0xb0> section_5;
|
|
||||||
};
|
};
|
||||||
static_assert(sizeof(AudioRendererResponseData) == 0x20e0,
|
static_assert(sizeof(AudioRendererConfig) == 0x40, "AudioRendererConfig has wrong size");
|
||||||
"AudioRendererResponseData has wrong size");
|
|
||||||
|
struct AudioRendererResponse {
|
||||||
|
AudioRendererResponse(const AudioRendererConfig& config) {
|
||||||
|
revision = config.revision;
|
||||||
|
error_info_size = 0xb0;
|
||||||
|
memory_pools_size = (config.memory_pools_size / 0x20) * 0x10;
|
||||||
|
voices_size = (config.voices_size / 0x170) * 0x10;
|
||||||
|
effects_size = (config.effects_size / 0xC0) * 0x10;
|
||||||
|
sinks_size = (config.sinks_size / 0x140) * 0x20;
|
||||||
|
performance_manager_size = 0x10;
|
||||||
|
total_size = sizeof(AudioRendererResponse) + error_info_size + memory_pools_size +
|
||||||
|
voices_size + effects_size + sinks_size + performance_manager_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
u32_le revision;
|
||||||
|
u32_le error_info_size;
|
||||||
|
u32_le memory_pools_size;
|
||||||
|
u32_le voices_size;
|
||||||
|
u32_le unknown_10;
|
||||||
|
u32_le effects_size;
|
||||||
|
u32_le unknown_18;
|
||||||
|
u32_le sinks_size;
|
||||||
|
u32_le performance_manager_size;
|
||||||
|
INSERT_PADDING_WORDS(6);
|
||||||
|
u32_le total_size;
|
||||||
|
};
|
||||||
|
static_assert(sizeof(AudioRendererResponse) == 0x40, "AudioRendererResponse has wrong size");
|
||||||
|
|
||||||
/// This is used to trigger the audio event callback.
|
/// This is used to trigger the audio event callback.
|
||||||
CoreTiming::EventType* audio_event;
|
CoreTiming::EventType* audio_event;
|
||||||
|
@ -258,7 +269,7 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
|
||||||
|
|
||||||
void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
|
void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
|
||||||
IPC::RequestParser rp{ctx};
|
IPC::RequestParser rp{ctx};
|
||||||
auto params = rp.PopRaw<WorkerBufferParameters>();
|
auto params = rp.PopRaw<AudioRendererParameters>();
|
||||||
|
|
||||||
u64 buffer_sz = Common::AlignUp(4 * params.unknown8, 0x40);
|
u64 buffer_sz = Common::AlignUp(4 * params.unknown8, 0x40);
|
||||||
buffer_sz += params.unknownC * 1024;
|
buffer_sz += params.unknownC * 1024;
|
||||||
|
|
|
@ -22,7 +22,7 @@ private:
|
||||||
void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
|
void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
|
||||||
void GetAudioDevice(Kernel::HLERequestContext& ctx);
|
void GetAudioDevice(Kernel::HLERequestContext& ctx);
|
||||||
|
|
||||||
struct WorkerBufferParameters {
|
struct AudioRendererParameters {
|
||||||
u32_le sample_rate;
|
u32_le sample_rate;
|
||||||
u32_le sample_count;
|
u32_le sample_count;
|
||||||
u32_le unknown8;
|
u32_le unknown8;
|
||||||
|
@ -38,8 +38,8 @@ private:
|
||||||
u8 padding2[4];
|
u8 padding2[4];
|
||||||
u32_le magic;
|
u32_le magic;
|
||||||
};
|
};
|
||||||
static_assert(sizeof(WorkerBufferParameters) == 52,
|
static_assert(sizeof(AudioRendererParameters) == 52,
|
||||||
"WorkerBufferParameters is an invalid size");
|
"AudioRendererParameters is an invalid size");
|
||||||
|
|
||||||
enum class AudioFeatures : u32 {
|
enum class AudioFeatures : u32 {
|
||||||
Splitter,
|
Splitter,
|
||||||
|
|
Loading…
Reference in a new issue