summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Liam2024-02-20 20:42:28 -0500
committerGravatar Liam2024-02-20 22:15:38 -0500
commitea4703cb3111a21bc65588e3e01712b006f4d367 (patch)
tree3684c170810c59e9ba747802499d0a5605677f5d /src
parentaudio: rewrite IAudioRenderer (diff)
downloadyuzu-ea4703cb3111a21bc65588e3e01712b006f4d367.tar.gz
yuzu-ea4703cb3111a21bc65588e3e01712b006f4d367.tar.xz
yuzu-ea4703cb3111a21bc65588e3e01712b006f4d367.zip
audio: rewrite IHardwareOpusDecoderManager
Diffstat (limited to 'src')
-rw-r--r--src/audio_core/opus/decoder.cpp6
-rw-r--r--src/audio_core/opus/decoder.h6
-rw-r--r--src/audio_core/opus/decoder_manager.cpp18
-rw-r--r--src/audio_core/opus/decoder_manager.h16
-rw-r--r--src/audio_core/opus/hardware_opus.cpp13
-rw-r--r--src/audio_core/opus/hardware_opus.h6
-rw-r--r--src/core/hle/service/audio/audio_controller.cpp24
-rw-r--r--src/core/hle/service/audio/audio_in.cpp30
-rw-r--r--src/core/hle/service/audio/audio_in_manager.cpp12
-rw-r--r--src/core/hle/service/audio/audio_out.cpp28
-rw-r--r--src/core/hle/service/audio/audio_out_manager.cpp8
-rw-r--r--src/core/hle/service/audio/audio_renderer.cpp26
-rw-r--r--src/core/hle/service/audio/audio_renderer_manager.cpp8
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.cpp4
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder.h4
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.cpp273
-rw-r--r--src/core/hle/service/audio/hardware_opus_decoder_manager.h45
17 files changed, 230 insertions, 297 deletions
diff --git a/src/audio_core/opus/decoder.cpp b/src/audio_core/opus/decoder.cpp
index b7fed5304..0c110cbeb 100644
--- a/src/audio_core/opus/decoder.cpp
+++ b/src/audio_core/opus/decoder.cpp
@@ -28,8 +28,8 @@ OpusDecoder::~OpusDecoder() {
28 } 28 }
29} 29}
30 30
31Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, 31Result OpusDecoder::Initialize(const OpusParametersEx& params,
32 u64 transfer_memory_size) { 32 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) {
33 auto frame_size{params.use_large_frame_size ? 5760 : 1920}; 33 auto frame_size{params.use_large_frame_size ? 5760 : 1920};
34 shared_buffer_size = transfer_memory_size; 34 shared_buffer_size = transfer_memory_size;
35 shared_buffer = std::make_unique<u8[]>(shared_buffer_size); 35 shared_buffer = std::make_unique<u8[]>(shared_buffer_size);
@@ -59,7 +59,7 @@ Result OpusDecoder::Initialize(OpusParametersEx& params, Kernel::KTransferMemory
59 R_SUCCEED(); 59 R_SUCCEED();
60} 60}
61 61
62Result OpusDecoder::Initialize(OpusMultiStreamParametersEx& params, 62Result OpusDecoder::Initialize(const OpusMultiStreamParametersEx& params,
63 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) { 63 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size) {
64 auto frame_size{params.use_large_frame_size ? 5760 : 1920}; 64 auto frame_size{params.use_large_frame_size ? 5760 : 1920};
65 shared_buffer_size = transfer_memory_size; 65 shared_buffer_size = transfer_memory_size;
diff --git a/src/audio_core/opus/decoder.h b/src/audio_core/opus/decoder.h
index fd728958a..1b8c257d4 100644
--- a/src/audio_core/opus/decoder.h
+++ b/src/audio_core/opus/decoder.h
@@ -22,10 +22,10 @@ public:
22 explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_); 22 explicit OpusDecoder(Core::System& system, HardwareOpus& hardware_opus_);
23 ~OpusDecoder(); 23 ~OpusDecoder();
24 24
25 Result Initialize(OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory, 25 Result Initialize(const OpusParametersEx& params, Kernel::KTransferMemory* transfer_memory,
26 u64 transfer_memory_size);
27 Result Initialize(OpusMultiStreamParametersEx& params, Kernel::KTransferMemory* transfer_memory,
28 u64 transfer_memory_size); 26 u64 transfer_memory_size);
27 Result Initialize(const OpusMultiStreamParametersEx& params,
28 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
29 Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count, 29 Result DecodeInterleaved(u32* out_data_size, u64* out_time_taken, u32* out_sample_count,
30 std::span<const u8> input_data, std::span<u8> output_data, bool reset); 30 std::span<const u8> input_data, std::span<u8> output_data, bool reset);
31 Result SetContext([[maybe_unused]] std::span<const u8> context); 31 Result SetContext([[maybe_unused]] std::span<const u8> context);
diff --git a/src/audio_core/opus/decoder_manager.cpp b/src/audio_core/opus/decoder_manager.cpp
index 1464880a1..89eec1298 100644
--- a/src/audio_core/opus/decoder_manager.cpp
+++ b/src/audio_core/opus/decoder_manager.cpp
@@ -38,7 +38,7 @@ OpusDecoderManager::OpusDecoderManager(Core::System& system_)
38 } 38 }
39} 39}
40 40
41Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_size) { 41Result OpusDecoderManager::GetWorkBufferSize(const OpusParameters& params, u32& out_size) {
42 OpusParametersEx ex{ 42 OpusParametersEx ex{
43 .sample_rate = params.sample_rate, 43 .sample_rate = params.sample_rate,
44 .channel_count = params.channel_count, 44 .channel_count = params.channel_count,
@@ -47,11 +47,11 @@ Result OpusDecoderManager::GetWorkBufferSize(OpusParameters& params, u64& out_si
47 R_RETURN(GetWorkBufferSizeExEx(ex, out_size)); 47 R_RETURN(GetWorkBufferSizeExEx(ex, out_size));
48} 48}
49 49
50Result OpusDecoderManager::GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size) { 50Result OpusDecoderManager::GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size) {
51 R_RETURN(GetWorkBufferSizeExEx(params, out_size)); 51 R_RETURN(GetWorkBufferSizeExEx(params, out_size));
52} 52}
53 53
54Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size) { 54Result OpusDecoderManager::GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size) {
55 R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount); 55 R_UNLESS(IsValidChannelCount(params.channel_count), ResultInvalidOpusChannelCount);
56 R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); 56 R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate);
57 57
@@ -63,8 +63,8 @@ Result OpusDecoderManager::GetWorkBufferSizeExEx(OpusParametersEx& params, u64&
63 R_SUCCEED(); 63 R_SUCCEED();
64} 64}
65 65
66Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, 66Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params,
67 u64& out_size) { 67 u32& out_size) {
68 OpusMultiStreamParametersEx ex{ 68 OpusMultiStreamParametersEx ex{
69 .sample_rate = params.sample_rate, 69 .sample_rate = params.sample_rate,
70 .channel_count = params.channel_count, 70 .channel_count = params.channel_count,
@@ -76,13 +76,13 @@ Result OpusDecoderManager::GetWorkBufferSizeForMultiStream(OpusMultiStreamParame
76 R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size)); 76 R_RETURN(GetWorkBufferSizeForMultiStreamExEx(ex, out_size));
77} 77}
78 78
79Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, 79Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(
80 u64& out_size) { 80 const OpusMultiStreamParametersEx& params, u32& out_size) {
81 R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size)); 81 R_RETURN(GetWorkBufferSizeForMultiStreamExEx(params, out_size));
82} 82}
83 83
84Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, 84Result OpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(
85 u64& out_size) { 85 const OpusMultiStreamParametersEx& params, u32& out_size) {
86 R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount); 86 R_UNLESS(IsValidMultiStreamChannelCount(params.channel_count), ResultInvalidOpusChannelCount);
87 R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate); 87 R_UNLESS(IsValidSampleRate(params.sample_rate), ResultInvalidOpusSampleRate);
88 R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count, 88 R_UNLESS(IsValidStreamCount(params.channel_count, params.total_stream_count,
diff --git a/src/audio_core/opus/decoder_manager.h b/src/audio_core/opus/decoder_manager.h
index 70ebc4bab..8f6876d5c 100644
--- a/src/audio_core/opus/decoder_manager.h
+++ b/src/audio_core/opus/decoder_manager.h
@@ -22,17 +22,19 @@ public:
22 return hardware_opus; 22 return hardware_opus;
23 } 23 }
24 24
25 Result GetWorkBufferSize(OpusParameters& params, u64& out_size); 25 Result GetWorkBufferSize(const OpusParameters& params, u32& out_size);
26 Result GetWorkBufferSizeEx(OpusParametersEx& params, u64& out_size); 26 Result GetWorkBufferSizeEx(const OpusParametersEx& params, u32& out_size);
27 Result GetWorkBufferSizeExEx(OpusParametersEx& params, u64& out_size); 27 Result GetWorkBufferSizeExEx(const OpusParametersEx& params, u32& out_size);
28 Result GetWorkBufferSizeForMultiStream(OpusMultiStreamParameters& params, u64& out_size); 28 Result GetWorkBufferSizeForMultiStream(const OpusMultiStreamParameters& params, u32& out_size);
29 Result GetWorkBufferSizeForMultiStreamEx(OpusMultiStreamParametersEx& params, u64& out_size); 29 Result GetWorkBufferSizeForMultiStreamEx(const OpusMultiStreamParametersEx& params,
30 Result GetWorkBufferSizeForMultiStreamExEx(OpusMultiStreamParametersEx& params, u64& out_size); 30 u32& out_size);
31 Result GetWorkBufferSizeForMultiStreamExEx(const OpusMultiStreamParametersEx& params,
32 u32& out_size);
31 33
32private: 34private:
33 Core::System& system; 35 Core::System& system;
34 HardwareOpus hardware_opus; 36 HardwareOpus hardware_opus;
35 std::array<u64, MaxChannels> required_workbuffer_sizes{}; 37 std::array<u32, MaxChannels> required_workbuffer_sizes{};
36}; 38};
37 39
38} // namespace AudioCore::OpusDecoder 40} // namespace AudioCore::OpusDecoder
diff --git a/src/audio_core/opus/hardware_opus.cpp b/src/audio_core/opus/hardware_opus.cpp
index 5ff71ab2d..30805f4a3 100644
--- a/src/audio_core/opus/hardware_opus.cpp
+++ b/src/audio_core/opus/hardware_opus.cpp
@@ -42,7 +42,7 @@ HardwareOpus::HardwareOpus(Core::System& system_)
42 opus_decoder.SetSharedMemory(shared_memory); 42 opus_decoder.SetSharedMemory(shared_memory);
43} 43}
44 44
45u64 HardwareOpus::GetWorkBufferSize(u32 channel) { 45u32 HardwareOpus::GetWorkBufferSize(u32 channel) {
46 if (!opus_decoder.IsRunning()) { 46 if (!opus_decoder.IsRunning()) {
47 return 0; 47 return 0;
48 } 48 }
@@ -55,10 +55,10 @@ u64 HardwareOpus::GetWorkBufferSize(u32 channel) {
55 ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg); 55 ADSP::OpusDecoder::Message::GetWorkBufferSizeOK, msg);
56 return 0; 56 return 0;
57 } 57 }
58 return shared_memory.dsp_return_data[0]; 58 return static_cast<u32>(shared_memory.dsp_return_data[0]);
59} 59}
60 60
61u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) { 61u32 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count) {
62 std::scoped_lock l{mutex}; 62 std::scoped_lock l{mutex};
63 shared_memory.host_send_data[0] = total_stream_count; 63 shared_memory.host_send_data[0] = total_stream_count;
64 shared_memory.host_send_data[1] = stereo_stream_count; 64 shared_memory.host_send_data[1] = stereo_stream_count;
@@ -70,7 +70,7 @@ u64 HardwareOpus::GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 st
70 ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg); 70 ADSP::OpusDecoder::Message::GetWorkBufferSizeForMultiStreamOK, msg);
71 return 0; 71 return 0;
72 } 72 }
73 return shared_memory.dsp_return_data[0]; 73 return static_cast<u32>(shared_memory.dsp_return_data[0]);
74} 74}
75 75
76Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, 76Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer,
@@ -94,8 +94,9 @@ Result HardwareOpus::InitializeDecodeObject(u32 sample_rate, u32 channel_count,
94 94
95Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, 95Result HardwareOpus::InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count,
96 u32 total_stream_count, 96 u32 total_stream_count,
97 u32 stereo_stream_count, void* mappings, 97 u32 stereo_stream_count,
98 void* buffer, u64 buffer_size) { 98 const void* mappings, void* buffer,
99 u64 buffer_size) {
99 std::scoped_lock l{mutex}; 100 std::scoped_lock l{mutex};
100 shared_memory.host_send_data[0] = (u64)buffer; 101 shared_memory.host_send_data[0] = (u64)buffer;
101 shared_memory.host_send_data[1] = buffer_size; 102 shared_memory.host_send_data[1] = buffer_size;
diff --git a/src/audio_core/opus/hardware_opus.h b/src/audio_core/opus/hardware_opus.h
index b10184baa..caa746840 100644
--- a/src/audio_core/opus/hardware_opus.h
+++ b/src/audio_core/opus/hardware_opus.h
@@ -16,14 +16,14 @@ class HardwareOpus {
16public: 16public:
17 HardwareOpus(Core::System& system); 17 HardwareOpus(Core::System& system);
18 18
19 u64 GetWorkBufferSize(u32 channel); 19 u32 GetWorkBufferSize(u32 channel);
20 u64 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count); 20 u32 GetWorkBufferSizeForMultiStream(u32 total_stream_count, u32 stereo_stream_count);
21 21
22 Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer, 22 Result InitializeDecodeObject(u32 sample_rate, u32 channel_count, void* buffer,
23 u64 buffer_size); 23 u64 buffer_size);
24 Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count, 24 Result InitializeMultiStreamDecodeObject(u32 sample_rate, u32 channel_count,
25 u32 totaL_stream_count, u32 stereo_stream_count, 25 u32 totaL_stream_count, u32 stereo_stream_count,
26 void* mappings, void* buffer, u64 buffer_size); 26 const void* mappings, void* buffer, u64 buffer_size);
27 Result ShutdownDecodeObject(void* buffer, u64 buffer_size); 27 Result ShutdownDecodeObject(void* buffer, u64 buffer_size);
28 Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size); 28 Result ShutdownMultiStreamDecodeObject(void* buffer, u64 buffer_size);
29 Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size, 29 Result DecodeInterleaved(u32& out_sample_count, void* output_data, u64 output_data_size,
diff --git a/src/core/hle/service/audio/audio_controller.cpp b/src/core/hle/service/audio/audio_controller.cpp
index a6da66d0f..d51c89118 100644
--- a/src/core/hle/service/audio/audio_controller.cpp
+++ b/src/core/hle/service/audio/audio_controller.cpp
@@ -16,23 +16,23 @@ IAudioController::IAudioController(Core::System& system_)
16 static const FunctionInfo functions[] = { 16 static const FunctionInfo functions[] = {
17 {0, nullptr, "GetTargetVolume"}, 17 {0, nullptr, "GetTargetVolume"},
18 {1, nullptr, "SetTargetVolume"}, 18 {1, nullptr, "SetTargetVolume"},
19 {2, C<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"}, 19 {2, D<&IAudioController::GetTargetVolumeMin>, "GetTargetVolumeMin"},
20 {3, C<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"}, 20 {3, D<&IAudioController::GetTargetVolumeMax>, "GetTargetVolumeMax"},
21 {4, nullptr, "IsTargetMute"}, 21 {4, nullptr, "IsTargetMute"},
22 {5, nullptr, "SetTargetMute"}, 22 {5, nullptr, "SetTargetMute"},
23 {6, nullptr, "IsTargetConnected"}, 23 {6, nullptr, "IsTargetConnected"},
24 {7, nullptr, "SetDefaultTarget"}, 24 {7, nullptr, "SetDefaultTarget"},
25 {8, nullptr, "GetDefaultTarget"}, 25 {8, nullptr, "GetDefaultTarget"},
26 {9, C<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"}, 26 {9, D<&IAudioController::GetAudioOutputMode>, "GetAudioOutputMode"},
27 {10, C<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"}, 27 {10, D<&IAudioController::SetAudioOutputMode>, "SetAudioOutputMode"},
28 {11, nullptr, "SetForceMutePolicy"}, 28 {11, nullptr, "SetForceMutePolicy"},
29 {12, C<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"}, 29 {12, D<&IAudioController::GetForceMutePolicy>, "GetForceMutePolicy"},
30 {13, C<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"}, 30 {13, D<&IAudioController::GetOutputModeSetting>, "GetOutputModeSetting"},
31 {14, C<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"}, 31 {14, D<&IAudioController::SetOutputModeSetting>, "SetOutputModeSetting"},
32 {15, nullptr, "SetOutputTarget"}, 32 {15, nullptr, "SetOutputTarget"},
33 {16, nullptr, "SetInputTargetForceEnabled"}, 33 {16, nullptr, "SetInputTargetForceEnabled"},
34 {17, C<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"}, 34 {17, D<&IAudioController::SetHeadphoneOutputLevelMode>, "SetHeadphoneOutputLevelMode"},
35 {18, C<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"}, 35 {18, D<&IAudioController::GetHeadphoneOutputLevelMode>, "GetHeadphoneOutputLevelMode"},
36 {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"}, 36 {19, nullptr, "AcquireAudioVolumeUpdateEventForPlayReport"},
37 {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"}, 37 {20, nullptr, "AcquireAudioOutputDeviceUpdateEventForPlayReport"},
38 {21, nullptr, "GetAudioOutputTargetForPlayReport"}, 38 {21, nullptr, "GetAudioOutputTargetForPlayReport"},
@@ -44,11 +44,11 @@ IAudioController::IAudioController(Core::System& system_)
44 {27, nullptr, "SetVolumeMappingTableForDev"}, 44 {27, nullptr, "SetVolumeMappingTableForDev"},
45 {28, nullptr, "GetAudioOutputChannelCountForPlayReport"}, 45 {28, nullptr, "GetAudioOutputChannelCountForPlayReport"},
46 {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"}, 46 {29, nullptr, "BindAudioOutputChannelCountUpdateEventForPlayReport"},
47 {30, C<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"}, 47 {30, D<&IAudioController::SetSpeakerAutoMuteEnabled>, "SetSpeakerAutoMuteEnabled"},
48 {31, C<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"}, 48 {31, D<&IAudioController::IsSpeakerAutoMuteEnabled>, "IsSpeakerAutoMuteEnabled"},
49 {32, nullptr, "GetActiveOutputTarget"}, 49 {32, nullptr, "GetActiveOutputTarget"},
50 {33, nullptr, "GetTargetDeviceInfo"}, 50 {33, nullptr, "GetTargetDeviceInfo"},
51 {34, C<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"}, 51 {34, D<&IAudioController::AcquireTargetNotification>, "AcquireTargetNotification"},
52 {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, 52 {35, nullptr, "SetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
53 {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"}, 53 {36, nullptr, "GetHearingProtectionSafeguardTimerRemainingTimeForDebug"},
54 {37, nullptr, "SetHearingProtectionSafeguardEnabled"}, 54 {37, nullptr, "SetHearingProtectionSafeguardEnabled"},
diff --git a/src/core/hle/service/audio/audio_in.cpp b/src/core/hle/service/audio/audio_in.cpp
index 31d136077..9240cc336 100644
--- a/src/core/hle/service/audio/audio_in.cpp
+++ b/src/core/hle/service/audio/audio_in.cpp
@@ -16,21 +16,21 @@ IAudioIn::IAudioIn(Core::System& system_, Manager& manager, size_t session_id,
16 impl{std::make_shared<In>(system_, manager, event, session_id)} { 16 impl{std::make_shared<In>(system_, manager, event, session_id)} {
17 // clang-format off 17 // clang-format off
18 static const FunctionInfo functions[] = { 18 static const FunctionInfo functions[] = {
19 {0, C<&IAudioIn::GetAudioInState>, "GetAudioInState"}, 19 {0, D<&IAudioIn::GetAudioInState>, "GetAudioInState"},
20 {1, C<&IAudioIn::Start>, "Start"}, 20 {1, D<&IAudioIn::Start>, "Start"},
21 {2, C<&IAudioIn::Stop>, "Stop"}, 21 {2, D<&IAudioIn::Stop>, "Stop"},
22 {3, C<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"}, 22 {3, D<&IAudioIn::AppendAudioInBuffer>, "AppendAudioInBuffer"},
23 {4, C<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"}, 23 {4, D<&IAudioIn::RegisterBufferEvent>, "RegisterBufferEvent"},
24 {5, C<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"}, 24 {5, D<&IAudioIn::GetReleasedAudioInBuffers>, "GetReleasedAudioInBuffers"},
25 {6, C<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"}, 25 {6, D<&IAudioIn::ContainsAudioInBuffer>, "ContainsAudioInBuffer"},
26 {7, C<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"}, 26 {7, D<&IAudioIn::AppendAudioInBuffer>, "AppendUacInBuffer"},
27 {8, C<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"}, 27 {8, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendAudioInBufferAuto"},
28 {9, C<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"}, 28 {9, D<&IAudioIn::GetReleasedAudioInBuffersAuto>, "GetReleasedAudioInBuffersAuto"},
29 {10, C<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"}, 29 {10, D<&IAudioIn::AppendAudioInBufferAuto>, "AppendUacInBufferAuto"},
30 {11, C<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"}, 30 {11, D<&IAudioIn::GetAudioInBufferCount>, "GetAudioInBufferCount"},
31 {12, C<&IAudioIn::SetDeviceGain>, "SetDeviceGain"}, 31 {12, D<&IAudioIn::SetDeviceGain>, "SetDeviceGain"},
32 {13, C<&IAudioIn::GetDeviceGain>, "GetDeviceGain"}, 32 {13, D<&IAudioIn::GetDeviceGain>, "GetDeviceGain"},
33 {14, C<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"}, 33 {14, D<&IAudioIn::FlushAudioInBuffers>, "FlushAudioInBuffers"},
34 }; 34 };
35 // clang-format on 35 // clang-format on
36 36
diff --git a/src/core/hle/service/audio/audio_in_manager.cpp b/src/core/hle/service/audio/audio_in_manager.cpp
index 0379a2f68..9b67af367 100644
--- a/src/core/hle/service/audio/audio_in_manager.cpp
+++ b/src/core/hle/service/audio/audio_in_manager.cpp
@@ -14,12 +14,12 @@ IAudioInManager::IAudioInManager(Core::System& system_)
14 impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)} { 14 impl{std::make_unique<AudioCore::AudioIn::Manager>(system_)} {
15 // clang-format off 15 // clang-format off
16 static const FunctionInfo functions[] = { 16 static const FunctionInfo functions[] = {
17 {0, C<&IAudioInManager::ListAudioIns>, "ListAudioIns"}, 17 {0, D<&IAudioInManager::ListAudioIns>, "ListAudioIns"},
18 {1, C<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"}, 18 {1, D<&IAudioInManager::OpenAudioIn>, "OpenAudioIn"},
19 {2, C<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"}, 19 {2, D<&IAudioInManager::ListAudioIns>, "ListAudioInsAuto"},
20 {3, C<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"}, 20 {3, D<&IAudioInManager::OpenAudioIn>, "OpenAudioInAuto"},
21 {4, C<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"}, 21 {4, D<&IAudioInManager::ListAudioInsAutoFiltered>, "ListAudioInsAutoFiltered"},
22 {5, C<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"}, 22 {5, D<&IAudioInManager::OpenAudioInProtocolSpecified>, "OpenAudioInProtocolSpecified"},
23 }; 23 };
24 // clang-format on 24 // clang-format on
25 25
diff --git a/src/core/hle/service/audio/audio_out.cpp b/src/core/hle/service/audio/audio_out.cpp
index cd2dc1f6f..53009d5d7 100644
--- a/src/core/hle/service/audio/audio_out.cpp
+++ b/src/core/hle/service/audio/audio_out.cpp
@@ -21,20 +21,20 @@ IAudioOut::IAudioOut(Core::System& system_, Manager& manager, size_t session_id,
21 21
22 // clang-format off 22 // clang-format off
23 static const FunctionInfo functions[] = { 23 static const FunctionInfo functions[] = {
24 {0, C<&IAudioOut::GetAudioOutState>, "GetAudioOutState"}, 24 {0, D<&IAudioOut::GetAudioOutState>, "GetAudioOutState"},
25 {1, C<&IAudioOut::Start>, "Start"}, 25 {1, D<&IAudioOut::Start>, "Start"},
26 {2, C<&IAudioOut::Stop>, "Stop"}, 26 {2, D<&IAudioOut::Stop>, "Stop"},
27 {3, C<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"}, 27 {3, D<&IAudioOut::AppendAudioOutBuffer>, "AppendAudioOutBuffer"},
28 {4, C<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"}, 28 {4, D<&IAudioOut::RegisterBufferEvent>, "RegisterBufferEvent"},
29 {5, C<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"}, 29 {5, D<&IAudioOut::GetReleasedAudioOutBuffers>, "GetReleasedAudioOutBuffers"},
30 {6, C<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"}, 30 {6, D<&IAudioOut::ContainsAudioOutBuffer>, "ContainsAudioOutBuffer"},
31 {7, C<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"}, 31 {7, D<&IAudioOut::AppendAudioOutBufferAuto>, "AppendAudioOutBufferAuto"},
32 {8, C<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"}, 32 {8, D<&IAudioOut::GetReleasedAudioOutBuffersAuto>, "GetReleasedAudioOutBuffersAuto"},
33 {9, C<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"}, 33 {9, D<&IAudioOut::GetAudioOutBufferCount>, "GetAudioOutBufferCount"},
34 {10, C<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"}, 34 {10, D<&IAudioOut::GetAudioOutPlayedSampleCount>, "GetAudioOutPlayedSampleCount"},
35 {11, C<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"}, 35 {11, D<&IAudioOut::FlushAudioOutBuffers>, "FlushAudioOutBuffers"},
36 {12, C<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"}, 36 {12, D<&IAudioOut::SetAudioOutVolume>, "SetAudioOutVolume"},
37 {13, C<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"}, 37 {13, D<&IAudioOut::GetAudioOutVolume>, "GetAudioOutVolume"},
38 }; 38 };
39 // clang-format on 39 // clang-format on
40 RegisterHandlers(functions); 40 RegisterHandlers(functions);
diff --git a/src/core/hle/service/audio/audio_out_manager.cpp b/src/core/hle/service/audio/audio_out_manager.cpp
index 89cd6df94..780e1dcda 100644
--- a/src/core/hle/service/audio/audio_out_manager.cpp
+++ b/src/core/hle/service/audio/audio_out_manager.cpp
@@ -14,10 +14,10 @@ IAudioOutManager::IAudioOutManager(Core::System& system_)
14 : ServiceFramework{system_, "audout:u"}, impl{std::make_unique<Manager>(system_)} { 14 : ServiceFramework{system_, "audout:u"}, impl{std::make_unique<Manager>(system_)} {
15 // clang-format off 15 // clang-format off
16 static const FunctionInfo functions[] = { 16 static const FunctionInfo functions[] = {
17 {0, C<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"}, 17 {0, D<&IAudioOutManager::ListAudioOuts>, "ListAudioOuts"},
18 {1, C<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"}, 18 {1, D<&IAudioOutManager::OpenAudioOut>, "OpenAudioOut"},
19 {2, C<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"}, 19 {2, D<&IAudioOutManager::ListAudioOutsAuto>, "ListAudioOutsAuto"},
20 {3, C<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"}, 20 {3, D<&IAudioOutManager::OpenAudioOutAuto>, "OpenAudioOutAuto"},
21 }; 21 };
22 // clang-format on 22 // clang-format on
23 23
diff --git a/src/core/hle/service/audio/audio_renderer.cpp b/src/core/hle/service/audio/audio_renderer.cpp
index fc20054b4..b78660cea 100644
--- a/src/core/hle/service/audio/audio_renderer.cpp
+++ b/src/core/hle/service/audio/audio_renderer.cpp
@@ -18,20 +18,20 @@ IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
18 process_handle{process_handle_} { 18 process_handle{process_handle_} {
19 // clang-format off 19 // clang-format off
20 static const FunctionInfo functions[] = { 20 static const FunctionInfo functions[] = {
21 {0, C<&IAudioRenderer::GetSampleRate>, "GetSampleRate"}, 21 {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
22 {1, C<&IAudioRenderer::GetSampleCount>, "GetSampleCount"}, 22 {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
23 {2, C<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"}, 23 {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
24 {3, C<&IAudioRenderer::GetState>, "GetState"}, 24 {3, D<&IAudioRenderer::GetState>, "GetState"},
25 {4, C<&IAudioRenderer::RequestUpdate>, "RequestUpdate"}, 25 {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
26 {5, C<&IAudioRenderer::Start>, "Start"}, 26 {5, D<&IAudioRenderer::Start>, "Start"},
27 {6, C<&IAudioRenderer::Stop>, "Stop"}, 27 {6, D<&IAudioRenderer::Stop>, "Stop"},
28 {7, C<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"}, 28 {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
29 {8, C<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"}, 29 {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
30 {9, C<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"}, 30 {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
31 {10, C<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"}, 31 {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"},
32 {11, nullptr, "ExecuteAudioRendererRendering"}, 32 {11, nullptr, "ExecuteAudioRendererRendering"},
33 {12, C<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"}, 33 {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"},
34 {13, C<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"}, 34 {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"},
35 }; 35 };
36 // clang-format on 36 // clang-format on
37 RegisterHandlers(functions); 37 RegisterHandlers(functions);
diff --git a/src/core/hle/service/audio/audio_renderer_manager.cpp b/src/core/hle/service/audio/audio_renderer_manager.cpp
index 3129169a4..6a1345c07 100644
--- a/src/core/hle/service/audio/audio_renderer_manager.cpp
+++ b/src/core/hle/service/audio/audio_renderer_manager.cpp
@@ -18,11 +18,11 @@ IAudioRendererManager::IAudioRendererManager(Core::System& system_)
18 : ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} { 18 : ServiceFramework{system_, "audren:u"}, impl{std::make_unique<Manager>(system_)} {
19 // clang-format off 19 // clang-format off
20 static const FunctionInfo functions[] = { 20 static const FunctionInfo functions[] = {
21 {0, C<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"}, 21 {0, D<&IAudioRendererManager::OpenAudioRenderer>, "OpenAudioRenderer"},
22 {1, C<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"}, 22 {1, D<&IAudioRendererManager::GetWorkBufferSize>, "GetWorkBufferSize"},
23 {2, C<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"}, 23 {2, D<&IAudioRendererManager::GetAudioDeviceService>, "GetAudioDeviceService"},
24 {3, nullptr, "OpenAudioRendererForManualExecution"}, 24 {3, nullptr, "OpenAudioRendererForManualExecution"},
25 {4, C<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"}, 25 {4, D<&IAudioRendererManager::GetAudioDeviceServiceWithRevisionInfo>, "GetAudioDeviceServiceWithRevisionInfo"},
26 }; 26 };
27 // clang-format on 27 // clang-format on
28 28
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.cpp b/src/core/hle/service/audio/hardware_opus_decoder.cpp
index 876bfe334..e398511a6 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder.cpp
@@ -31,13 +31,13 @@ IHardwareOpusDecoder::IHardwareOpusDecoder(Core::System& system_, HardwareOpus&
31 31
32IHardwareOpusDecoder::~IHardwareOpusDecoder() = default; 32IHardwareOpusDecoder::~IHardwareOpusDecoder() = default;
33 33
34Result IHardwareOpusDecoder::Initialize(OpusParametersEx& params, 34Result IHardwareOpusDecoder::Initialize(const OpusParametersEx& params,
35 Kernel::KTransferMemory* transfer_memory, 35 Kernel::KTransferMemory* transfer_memory,
36 u64 transfer_memory_size) { 36 u64 transfer_memory_size) {
37 return impl->Initialize(params, transfer_memory, transfer_memory_size); 37 return impl->Initialize(params, transfer_memory, transfer_memory_size);
38} 38}
39 39
40Result IHardwareOpusDecoder::Initialize(OpusMultiStreamParametersEx& params, 40Result IHardwareOpusDecoder::Initialize(const OpusMultiStreamParametersEx& params,
41 Kernel::KTransferMemory* transfer_memory, 41 Kernel::KTransferMemory* transfer_memory,
42 u64 transfer_memory_size) { 42 u64 transfer_memory_size) {
43 return impl->Initialize(params, transfer_memory, transfer_memory_size); 43 return impl->Initialize(params, transfer_memory, transfer_memory_size);
diff --git a/src/core/hle/service/audio/hardware_opus_decoder.h b/src/core/hle/service/audio/hardware_opus_decoder.h
index fe6636ce6..121858a6f 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder.h
@@ -14,9 +14,9 @@ public:
14 AudioCore::OpusDecoder::HardwareOpus& hardware_opus); 14 AudioCore::OpusDecoder::HardwareOpus& hardware_opus);
15 ~IHardwareOpusDecoder() override; 15 ~IHardwareOpusDecoder() override;
16 16
17 Result Initialize(AudioCore::OpusDecoder::OpusParametersEx& params, 17 Result Initialize(const AudioCore::OpusDecoder::OpusParametersEx& params,
18 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size); 18 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
19 Result Initialize(AudioCore::OpusDecoder::OpusMultiStreamParametersEx& params, 19 Result Initialize(const AudioCore::OpusDecoder::OpusMultiStreamParametersEx& params,
20 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size); 20 Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size);
21 21
22private: 22private:
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
index 6d7205cd2..9de72e30f 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.cpp
@@ -3,241 +3,154 @@
3 3
4#include "core/hle/service/audio/hardware_opus_decoder.h" 4#include "core/hle/service/audio/hardware_opus_decoder.h"
5#include "core/hle/service/audio/hardware_opus_decoder_manager.h" 5#include "core/hle/service/audio/hardware_opus_decoder_manager.h"
6#include "core/hle/service/ipc_helpers.h" 6#include "core/hle/service/cmif_serialization.h"
7 7
8namespace Service::Audio { 8namespace Service::Audio {
9 9
10using namespace AudioCore::OpusDecoder; 10using namespace AudioCore::OpusDecoder;
11 11
12void IHardwareOpusDecoderManager::OpenHardwareOpusDecoder(HLERequestContext& ctx) { 12IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_)
13 IPC::RequestParser rp{ctx}; 13 : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} {
14 // clang-format off
15 static const FunctionInfo functions[] = {
16 {0, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoder>, "OpenHardwareOpusDecoder"},
17 {1, D<&IHardwareOpusDecoderManager::GetWorkBufferSize>, "GetWorkBufferSize"},
18 {2, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream>, "OpenOpusDecoderForMultiStream"},
19 {3, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream>, "GetWorkBufferSizeForMultiStream"},
20 {4, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx>, "OpenHardwareOpusDecoderEx"},
21 {5, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeEx>, "GetWorkBufferSizeEx"},
22 {6, D<&IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx>, "OpenHardwareOpusDecoderForMultiStreamEx"},
23 {7, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx>, "GetWorkBufferSizeForMultiStreamEx"},
24 {8, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeExEx>, "GetWorkBufferSizeExEx"},
25 {9, D<&IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx>, "GetWorkBufferSizeForMultiStreamExEx"},
26 };
27 // clang-format on
28 RegisterHandlers(functions);
29}
14 30
15 auto params = rp.PopRaw<OpusParameters>(); 31IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
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 32
20 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size 0x{:X}", 33Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoder(
21 params.sample_rate, params.channel_count, transfer_memory_size); 34 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder, OpusParameters params, u32 tmem_size,
35 InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
36 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size {:#x}",
37 params.sample_rate, params.channel_count, tmem_size);
22 38
23 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())}; 39 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
24
25 OpusParametersEx ex{ 40 OpusParametersEx ex{
26 .sample_rate = params.sample_rate, 41 .sample_rate = params.sample_rate,
27 .channel_count = params.channel_count, 42 .channel_count = params.channel_count,
28 .use_large_frame_size = false, 43 .use_large_frame_size = false,
29 }; 44 };
30 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size); 45 R_TRY(decoder->Initialize(ex, tmem_handle.Get(), tmem_size));
31 46
32 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 47 *out_decoder = decoder;
33 rb.Push(result); 48 R_SUCCEED();
34 rb.PushIpcInterface(decoder);
35} 49}
36 50
37void IHardwareOpusDecoderManager::GetWorkBufferSize(HLERequestContext& ctx) { 51Result IHardwareOpusDecoderManager::GetWorkBufferSize(Out<u32> out_size, OpusParameters params) {
38 IPC::RequestParser rp{ctx}; 52 R_TRY(impl.GetWorkBufferSize(params, *out_size));
39 auto params = rp.PopRaw<OpusParameters>(); 53 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} -- returned size {:#x}",
40 54 params.sample_rate, params.channel_count, *out_size);
41 u64 size{}; 55 R_SUCCEED();
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} 56}
51 57
52void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx) { 58Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStream(
53 IPC::RequestParser rp{ctx}; 59 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
54 60 InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params, u32 tmem_size,
55 auto input{ctx.ReadBuffer()}; 61 InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
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, 62 LOG_DEBUG(Service_Audio,
64 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} " 63 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
65 "transfer_memory_size 0x{:X}", 64 "transfer_memory_size {:#x}",
66 params.sample_rate, params.channel_count, params.total_stream_count, 65 params->sample_rate, params->channel_count, params->total_stream_count,
67 params.stereo_stream_count, transfer_memory_size); 66 params->stereo_stream_count, tmem_size);
68 67
69 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())}; 68 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
70 69
71 OpusMultiStreamParametersEx ex{ 70 OpusMultiStreamParametersEx ex{
72 .sample_rate = params.sample_rate, 71 .sample_rate = params->sample_rate,
73 .channel_count = params.channel_count, 72 .channel_count = params->channel_count,
74 .total_stream_count = params.total_stream_count, 73 .total_stream_count = params->total_stream_count,
75 .stereo_stream_count = params.stereo_stream_count, 74 .stereo_stream_count = params->stereo_stream_count,
76 .use_large_frame_size = false, 75 .use_large_frame_size = false,
77 .mappings{}, 76 .mappings{},
78 }; 77 };
79 std::memcpy(ex.mappings.data(), params.mappings.data(), sizeof(params.mappings)); 78 std::memcpy(ex.mappings.data(), params->mappings.data(), sizeof(params->mappings));
80 auto result = decoder->Initialize(ex, transfer_memory.GetPointerUnsafe(), transfer_memory_size); 79 R_TRY(decoder->Initialize(ex, tmem_handle.Get(), tmem_size));
81 80
82 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 81 *out_decoder = decoder;
83 rb.Push(result); 82 R_SUCCEED();
84 rb.PushIpcInterface(decoder);
85} 83}
86 84
87void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream(HLERequestContext& ctx) { 85Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStream(
88 IPC::RequestParser rp{ctx}; 86 Out<u32> out_size, InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params) {
89 87 R_TRY(impl.GetWorkBufferSizeForMultiStream(*params, *out_size));
90 auto input{ctx.ReadBuffer()}; 88 LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
91 OpusMultiStreamParameters params; 89 R_SUCCEED();
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} 90}
103 91
104void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx(HLERequestContext& ctx) { 92Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderEx(
105 IPC::RequestParser rp{ctx}; 93 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder, OpusParametersEx params, u32 tmem_size,
106 94 InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
107 auto params = rp.PopRaw<OpusParametersEx>(); 95 LOG_DEBUG(Service_Audio, "sample_rate {} channel_count {} transfer_memory_size {:#x}",
108 auto transfer_memory_size{rp.Pop<u32>()}; 96 params.sample_rate, params.channel_count, tmem_size);
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 97
115 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())}; 98 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
99 R_TRY(decoder->Initialize(params, tmem_handle.Get(), tmem_size));
116 100
117 auto result = 101 *out_decoder = decoder;
118 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size); 102 R_SUCCEED();
119
120 IPC::ResponseBuilder rb{ctx, 2, 0, 1};
121 rb.Push(result);
122 rb.PushIpcInterface(decoder);
123} 103}
124 104
125void IHardwareOpusDecoderManager::GetWorkBufferSizeEx(HLERequestContext& ctx) { 105Result IHardwareOpusDecoderManager::GetWorkBufferSizeEx(Out<u32> out_size,
126 IPC::RequestParser rp{ctx}; 106 OpusParametersEx params) {
127 auto params = rp.PopRaw<OpusParametersEx>(); 107 R_TRY(impl.GetWorkBufferSizeEx(params, *out_size));
128 108 LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
129 u64 size{}; 109 R_SUCCEED();
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} 110}
138 111
139void IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx) { 112Result IHardwareOpusDecoderManager::OpenHardwareOpusDecoderForMultiStreamEx(
140 IPC::RequestParser rp{ctx}; 113 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
141 114 InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params, u32 tmem_size,
142 auto input{ctx.ReadBuffer()}; 115 InCopyHandle<Kernel::KTransferMemory> tmem_handle) {
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, 116 LOG_DEBUG(Service_Audio,
151 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} " 117 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
152 "use_large_frame_size {}" 118 "use_large_frame_size {}"
153 "transfer_memory_size 0x{:X}", 119 "transfer_memory_size {:#x}",
154 params.sample_rate, params.channel_count, params.total_stream_count, 120 params->sample_rate, params->channel_count, params->total_stream_count,
155 params.stereo_stream_count, params.use_large_frame_size, transfer_memory_size); 121 params->stereo_stream_count, params->use_large_frame_size, tmem_size);
156 122
157 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())}; 123 auto decoder{std::make_shared<IHardwareOpusDecoder>(system, impl.GetHardwareOpus())};
158 124
159 auto result = 125 R_TRY(decoder->Initialize(*params, tmem_handle.Get(), tmem_size));
160 decoder->Initialize(params, transfer_memory.GetPointerUnsafe(), transfer_memory_size);
161 126
162 IPC::ResponseBuilder rb{ctx, 2, 0, 1}; 127 *out_decoder = decoder;
163 rb.Push(result); 128 R_SUCCEED();
164 rb.PushIpcInterface(decoder);
165} 129}
166 130
167void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx) { 131Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamEx(
168 IPC::RequestParser rp{ctx}; 132 Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params) {
169 133 R_TRY(impl.GetWorkBufferSizeForMultiStreamEx(*params, *out_size));
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, 134 LOG_DEBUG(Service_Audio,
178 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} " 135 "sample_rate {} channel_count {} total_stream_count {} stereo_stream_count {} "
179 "use_large_frame_size {} -- returned size 0x{:X}", 136 "use_large_frame_size {} -- returned size {:#x}",
180 params.sample_rate, params.channel_count, params.total_stream_count, 137 params->sample_rate, params->channel_count, params->total_stream_count,
181 params.stereo_stream_count, params.use_large_frame_size, size); 138 params->stereo_stream_count, params->use_large_frame_size, *out_size);
182 139 R_SUCCEED();
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} 140}
201 141
202void IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx) { 142Result IHardwareOpusDecoderManager::GetWorkBufferSizeExEx(Out<u32> out_size,
203 IPC::RequestParser rp{ctx}; 143 OpusParametersEx params) {
204 144 R_TRY(impl.GetWorkBufferSizeExEx(params, *out_size));
205 auto input{ctx.ReadBuffer()}; 145 LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
206 OpusMultiStreamParametersEx params; 146 R_SUCCEED();
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} 147}
218 148
219IHardwareOpusDecoderManager::IHardwareOpusDecoderManager(Core::System& system_) 149Result IHardwareOpusDecoderManager::GetWorkBufferSizeForMultiStreamExEx(
220 : ServiceFramework{system_, "hwopus"}, system{system_}, impl{system} { 150 Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params) {
221 static const FunctionInfo functions[] = { 151 R_TRY(impl.GetWorkBufferSizeForMultiStreamExEx(*params, *out_size));
222 {0, &IHardwareOpusDecoderManager::OpenHardwareOpusDecoder, "OpenHardwareOpusDecoder"}, 152 LOG_DEBUG(Service_Audio, "size {:#x}", *out_size);
223 {1, &IHardwareOpusDecoderManager::GetWorkBufferSize, "GetWorkBufferSize"}, 153 R_SUCCEED();
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} 154}
240 155
241IHardwareOpusDecoderManager::~IHardwareOpusDecoderManager() = default;
242
243} // namespace Service::Audio 156} // namespace Service::Audio
diff --git a/src/core/hle/service/audio/hardware_opus_decoder_manager.h b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
index 29b1f16f5..4f869c517 100644
--- a/src/core/hle/service/audio/hardware_opus_decoder_manager.h
+++ b/src/core/hle/service/audio/hardware_opus_decoder_manager.h
@@ -4,30 +4,47 @@
4#pragma once 4#pragma once
5 5
6#include "audio_core/opus/decoder_manager.h" 6#include "audio_core/opus/decoder_manager.h"
7#include "core/hle/service/cmif_types.h"
7#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
8 9
9namespace Core {
10class System;
11}
12
13namespace Service::Audio { 10namespace Service::Audio {
14 11
12class IHardwareOpusDecoder;
13
14using AudioCore::OpusDecoder::OpusMultiStreamParameters;
15using AudioCore::OpusDecoder::OpusMultiStreamParametersEx;
16using AudioCore::OpusDecoder::OpusParameters;
17using AudioCore::OpusDecoder::OpusParametersEx;
18
15class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> { 19class IHardwareOpusDecoderManager final : public ServiceFramework<IHardwareOpusDecoderManager> {
16public: 20public:
17 explicit IHardwareOpusDecoderManager(Core::System& system_); 21 explicit IHardwareOpusDecoderManager(Core::System& system_);
18 ~IHardwareOpusDecoderManager() override; 22 ~IHardwareOpusDecoderManager() override;
19 23
20private: 24private:
21 void OpenHardwareOpusDecoder(HLERequestContext& ctx); 25 Result OpenHardwareOpusDecoder(Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
22 void GetWorkBufferSize(HLERequestContext& ctx); 26 OpusParameters params, u32 tmem_size,
23 void OpenHardwareOpusDecoderForMultiStream(HLERequestContext& ctx); 27 InCopyHandle<Kernel::KTransferMemory> tmem_handle);
24 void GetWorkBufferSizeForMultiStream(HLERequestContext& ctx); 28 Result GetWorkBufferSize(Out<u32> out_size, OpusParameters params);
25 void OpenHardwareOpusDecoderEx(HLERequestContext& ctx); 29 Result OpenHardwareOpusDecoderForMultiStream(
26 void GetWorkBufferSizeEx(HLERequestContext& ctx); 30 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
27 void OpenHardwareOpusDecoderForMultiStreamEx(HLERequestContext& ctx); 31 InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params, u32 tmem_size,
28 void GetWorkBufferSizeForMultiStreamEx(HLERequestContext& ctx); 32 InCopyHandle<Kernel::KTransferMemory> tmem_handle);
29 void GetWorkBufferSizeExEx(HLERequestContext& ctx); 33 Result GetWorkBufferSizeForMultiStream(
30 void GetWorkBufferSizeForMultiStreamExEx(HLERequestContext& ctx); 34 Out<u32> out_size, InLargeData<OpusMultiStreamParameters, BufferAttr_HipcPointer> params);
35 Result OpenHardwareOpusDecoderEx(Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
36 OpusParametersEx params, u32 tmem_size,
37 InCopyHandle<Kernel::KTransferMemory> tmem_handle);
38 Result GetWorkBufferSizeEx(Out<u32> out_size, OpusParametersEx params);
39 Result OpenHardwareOpusDecoderForMultiStreamEx(
40 Out<SharedPointer<IHardwareOpusDecoder>> out_decoder,
41 InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params, u32 tmem_size,
42 InCopyHandle<Kernel::KTransferMemory> tmem_handle);
43 Result GetWorkBufferSizeForMultiStreamEx(
44 Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
45 Result GetWorkBufferSizeExEx(Out<u32> out_size, OpusParametersEx params);
46 Result GetWorkBufferSizeForMultiStreamExEx(
47 Out<u32> out_size, InLargeData<OpusMultiStreamParametersEx, BufferAttr_HipcPointer> params);
31 48
32 Core::System& system; 49 Core::System& system;
33 AudioCore::OpusDecoder::OpusDecoderManager impl; 50 AudioCore::OpusDecoder::OpusDecoderManager impl;