summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar bunnei2018-06-21 22:40:37 -0400
committerGravatar GitHub2018-06-21 22:40:37 -0400
commitb7162c32a444232d578d58521caf164e0d112ff8 (patch)
tree22fab813ad69d2a72341ca2e8e4a823b6e89ae99 /src
parentAdd support for decrypted NCA files (#567) (diff)
parentService/Audio: update audren:u service (diff)
downloadyuzu-b7162c32a444232d578d58521caf164e0d112ff8.tar.gz
yuzu-b7162c32a444232d578d58521caf164e0d112ff8.tar.xz
yuzu-b7162c32a444232d578d58521caf164e0d112ff8.zip
Merge pull request #577 from mailwl/audren-update
Service/Audio: update audren:u service
Diffstat (limited to 'src')
-rw-r--r--src/core/hle/service/audio/audren_u.cpp103
-rw-r--r--src/core/hle/service/audio/audren_u.h6
2 files changed, 60 insertions, 49 deletions
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index c7653f654..44b7ef216 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -57,27 +57,26 @@ private:
57 } 57 }
58 58
59 void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) { 59 void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
60 NGLOG_DEBUG(Service_Audio, "{}", ctx.Description()); 60 AudioRendererConfig config;
61 AudioRendererResponseData response_data{}; 61 auto buf = ctx.ReadBuffer();
62 62 std::memcpy(&config, buf.data(), sizeof(AudioRendererConfig));
63 response_data.section_0_size = 63
64 static_cast<u32>(response_data.state_entries.size() * sizeof(AudioRendererStateEntry)); 64 AudioRendererResponse response_data{config};
65 response_data.section_1_size = static_cast<u32>(response_data.section_1.size()); 65
66 response_data.section_2_size = static_cast<u32>(response_data.section_2.size()); 66 ASSERT(ctx.GetWriteBufferSize() == response_data.total_size);
67 response_data.section_3_size = static_cast<u32>(response_data.section_3.size()); 67
68 response_data.section_4_size = static_cast<u32>(response_data.section_4.size()); 68 std::vector<u8> output(response_data.total_size);
69 response_data.section_5_size = static_cast<u32>(response_data.section_5.size()); 69 std::memcpy(output.data(), &response_data, sizeof(AudioRendererResponse));
70 response_data.total_size = sizeof(AudioRendererResponseData); 70 std::vector<MemoryPoolEntry> memory_pool(config.memory_pools_size / 0x20);
71 71 for (auto& entry : memory_pool) {
72 for (unsigned i = 0; i < response_data.state_entries.size(); i++) { 72 entry.state = 5;
73 // 4 = Busy and 5 = Ready?
74 response_data.state_entries[i].state = 5;
75 } 73 }
74 std::memcpy(output.data() + sizeof(AudioRendererResponse), memory_pool.data(),
75 response_data.memory_pools_size);
76 76
77 ctx.WriteBuffer(&response_data, response_data.total_size); 77 ctx.WriteBuffer(output);
78 78
79 IPC::ResponseBuilder rb{ctx, 2}; 79 IPC::ResponseBuilder rb{ctx, 2};
80
81 rb.Push(RESULT_SUCCESS); 80 rb.Push(RESULT_SUCCESS);
82 81
83 NGLOG_WARNING(Service_Audio, "(STUBBED) called"); 82 NGLOG_WARNING(Service_Audio, "(STUBBED) called");
@@ -109,43 +108,55 @@ private:
109 NGLOG_WARNING(Service_Audio, "(STUBBED) called"); 108 NGLOG_WARNING(Service_Audio, "(STUBBED) called");
110 } 109 }
111 110
112 struct AudioRendererStateEntry { 111 struct MemoryPoolEntry {
113 u32_le state; 112 u32_le state;
114 u32_le unknown_4; 113 u32_le unknown_4;
115 u32_le unknown_8; 114 u32_le unknown_8;
116 u32_le unknown_c; 115 u32_le unknown_c;
117 }; 116 };
118 static_assert(sizeof(AudioRendererStateEntry) == 0x10, 117 static_assert(sizeof(MemoryPoolEntry) == 0x10, "MemoryPoolEntry has wrong size");
119 "AudioRendererStateEntry has wrong size"); 118
120 119 struct AudioRendererConfig {
121 struct AudioRendererResponseData { 120 u32 revision;
122 u32_le unknown_0; 121 u32 behavior_size;
123 u32_le section_5_size; 122 u32 memory_pools_size;
124 u32_le section_0_size; 123 u32 voices_size;
125 u32_le section_1_size; 124 u32 voice_resource_size;
125 u32 effects_size;
126 u32 mixes_size;
127 u32 sinks_size;
128 u32 performance_buffer_size;
129 INSERT_PADDING_WORDS(6);
130 u32 total_size;
131 };
132 static_assert(sizeof(AudioRendererConfig) == 0x40, "AudioRendererConfig has wrong size");
133
134 struct AudioRendererResponse {
135 AudioRendererResponse(const AudioRendererConfig& config) {
136 revision = config.revision;
137 error_info_size = 0xb0;
138 memory_pools_size = (config.memory_pools_size / 0x20) * 0x10;
139 voices_size = (config.voices_size / 0x170) * 0x10;
140 effects_size = (config.effects_size / 0xC0) * 0x10;
141 sinks_size = (config.sinks_size / 0x140) * 0x20;
142 performance_manager_size = 0x10;
143 total_size = sizeof(AudioRendererResponse) + error_info_size + memory_pools_size +
144 voices_size + effects_size + sinks_size + performance_manager_size;
145 }
146
147 u32_le revision;
148 u32_le error_info_size;
149 u32_le memory_pools_size;
150 u32_le voices_size;
126 u32_le unknown_10; 151 u32_le unknown_10;
127 u32_le section_2_size; 152 u32_le effects_size;
128 u32_le unknown_18; 153 u32_le unknown_18;
129 u32_le section_3_size; 154 u32_le sinks_size;
130 u32_le section_4_size; 155 u32_le performance_manager_size;
131 u32_le unknown_24; 156 INSERT_PADDING_WORDS(6);
132 u32_le unknown_28;
133 u32_le unknown_2c;
134 u32_le unknown_30;
135 u32_le unknown_34;
136 u32_le unknown_38;
137 u32_le total_size; 157 u32_le total_size;
138
139 std::array<AudioRendererStateEntry, 0x18e> state_entries;
140
141 std::array<u8, 0x600> section_1;
142 std::array<u8, 0xe0> section_2;
143 std::array<u8, 0x20> section_3;
144 std::array<u8, 0x10> section_4;
145 std::array<u8, 0xb0> section_5;
146 }; 158 };
147 static_assert(sizeof(AudioRendererResponseData) == 0x20e0, 159 static_assert(sizeof(AudioRendererResponse) == 0x40, "AudioRendererResponse has wrong size");
148 "AudioRendererResponseData has wrong size");
149 160
150 /// This is used to trigger the audio event callback. 161 /// This is used to trigger the audio event callback.
151 CoreTiming::EventType* audio_event; 162 CoreTiming::EventType* audio_event;
@@ -258,7 +269,7 @@ void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
258 269
259void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { 270void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
260 IPC::RequestParser rp{ctx}; 271 IPC::RequestParser rp{ctx};
261 auto params = rp.PopRaw<WorkerBufferParameters>(); 272 auto params = rp.PopRaw<AudioRendererParameters>();
262 273
263 u64 buffer_sz = Common::AlignUp(4 * params.unknown8, 0x40); 274 u64 buffer_sz = Common::AlignUp(4 * params.unknown8, 0x40);
264 buffer_sz += params.unknownC * 1024; 275 buffer_sz += params.unknownC * 1024;
diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h
index fe53de4ce..7dbd9b74d 100644
--- a/src/core/hle/service/audio/audren_u.h
+++ b/src/core/hle/service/audio/audren_u.h
@@ -22,7 +22,7 @@ private:
22 void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); 22 void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
23 void GetAudioDevice(Kernel::HLERequestContext& ctx); 23 void GetAudioDevice(Kernel::HLERequestContext& ctx);
24 24
25 struct WorkerBufferParameters { 25 struct AudioRendererParameters {
26 u32_le sample_rate; 26 u32_le sample_rate;
27 u32_le sample_count; 27 u32_le sample_count;
28 u32_le unknown8; 28 u32_le unknown8;
@@ -38,8 +38,8 @@ private:
38 u8 padding2[4]; 38 u8 padding2[4];
39 u32_le magic; 39 u32_le magic;
40 }; 40 };
41 static_assert(sizeof(WorkerBufferParameters) == 52, 41 static_assert(sizeof(AudioRendererParameters) == 52,
42 "WorkerBufferParameters is an invalid size"); 42 "AudioRendererParameters is an invalid size");
43 43
44 enum class AudioFeatures : u32 { 44 enum class AudioFeatures : u32 {
45 Splitter, 45 Splitter,