diff options
| author | 2018-06-21 22:40:37 -0400 | |
|---|---|---|
| committer | 2018-06-21 22:40:37 -0400 | |
| commit | b7162c32a444232d578d58521caf164e0d112ff8 (patch) | |
| tree | 22fab813ad69d2a72341ca2e8e4a823b6e89ae99 /src | |
| parent | Add support for decrypted NCA files (#567) (diff) | |
| parent | Service/Audio: update audren:u service (diff) | |
| download | yuzu-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.cpp | 103 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audren_u.h | 6 |
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 | ||
| 259 | void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) { | 270 | void 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, |