summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/core/CMakeLists.txt6
-rw-r--r--src/core/hle/service/audio/audio.cpp5
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.cpp265
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.h38
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.cpp243
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.h (renamed from src/core/hle/service/audio/hwopus.h)6
-rw-r--r--src/core/hle/service/audio/hwopus.cpp502
7 files changed, 556 insertions, 509 deletions
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index 5a1fc83bd..c49560789 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -512,8 +512,10 @@ add_library(core STATIC
512 hle/service/audio/final_output_recorder_manager_for_applet.h 512 hle/service/audio/final_output_recorder_manager_for_applet.h
513 hle/service/audio/final_output_recorder_manager.cpp 513 hle/service/audio/final_output_recorder_manager.cpp
514 hle/service/audio/final_output_recorder_manager.h 514 hle/service/audio/final_output_recorder_manager.h
515 hle/service/audio/hwopus.cpp 515 hle/service/audio/hardware_opus_decoder_manager.cpp
516 hle/service/audio/hwopus.h 516 hle/service/audio/hardware_opus_decoder_manager.h
517 hle/service/audio/hardware_opus_decoder.cpp
518 hle/service/audio/hardware_opus_decoder.h
517 hle/service/bcat/backend/backend.cpp 519 hle/service/bcat/backend/backend.cpp
518 hle/service/bcat/backend/backend.h 520 hle/service/bcat/backend/backend.h
519 hle/service/bcat/bcat.cpp 521 hle/service/bcat/bcat.cpp
diff --git a/src/core/hle/service/audio/audio.cpp b/src/core/hle/service/audio/audio.cpp
index 82a2ae283..331176bf7 100644
--- a/src/core/hle/service/audio/audio.cpp
+++ b/src/core/hle/service/audio/audio.cpp
@@ -9,7 +9,7 @@
9#include "core/hle/service/audio/audio_renderer_manager.h" 9#include "core/hle/service/audio/audio_renderer_manager.h"
10#include "core/hle/service/audio/final_output_recorder_manager.h" 10#include "core/hle/service/audio/final_output_recorder_manager.h"
11#include "core/hle/service/audio/final_output_recorder_manager_for_applet.h" 11#include "core/hle/service/audio/final_output_recorder_manager_for_applet.h"
12#include "core/hle/service/audio/hwopus.h" 12#include "core/hle/service/audio/hardware_opus_decoder_manager.h"
13#include "core/hle/service/server_manager.h" 13#include "core/hle/service/server_manager.h"
14#include "core/hle/service/service.h" 14#include "core/hle/service/service.h"
15 15
@@ -27,7 +27,8 @@ void LoopProcess(Core::System& system) {
27 std::make_shared<IFinalOutputRecorderManager>(system)); 27 std::make_shared<IFinalOutputRecorderManager>(system));
28 server_manager->RegisterNamedService("audren:u", 28 server_manager->RegisterNamedService("audren:u",
29 std::make_shared<IAudioRendererManager>(system)); 29 std::make_shared<IAudioRendererManager>(system));
30 server_manager->RegisterNamedService("hwopus", std::make_shared<HwOpus>(system)); 30 server_manager->RegisterNamedService("hwopus",
31 std::make_shared<IHardwareOpusDecoderManager>(system));
31 ServerManager::RunServer(std::move(server_manager)); 32 ServerManager::RunServer(std::move(server_manager));
32} 33}
33 34
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp
new file mode 100644
index 000000000..876bfe334
--- /dev/null
+++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp
@@ -0,0 +1,265 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/audio/hardware_opus_decoder.h"
5#include "core/hle/service/ipc_helpers.h"
6
7namespace Service::Audio {
8
9using namespace AudioCore::OpusDecoder;
10
11IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus)
12 : ServiceFramework{system_, "IHardwareOpusDecoder"},
13 impl{std::make_unique<AudioCore::OpusDecoder::OpusDecoder>(system_, hardware_opus)} {
14 // clang-format off
15 static const FunctionInfo functions[] = {
16 {0, &IHardwareOpusDecoder::DecodeInterleavedOld, "DecodeInterleavedOld"},
17 {1, &IHardwareOpusDecoder::SetContext, "SetContext"},
18 {2, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld, "DecodeInterleavedForMultiStreamOld"},
19 {3, &IHardwareOpusDecoder::SetContextForMultiStream, "SetContextForMultiStream"},
20 {4, &IHardwareOpusDecoder::DecodeInterleavedWithPerfOld, "DecodeInterleavedWithPerfOld"},
21 {5, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld, "DecodeInterleavedForMultiStreamWithPerfOld"},
22 {6, &IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld, "DecodeInterleavedWithPerfAndResetOld"},
23 {7, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
24 {8, &IHardwareOpusDecoder::DecodeInterleaved, "DecodeInterleaved"},
25 {9, &IHardwareOpusDecoder::DecodeInterleavedForMultiStream, "DecodeInterleavedForMultiStream"},
26 };
27 // clang-format on
28
29 RegisterHandlers(functions);
30}
31
32IHardwareOpusDecoder::~IHardwareOpusDecoder() = default;
33
34Result IHardwareOpusDecoder::Initialize(OpusParametersEx& params,
35 Kernel::KTransferMemory* transfer_memory,
36 u64 transfer_memory_size) {
37 return impl->Initialize(params, transfer_memory, transfer_memory_size);
38}
39
40Result IHardwareOpusDecoder::Initialize(OpusMultiStreamParametersEx& params,
41 Kernel::KTransferMemory* transfer_memory,
42 u64 transfer_memory_size) {
43 return impl->Initialize(params, transfer_memory, transfer_memory_size);
44}
45
46void IHardwareOpusDecoder::DecodeInterleavedOld(HLERequestContext& ctx) {
47 IPC::RequestParser rp{ctx};
48
49 auto input_data{ctx.ReadBuffer(0)};
50 output_data.resize_destructive(ctx.GetWriteBufferSize());
51
52 u32 size{};
53 u32 sample_count{};
54 auto result =
55 impl->DecodeInterleaved(&size, nullptr, &sample_count, input_data, output_data, false);
56
57 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {}", size, sample_count);
58
59 ctx.WriteBuffer(output_data);
60
61 IPC::ResponseBuilder rb{ctx, 4};
62 rb.Push(result);
63 rb.Push(size);
64 rb.Push(sample_count);
65}
66
67void IHardwareOpusDecoder::SetContext(HLERequestContext& ctx) {
68 IPC::RequestParser rp{ctx};
69
70 LOG_DEBUG(Service_Audio, "called");
71
72 auto input_data{ctx.ReadBuffer(0)};
73 auto result = impl->SetContext(input_data);
74
75 IPC::ResponseBuilder rb{ctx, 2};
76 rb.Push(result);
77}
78
79void IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld(HLERequestContext& ctx) {
80 IPC::RequestParser rp{ctx};
81
82 auto input_data{ctx.ReadBuffer(0)};
83 output_data.resize_destructive(ctx.GetWriteBufferSize());
84
85 u32 size{};
86 u32 sample_count{};
87 auto result = impl->DecodeInterleavedForMultiStream(&size, nullptr, &sample_count, input_data,
88 output_data, false);
89
90 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {}", size, sample_count);
91
92 ctx.WriteBuffer(output_data);
93
94 IPC::ResponseBuilder rb{ctx, 4};
95 rb.Push(result);
96 rb.Push(size);
97 rb.Push(sample_count);
98}
99
100void IHardwareOpusDecoder::SetContextForMultiStream(HLERequestContext& ctx) {
101 IPC::RequestParser rp{ctx};
102
103 LOG_DEBUG(Service_Audio, "called");
104
105 auto input_data{ctx.ReadBuffer(0)};
106 auto result = impl->SetContext(input_data);
107
108 IPC::ResponseBuilder rb{ctx, 2};
109 rb.Push(result);
110}
111
112void IHardwareOpusDecoder::DecodeInterleavedWithPerfOld(HLERequestContext& ctx) {
113 IPC::RequestParser rp{ctx};
114
115 auto input_data{ctx.ReadBuffer(0)};
116 output_data.resize_destructive(ctx.GetWriteBufferSize());
117
118 u32 size{};
119 u32 sample_count{};
120 u64 time_taken{};
121 auto result =
122 impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data, output_data, false);
123
124 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {} time taken {}", size,
125 sample_count, time_taken);
126
127 ctx.WriteBuffer(output_data);
128
129 IPC::ResponseBuilder rb{ctx, 6};
130 rb.Push(result);
131 rb.Push(size);
132 rb.Push(sample_count);
133 rb.Push(time_taken);
134}
135
136void IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld(HLERequestContext& ctx) {
137 IPC::RequestParser rp{ctx};
138
139 auto input_data{ctx.ReadBuffer(0)};
140 output_data.resize_destructive(ctx.GetWriteBufferSize());
141
142 u32 size{};
143 u32 sample_count{};
144 u64 time_taken{};
145 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
146 input_data, output_data, false);
147
148 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {} time taken {}", size,
149 sample_count, time_taken);
150
151 ctx.WriteBuffer(output_data);
152
153 IPC::ResponseBuilder rb{ctx, 6};
154 rb.Push(result);
155 rb.Push(size);
156 rb.Push(sample_count);
157 rb.Push(time_taken);
158}
159
160void IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld(HLERequestContext& ctx) {
161 IPC::RequestParser rp{ctx};
162
163 auto reset{rp.Pop<bool>()};
164
165 auto input_data{ctx.ReadBuffer(0)};
166 output_data.resize_destructive(ctx.GetWriteBufferSize());
167
168 u32 size{};
169 u32 sample_count{};
170 u64 time_taken{};
171 auto result =
172 impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data, output_data, reset);
173
174 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}", reset,
175 size, sample_count, time_taken);
176
177 ctx.WriteBuffer(output_data);
178
179 IPC::ResponseBuilder rb{ctx, 6};
180 rb.Push(result);
181 rb.Push(size);
182 rb.Push(sample_count);
183 rb.Push(time_taken);
184}
185
186void IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld(
187 HLERequestContext& ctx) {
188 IPC::RequestParser rp{ctx};
189
190 auto reset{rp.Pop<bool>()};
191
192 auto input_data{ctx.ReadBuffer(0)};
193 output_data.resize_destructive(ctx.GetWriteBufferSize());
194
195 u32 size{};
196 u32 sample_count{};
197 u64 time_taken{};
198 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
199 input_data, output_data, reset);
200
201 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}", reset,
202 size, sample_count, time_taken);
203
204 ctx.WriteBuffer(output_data);
205
206 IPC::ResponseBuilder rb{ctx, 6};
207 rb.Push(result);
208 rb.Push(size);
209 rb.Push(sample_count);
210 rb.Push(time_taken);
211}
212
213void IHardwareOpusDecoder::DecodeInterleaved(HLERequestContext& ctx) {
214 IPC::RequestParser rp{ctx};
215
216 auto reset{rp.Pop<bool>()};
217
218 auto input_data{ctx.ReadBuffer(0)};
219 output_data.resize_destructive(ctx.GetWriteBufferSize());
220
221 u32 size{};
222 u32 sample_count{};
223 u64 time_taken{};
224 auto result =
225 impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data, output_data, reset);
226
227 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}", reset,
228 size, sample_count, time_taken);
229
230 ctx.WriteBuffer(output_data);
231
232 IPC::ResponseBuilder rb{ctx, 6};
233 rb.Push(result);
234 rb.Push(size);
235 rb.Push(sample_count);
236 rb.Push(time_taken);
237}
238
239void IHardwareOpusDecoder::DecodeInterleavedForMultiStream(HLERequestContext& ctx) {
240 IPC::RequestParser rp{ctx};
241
242 auto reset{rp.Pop<bool>()};
243
244 auto input_data{ctx.ReadBuffer(0)};
245 output_data.resize_destructive(ctx.GetWriteBufferSize());
246
247 u32 size{};
248 u32 sample_count{};
249 u64 time_taken{};
250 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
251 input_data, output_data, reset);
252
253 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}", reset,
254 size, sample_count, time_taken);
255
256 ctx.WriteBuffer(output_data);
257
258 IPC::ResponseBuilder rb{ctx, 6};
259 rb.Push(result);
260 rb.Push(size);
261 rb.Push(sample_count);
262 rb.Push(time_taken);
263}
264
265} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h
new file mode 100644
index 000000000..fe6636ce6
--- /dev/null
+++ b/src/core/hle/service/audio/hardware_opus_decoder.h
@@ -0,0 +1,38 @@
1// SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include "audio_core/opus/decoder.h"
7#include "core/hle/service/service.h"
8
9namespace Service::Audio {
10
11class IHardwareOpusDecoder final : public ServiceFramework<IHardwareOpusDecoder> {
12public:
13 explicit IHardwareOpusDecoder(Core::System& system_,
14 AudioCore::OpusDecoder::HardwareOpus& hardware_opus);
15 ~IHardwareOpusDecoder() override;
16
17 Result Initialize(AudioCore::OpusDecoder::OpusParametersEx& params,
18 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
19 Result Initialize(AudioCore::OpusDecoder::OpusMultiStreamParametersEx& params,
20 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
21
22private:
23 void DecodeInterleavedOld(HLERequestContext& ctx);
24 void SetContext(HLERequestContext& ctx);
25 void DecodeInterleavedForMultiStreamOld(HLERequestContext& ctx);
26 void SetContextForMultiStream(HLERequestContext& ctx);
27 void DecodeInterleavedWithPerfOld(HLERequestContext& ctx);
28 void DecodeInterleavedForMultiStreamWithPerfOld(HLERequestContext& ctx);
29 void DecodeInterleavedWithPerfAndResetOld(HLERequestContext& ctx);
30 void DecodeInterleavedForMultiStreamWithPerfAndResetOld(HLERequestContext& ctx);
31 void DecodeInterleaved(HLERequestContext& ctx);
32 void DecodeInterleavedForMultiStream(HLERequestContext& ctx);
33
34 std::unique_ptr<AudioCore::OpusDecoder::OpusDecoder> impl;
35 Common::ScratchBuffer<u8> output_data;
36};
37
38} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
new file mode 100644
index 000000000..6d7205cd2
--- /dev/null
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
@@ -0,0 +1,243 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include "core/hle/service/audio/hardware_opus_decoder.h"
5#include "core/hle/service/audio/hardware_opus_decoder_manager.h"
6#include "core/hle/service/ipc_helpers.h"
7
8namespace Service::Audio {
9
10using namespace AudioCore::OpusDecoder;
11
12void IHardwareOpusDecoderManager::OpenHardwareOpusDecoder(HLERequestContext& ctx) {
13 IPC::RequestParser rp{ctx};
14
15 auto params = rp.PopRaw<OpusParameters>();
16 auto transfer_memory_size{rp.Pop<u32>()};
17 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
18 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
19
20 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
21 params.sample_rate, params.channel_count, transfer_memory_size);
22
23 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
24
25 OpusParametersEx ex{
26 .sample_rate = params.sample_rate,
27 .channel_count = params.channel_count,
28 .use_large_frame_size = false,
29 };
30 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
31
32 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
33 rb.Push(result);
34 rb.PushIpcInterface(decoder);
35}
36
37void IHardwareOpusDecoderManager::GetWorkBufferSize(HLERequestContext& ctx) {
38 IPC::RequestParser rp{ctx};
39 auto params = rp.PopRaw<OpusParameters>();
40
41 u64 size{};
42 auto result = impl.GetWorkBufferSize(params, size);
43
44 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} -- returned size 0x{:X}",
45 params.sample_rate, params.channel_count, size);
46
47 IPC::ResponseBuilder rb{ctx, 4};
48 rb.Push(result);
49 rb.Push(size);
50}
51
52void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx) {
53 IPC::RequestParser rp{ctx};
54
55 auto input{ctx.ReadBuffer()};
56 OpusMultiStreamParameters params;
57 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParameters));
58
59 auto transfer_memory_size{rp.Pop<u32>()};
60 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
61 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
62
63 LOG_DEBUG(Service_Audio,
64 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
65 "transfer_memory_size 0x{:X}",
66 params.sample_rate, params.channel_count, params.total_stream_count,
67 params.stereo_stream_count, transfer_memory_size);
68
69 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
70
71 OpusMultiStreamParametersEx ex{
72 .sample_rate = params.sample_rate,
73 .channel_count = params.channel_count,
74 .total_stream_count = params.total_stream_count,
75 .stereo_stream_count = params.stereo_stream_count,
76 .use_large_frame_size = false,
77 .mappings{},
78 };
79 std::memcpy(ex.mappings.data(), params.mappings.data(), sizeof(params.mappings));
80 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
81
82 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
83 rb.Push(result);
84 rb.PushIpcInterface(decoder);
85}
86
87void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream(HLERequestContext& ctx) {
88 IPC::RequestParser rp{ctx};
89
90 auto input{ctx.ReadBuffer()};
91 OpusMultiStreamParameters params;
92 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParameters));
93
94 u64 size{};
95 auto result = impl.GetWorkBufferSizeForMultiStream(params, size);
96
97 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
98
99 IPC::ResponseBuilder rb{ctx, 4};
100 rb.Push(result);
101 rb.Push(size);
102}
103
104void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx(HLERequestContext& ctx) {
105 IPC::RequestParser rp{ctx};
106
107 auto params = rp.PopRaw<OpusParametersEx>();
108 auto transfer_memory_size{rp.Pop<u32>()};
109 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
110 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
111
112 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
113 params.sample_rate, params.channel_count, transfer_memory_size);
114
115 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
116
117 auto result =
118 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
119
120 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
121 rb.Push(result);
122 rb.PushIpcInterface(decoder);
123}
124
125void IHardwareOpusDecoderManager::GetWorkBufferSizeEx(HLERequestContext& ctx) {
126 IPC::RequestParser rp{ctx};
127 auto params = rp.PopRaw<OpusParametersEx>();
128
129 u64 size{};
130 auto result = impl.GetWorkBufferSizeEx(params, size);
131
132 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
133
134 IPC::ResponseBuilder rb{ctx, 4};
135 rb.Push(result);
136 rb.Push(size);
137}
138
139void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx) {
140 IPC::RequestParser rp{ctx};
141
142 auto input{ctx.ReadBuffer()};
143 OpusMultiStreamParametersEx params;
144 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
145
146 auto transfer_memory_size{rp.Pop<u32>()};
147 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
148 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
149
150 LOG_DEBUG(Service_Audio,
151 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
152 "use_large_frame_size {}"
153 "transfer_memory_size 0x{:X}",
154 params.sample_rate, params.channel_count, params.total_stream_count,
155 params.stereo_stream_count, params.use_large_frame_size, transfer_memory_size);
156
157 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
158
159 auto result =
160 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
161
162 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
163 rb.Push(result);
164 rb.PushIpcInterface(decoder);
165}
166
167void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx) {
168 IPC::RequestParser rp{ctx};
169
170 auto input{ctx.ReadBuffer()};
171 OpusMultiStreamParametersEx params;
172 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
173
174 u64 size{};
175 auto result = impl.GetWorkBufferSizeForMultiStreamEx(params, size);
176
177 LOG_DEBUG(Service_Audio,
178 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
179 "use_large_frame_size {} -- returned size 0x{:X}",
180 params.sample_rate, params.channel_count, params.total_stream_count,
181 params.stereo_stream_count, params.use_large_frame_size, size);
182
183 IPC::ResponseBuilder rb{ctx, 4};
184 rb.Push(result);
185 rb.Push(size);
186}
187
188void IHardwareOpusDecoderManager::GetWorkBufferSizeExEx(HLERequestContext& ctx) {
189 IPC::RequestParser rp{ctx};
190 auto params = rp.PopRaw<OpusParametersEx>();
191
192 u64 size{};
193 auto result = impl.GetWorkBufferSizeExEx(params, size);
194
195 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
196
197 IPC::ResponseBuilder rb{ctx, 4};
198 rb.Push(result);
199 rb.Push(size);
200}
201
202void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx) {
203 IPC::RequestParser rp{ctx};
204
205 auto input{ctx.ReadBuffer()};
206 OpusMultiStreamParametersEx params;
207 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
208
209 u64 size{};
210 auto result = impl.GetWorkBufferSizeForMultiStreamExEx(params, size);
211
212 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
213
214 IPC::ResponseBuilder rb{ctx, 4};
215 rb.Push(result);
216 rb.Push(size);
217}
218
219IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
220 : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
221 static const FunctionInfo functions[] = {
222 {0, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoder, "OpenHardwareOpusDecoder"},
223 {1, &IHardwareOpusDecoderManager::GetWorkBufferSize, "GetWorkBufferSize"},
224 {2, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream,
225 "OpenOpusDecoderForMultiStream"},
226 {3, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream,
227 "GetWorkBufferSizeForMultiStream"},
228 {4, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx, "OpenHardwareOpusDecoderEx"},
229 {5, &IHardwareOpusDecoderManager::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"},
230 {6, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx,
231 "OpenHardwareOpusDecoderForMultiStreamEx"},
232 {7, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx,
233 "GetWorkBufferSizeForMultiStreamEx"},
234 {8, &IHardwareOpusDecoderManager::GetWorkBufferSizeExEx, "GetWorkBufferSizeExEx"},
235 {9, &IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx,
236 "GetWorkBufferSizeForMultiStreamExEx"},
237 };
238 RegisterHandlers(functions);
239}
240
241IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
242
243} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hwopus.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
index d3960065e..29b1f16f5 100644
--- a/src/core/hle/service/audio/hwopus.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
@@ -12,10 +12,10 @@ class System;
12 12
13namespace Service::Audio { 13namespace Service::Audio {
14 14
15class HwOpus final : public ServiceFramework<HwOpus> { 15class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> {
16public: 16public:
17 explicit HwOpus(Core::System& system_); 17 explicit IHardwareOpusDecoderManager(Core::System& system_);
18 ~HwOpus() override; 18 ~IHardwareOpusDecoderManager() override;
19 19
20private: 20private:
21 void OpenHardwareOpusDecoder(HLERequestContext& ctx); 21 void OpenHardwareOpusDecoder(HLERequestContext& ctx);
diff --git a/src/core/hle/service/audio/hwopus.cpp b/src/core/hle/service/audio/hwopus.cpp
deleted file mode 100644
index 91f33aabd..000000000
--- a/src/core/hle/service/audio/hwopus.cpp
+++ /dev/null
@@ -1,502 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#include <memory>
5#include <vector>
6
7#include "audio_core/opus/decoder.h"
8#include "audio_core/opus/parameters.h"
9#include "common/assert.h"
10#include "common/logging/log.h"
11#include "common/scratch_buffer.h"
12#include "core/core.h"
13#include "core/hle/service/audio/hwopus.h"
14#include "core/hle/service/ipc_helpers.h"
15
16namespace Service::Audio {
17using namespace AudioCore::OpusDecoder;
18
19class IHardwareOpusDecoder final : public ServiceFramework<IHardwareOpusDecoder> {
20public:
21 explicit IHardwareOpusDecoder(Core::System& system_, HardwareOpus& hardware_opus)
22 : ServiceFramework{system_, "IHardwareOpusDecoder"},
23 impl{std::make_unique<AudioCore::OpusDecoder::OpusDecoder>(system_, hardware_opus)} {
24 // clang-format off
25 static const FunctionInfo functions[] = {
26 {0, &IHardwareOpusDecoder::DecodeInterleavedOld, "DecodeInterleavedOld"},
27 {1, &IHardwareOpusDecoder::SetContext, "SetContext"},
28 {2, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamOld, "DecodeInterleavedForMultiStreamOld"},
29 {3, &IHardwareOpusDecoder::SetContextForMultiStream, "SetContextForMultiStream"},
30 {4, &IHardwareOpusDecoder::DecodeInterleavedWithPerfOld, "DecodeInterleavedWithPerfOld"},
31 {5, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfOld, "DecodeInterleavedForMultiStreamWithPerfOld"},
32 {6, &IHardwareOpusDecoder::DecodeInterleavedWithPerfAndResetOld, "DecodeInterleavedWithPerfAndResetOld"},
33 {7, &IHardwareOpusDecoder::DecodeInterleavedForMultiStreamWithPerfAndResetOld, "DecodeInterleavedForMultiStreamWithPerfAndResetOld"},
34 {8, &IHardwareOpusDecoder::DecodeInterleaved, "DecodeInterleaved"},
35 {9, &IHardwareOpusDecoder::DecodeInterleavedForMultiStream, "DecodeInterleavedForMultiStream"},
36 };
37 // clang-format on
38
39 RegisterHandlers(functions);
40 }
41
42 Result Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory,
43 u64 transfer_memory_size) {
44 return impl->Initialize(params, transfer_memory, transfer_memory_size);
45 }
46
47 Result Initialize(OpusMultiStreamParametersEx& params, Kernel::KTransferMemory* transfer_memory,
48 u64 transfer_memory_size) {
49 return impl->Initialize(params, transfer_memory, transfer_memory_size);
50 }
51
52private:
53 void DecodeInterleavedOld(HLERequestContext& ctx) {
54 IPC::RequestParser rp{ctx};
55
56 auto input_data{ctx.ReadBuffer(0)};
57 output_data.resize_destructive(ctx.GetWriteBufferSize());
58
59 u32 size{};
60 u32 sample_count{};
61 auto result =
62 impl->DecodeInterleaved(&size, nullptr, &sample_count, input_data, output_data, false);
63
64 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {}", size, sample_count);
65
66 ctx.WriteBuffer(output_data);
67
68 IPC::ResponseBuilder rb{ctx, 4};
69 rb.Push(result);
70 rb.Push(size);
71 rb.Push(sample_count);
72 }
73
74 void SetContext(HLERequestContext& ctx) {
75 IPC::RequestParser rp{ctx};
76
77 LOG_DEBUG(Service_Audio, "called");
78
79 auto input_data{ctx.ReadBuffer(0)};
80 auto result = impl->SetContext(input_data);
81
82 IPC::ResponseBuilder rb{ctx, 2};
83 rb.Push(result);
84 }
85
86 void DecodeInterleavedForMultiStreamOld(HLERequestContext& ctx) {
87 IPC::RequestParser rp{ctx};
88
89 auto input_data{ctx.ReadBuffer(0)};
90 output_data.resize_destructive(ctx.GetWriteBufferSize());
91
92 u32 size{};
93 u32 sample_count{};
94 auto result = impl->DecodeInterleavedForMultiStream(&size, nullptr, &sample_count,
95 input_data, output_data, false);
96
97 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {}", size, sample_count);
98
99 ctx.WriteBuffer(output_data);
100
101 IPC::ResponseBuilder rb{ctx, 4};
102 rb.Push(result);
103 rb.Push(size);
104 rb.Push(sample_count);
105 }
106
107 void SetContextForMultiStream(HLERequestContext& ctx) {
108 IPC::RequestParser rp{ctx};
109
110 LOG_DEBUG(Service_Audio, "called");
111
112 auto input_data{ctx.ReadBuffer(0)};
113 auto result = impl->SetContext(input_data);
114
115 IPC::ResponseBuilder rb{ctx, 2};
116 rb.Push(result);
117 }
118
119 void DecodeInterleavedWithPerfOld(HLERequestContext& ctx) {
120 IPC::RequestParser rp{ctx};
121
122 auto input_data{ctx.ReadBuffer(0)};
123 output_data.resize_destructive(ctx.GetWriteBufferSize());
124
125 u32 size{};
126 u32 sample_count{};
127 u64 time_taken{};
128 auto result = impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data,
129 output_data, false);
130
131 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {} time taken {}", size,
132 sample_count, time_taken);
133
134 ctx.WriteBuffer(output_data);
135
136 IPC::ResponseBuilder rb{ctx, 6};
137 rb.Push(result);
138 rb.Push(size);
139 rb.Push(sample_count);
140 rb.Push(time_taken);
141 }
142
143 void DecodeInterleavedForMultiStreamWithPerfOld(HLERequestContext& ctx) {
144 IPC::RequestParser rp{ctx};
145
146 auto input_data{ctx.ReadBuffer(0)};
147 output_data.resize_destructive(ctx.GetWriteBufferSize());
148
149 u32 size{};
150 u32 sample_count{};
151 u64 time_taken{};
152 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
153 input_data, output_data, false);
154
155 LOG_DEBUG(Service_Audio, "bytes read 0x{:X} samples generated {} time taken {}", size,
156 sample_count, time_taken);
157
158 ctx.WriteBuffer(output_data);
159
160 IPC::ResponseBuilder rb{ctx, 6};
161 rb.Push(result);
162 rb.Push(size);
163 rb.Push(sample_count);
164 rb.Push(time_taken);
165 }
166
167 void DecodeInterleavedWithPerfAndResetOld(HLERequestContext& ctx) {
168 IPC::RequestParser rp{ctx};
169
170 auto reset{rp.Pop<bool>()};
171
172 auto input_data{ctx.ReadBuffer(0)};
173 output_data.resize_destructive(ctx.GetWriteBufferSize());
174
175 u32 size{};
176 u32 sample_count{};
177 u64 time_taken{};
178 auto result = impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data,
179 output_data, reset);
180
181 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}",
182 reset, size, sample_count, time_taken);
183
184 ctx.WriteBuffer(output_data);
185
186 IPC::ResponseBuilder rb{ctx, 6};
187 rb.Push(result);
188 rb.Push(size);
189 rb.Push(sample_count);
190 rb.Push(time_taken);
191 }
192
193 void DecodeInterleavedForMultiStreamWithPerfAndResetOld(HLERequestContext& ctx) {
194 IPC::RequestParser rp{ctx};
195
196 auto reset{rp.Pop<bool>()};
197
198 auto input_data{ctx.ReadBuffer(0)};
199 output_data.resize_destructive(ctx.GetWriteBufferSize());
200
201 u32 size{};
202 u32 sample_count{};
203 u64 time_taken{};
204 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
205 input_data, output_data, reset);
206
207 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}",
208 reset, size, sample_count, time_taken);
209
210 ctx.WriteBuffer(output_data);
211
212 IPC::ResponseBuilder rb{ctx, 6};
213 rb.Push(result);
214 rb.Push(size);
215 rb.Push(sample_count);
216 rb.Push(time_taken);
217 }
218
219 void DecodeInterleaved(HLERequestContext& ctx) {
220 IPC::RequestParser rp{ctx};
221
222 auto reset{rp.Pop<bool>()};
223
224 auto input_data{ctx.ReadBuffer(0)};
225 output_data.resize_destructive(ctx.GetWriteBufferSize());
226
227 u32 size{};
228 u32 sample_count{};
229 u64 time_taken{};
230 auto result = impl->DecodeInterleaved(&size, &time_taken, &sample_count, input_data,
231 output_data, reset);
232
233 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}",
234 reset, size, sample_count, time_taken);
235
236 ctx.WriteBuffer(output_data);
237
238 IPC::ResponseBuilder rb{ctx, 6};
239 rb.Push(result);
240 rb.Push(size);
241 rb.Push(sample_count);
242 rb.Push(time_taken);
243 }
244
245 void DecodeInterleavedForMultiStream(HLERequestContext& ctx) {
246 IPC::RequestParser rp{ctx};
247
248 auto reset{rp.Pop<bool>()};
249
250 auto input_data{ctx.ReadBuffer(0)};
251 output_data.resize_destructive(ctx.GetWriteBufferSize());
252
253 u32 size{};
254 u32 sample_count{};
255 u64 time_taken{};
256 auto result = impl->DecodeInterleavedForMultiStream(&size, &time_taken, &sample_count,
257 input_data, output_data, reset);
258
259 LOG_DEBUG(Service_Audio, "reset {} bytes read 0x{:X} samples generated {} time taken {}",
260 reset, size, sample_count, time_taken);
261
262 ctx.WriteBuffer(output_data);
263
264 IPC::ResponseBuilder rb{ctx, 6};
265 rb.Push(result);
266 rb.Push(size);
267 rb.Push(sample_count);
268 rb.Push(time_taken);
269 }
270
271 std::unique_ptr<AudioCore::OpusDecoder::OpusDecoder> impl;
272 Common::ScratchBuffer<u8> output_data;
273};
274
275void HwOpus::OpenHardwareOpusDecoder(HLERequestContext& ctx) {
276 IPC::RequestParser rp{ctx};
277
278 auto params = rp.PopRaw<OpusParameters>();
279 auto transfer_memory_size{rp.Pop<u32>()};
280 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
281 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
282
283 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
284 params.sample_rate, params.channel_count, transfer_memory_size);
285
286 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
287
288 OpusParametersEx ex{
289 .sample_rate = params.sample_rate,
290 .channel_count = params.channel_count,
291 .use_large_frame_size = false,
292 };
293 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
294
295 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
296 rb.Push(result);
297 rb.PushIpcInterface(decoder);
298}
299
300void HwOpus::GetWorkBufferSize(HLERequestContext& ctx) {
301 IPC::RequestParser rp{ctx};
302 auto params = rp.PopRaw<OpusParameters>();
303
304 u64 size{};
305 auto result = impl.GetWorkBufferSize(params, size);
306
307 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} -- returned size 0x{:X}",
308 params.sample_rate, params.channel_count, size);
309
310 IPC::ResponseBuilder rb{ctx, 4};
311 rb.Push(result);
312 rb.Push(size);
313}
314
315void HwOpus::OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx) {
316 IPC::RequestParser rp{ctx};
317
318 auto input{ctx.ReadBuffer()};
319 OpusMultiStreamParameters params;
320 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParameters));
321
322 auto transfer_memory_size{rp.Pop<u32>()};
323 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
324 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
325
326 LOG_DEBUG(Service_Audio,
327 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
328 "transfer_memory_size 0x{:X}",
329 params.sample_rate, params.channel_count, params.total_stream_count,
330 params.stereo_stream_count, transfer_memory_size);
331
332 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
333
334 OpusMultiStreamParametersEx ex{
335 .sample_rate = params.sample_rate,
336 .channel_count = params.channel_count,
337 .total_stream_count = params.total_stream_count,
338 .stereo_stream_count = params.stereo_stream_count,
339 .use_large_frame_size = false,
340 .mappings{},
341 };
342 std::memcpy(ex.mappings.data(), params.mappings.data(), sizeof(params.mappings));
343 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
344
345 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
346 rb.Push(result);
347 rb.PushIpcInterface(decoder);
348}
349
350void HwOpus::GetWorkBufferSizeForMultiStream(HLERequestContext& ctx) {
351 IPC::RequestParser rp{ctx};
352
353 auto input{ctx.ReadBuffer()};
354 OpusMultiStreamParameters params;
355 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParameters));
356
357 u64 size{};
358 auto result = impl.GetWorkBufferSizeForMultiStream(params, size);
359
360 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
361
362 IPC::ResponseBuilder rb{ctx, 4};
363 rb.Push(result);
364 rb.Push(size);
365}
366
367void HwOpus::OpenHardwareOpusDecoderEx(HLERequestContext& ctx) {
368 IPC::RequestParser rp{ctx};
369
370 auto params = rp.PopRaw<OpusParametersEx>();
371 auto transfer_memory_size{rp.Pop<u32>()};
372 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
373 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
374
375 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}",
376 params.sample_rate, params.channel_count, transfer_memory_size);
377
378 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
379
380 auto result =
381 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
382
383 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
384 rb.Push(result);
385 rb.PushIpcInterface(decoder);
386}
387
388void HwOpus::GetWorkBufferSizeEx(HLERequestContext& ctx) {
389 IPC::RequestParser rp{ctx};
390 auto params = rp.PopRaw<OpusParametersEx>();
391
392 u64 size{};
393 auto result = impl.GetWorkBufferSizeEx(params, size);
394
395 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
396
397 IPC::ResponseBuilder rb{ctx, 4};
398 rb.Push(result);
399 rb.Push(size);
400}
401
402void HwOpus::OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx) {
403 IPC::RequestParser rp{ctx};
404
405 auto input{ctx.ReadBuffer()};
406 OpusMultiStreamParametersEx params;
407 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
408
409 auto transfer_memory_size{rp.Pop<u32>()};
410 auto transfer_memory_handle{ctx.GetCopyHandle(0)};
411 auto transfer_memory{ctx.GetObjectFromHandle<Kernel::KTransferMemory>(transfer_memory_handle)};
412
413 LOG_DEBUG(Service_Audio,
414 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
415 "use_large_frame_size {}"
416 "transfer_memory_size 0x{:X}",
417 params.sample_rate, params.channel_count, params.total_stream_count,
418 params.stereo_stream_count, params.use_large_frame_size, transfer_memory_size);
419
420 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
421
422 auto result =
423 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
424
425 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
426 rb.Push(result);
427 rb.PushIpcInterface(decoder);
428}
429
430void HwOpus::GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx) {
431 IPC::RequestParser rp{ctx};
432
433 auto input{ctx.ReadBuffer()};
434 OpusMultiStreamParametersEx params;
435 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
436
437 u64 size{};
438 auto result = impl.GetWorkBufferSizeForMultiStreamEx(params, size);
439
440 LOG_DEBUG(Service_Audio,
441 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
442 "use_large_frame_size {} -- returned size 0x{:X}",
443 params.sample_rate, params.channel_count, params.total_stream_count,
444 params.stereo_stream_count, params.use_large_frame_size, size);
445
446 IPC::ResponseBuilder rb{ctx, 4};
447 rb.Push(result);
448 rb.Push(size);
449}
450
451void HwOpus::GetWorkBufferSizeExEx(HLERequestContext& ctx) {
452 IPC::RequestParser rp{ctx};
453 auto params = rp.PopRaw<OpusParametersEx>();
454
455 u64 size{};
456 auto result = impl.GetWorkBufferSizeExEx(params, size);
457
458 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
459
460 IPC::ResponseBuilder rb{ctx, 4};
461 rb.Push(result);
462 rb.Push(size);
463}
464
465void HwOpus::GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx) {
466 IPC::RequestParser rp{ctx};
467
468 auto input{ctx.ReadBuffer()};
469 OpusMultiStreamParametersEx params;
470 std::memcpy(&params, input.data(), sizeof(OpusMultiStreamParametersEx));
471
472 u64 size{};
473 auto result = impl.GetWorkBufferSizeForMultiStreamExEx(params, size);
474
475 LOG_DEBUG(Service_Audio, "size 0x{:X}", size);
476
477 IPC::ResponseBuilder rb{ctx, 4};
478 rb.Push(result);
479 rb.Push(size);
480}
481
482HwOpus::HwOpus(Core::System& system_)
483 : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
484 static const FunctionInfo functions[] = {
485 {0, &HwOpus::OpenHardwareOpusDecoder, "OpenHardwareOpusDecoder"},
486 {1, &HwOpus::GetWorkBufferSize, "GetWorkBufferSize"},
487 {2, &HwOpus::OpenHardwareOpusDecoderForMultiStream, "OpenOpusDecoderForMultiStream"},
488 {3, &HwOpus::GetWorkBufferSizeForMultiStream, "GetWorkBufferSizeForMultiStream"},
489 {4, &HwOpus::OpenHardwareOpusDecoderEx, "OpenHardwareOpusDecoderEx"},
490 {5, &HwOpus::GetWorkBufferSizeEx, "GetWorkBufferSizeEx"},
491 {6, &HwOpus::OpenHardwareOpusDecoderForMultiStreamEx,
492 "OpenHardwareOpusDecoderForMultiStreamEx"},
493 {7, &HwOpus::GetWorkBufferSizeForMultiStreamEx, "GetWorkBufferSizeForMultiStreamEx"},
494 {8, &HwOpus::GetWorkBufferSizeExEx, "GetWorkBufferSizeExEx"},
495 {9, &HwOpus::GetWorkBufferSizeForMultiStreamExEx, "GetWorkBufferSizeForMultiStreamExEx"},
496 };
497 RegisterHandlers(functions);
498}
499
500HwOpus::~HwOpus() = default;
501
502} // namespace Service::Audio