summaryrefslogtreecommitdiff
path: root/src/core/hle/service/audio
diff options
context:
space:
mode:
authorGravatar Morph2021-09-28 23:42:50 -0400
committerGravatar Morph2021-10-01 23:38:59 -0400
commitfadcee14f8fca1b76b4ea48b1cfd136ccae8d182 (patch)
treea5787938bc73ff1b0b539e0945d3544d06a7d6d2 /src/core/hle/service/audio
parentMerge pull request #7102 from Morph1984/remove-boxcat (diff)
downloadyuzu-fadcee14f8fca1b76b4ea48b1cfd136ccae8d182.tar.gz
yuzu-fadcee14f8fca1b76b4ea48b1cfd136ccae8d182.tar.xz
yuzu-fadcee14f8fca1b76b4ea48b1cfd136ccae8d182.zip
service: Replace service event creation with ServiceContext::CreateEvent
The service context helps to manage all created events and allows us to close them upon destruction.
Diffstat (limited to 'src/core/hle/service/audio')
-rw-r--r--src/core/hle/service/audio/audin_u.cpp11
-rw-r--r--src/core/hle/service/audio/audin_u.h6
-rw-r--r--src/core/hle/service/audio/audout_u.cpp32
-rw-r--r--src/core/hle/service/audio/audren_u.cpp41
-rw-r--r--src/core/hle/service/audio/audren_u.h6
5 files changed, 55 insertions, 41 deletions
diff --git a/src/core/hle/service/audio/audin_u.cpp b/src/core/hle/service/audio/audin_u.cpp
index 570525019..840d1d883 100644
--- a/src/core/hle/service/audio/audin_u.cpp
+++ b/src/core/hle/service/audio/audin_u.cpp
@@ -12,7 +12,7 @@
12namespace Service::Audio { 12namespace Service::Audio {
13 13
14IAudioIn::IAudioIn(Core::System& system_) 14IAudioIn::IAudioIn(Core::System& system_)
15 : ServiceFramework{system_, "IAudioIn"}, buffer_event{system_.Kernel()} { 15 : ServiceFramework{system_, "IAudioIn"}, service_context{system_, "IAudioIn"} {
16 // clang-format off 16 // clang-format off
17 static const FunctionInfo functions[] = { 17 static const FunctionInfo functions[] = {
18 {0, nullptr, "GetAudioInState"}, 18 {0, nullptr, "GetAudioInState"},
@@ -35,11 +35,12 @@ IAudioIn::IAudioIn(Core::System& system_)
35 35
36 RegisterHandlers(functions); 36 RegisterHandlers(functions);
37 37
38 Kernel::KAutoObject::Create(std::addressof(buffer_event)); 38 buffer_event = service_context.CreateEvent("IAudioIn:BufferEvent");
39 buffer_event.Initialize("IAudioIn:BufferEvent");
40} 39}
41 40
42IAudioIn::~IAudioIn() = default; 41IAudioIn::~IAudioIn() {
42 service_context.CloseEvent(buffer_event);
43}
43 44
44void IAudioIn::Start(Kernel::HLERequestContext& ctx) { 45void IAudioIn::Start(Kernel::HLERequestContext& ctx) {
45 LOG_WARNING(Service_Audio, "(STUBBED) called"); 46 LOG_WARNING(Service_Audio, "(STUBBED) called");
@@ -53,7 +54,7 @@ void IAudioIn::RegisterBufferEvent(Kernel::HLERequestContext& ctx) {
53 54
54 IPC::ResponseBuilder rb{ctx, 2, 1}; 55 IPC::ResponseBuilder rb{ctx, 2, 1};
55 rb.Push(ResultSuccess); 56 rb.Push(ResultSuccess);
56 rb.PushCopyObjects(buffer_event.GetReadableEvent()); 57 rb.PushCopyObjects(buffer_event->GetReadableEvent());
57} 58}
58 59
59void IAudioIn::AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx) { 60void IAudioIn::AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx) {
diff --git a/src/core/hle/service/audio/audin_u.h b/src/core/hle/service/audio/audin_u.h
index f2f7f9932..bf3418613 100644
--- a/src/core/hle/service/audio/audin_u.h
+++ b/src/core/hle/service/audio/audin_u.h
@@ -4,7 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/k_event.h" 7#include "core/hle/service/kernel_helpers.h"
8#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
9 9
10namespace Core { 10namespace Core {
@@ -27,7 +27,9 @@ private:
27 void RegisterBufferEvent(Kernel::HLERequestContext& ctx); 27 void RegisterBufferEvent(Kernel::HLERequestContext& ctx);
28 void AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx); 28 void AppendAudioInBufferAuto(Kernel::HLERequestContext& ctx);
29 29
30 Kernel::KEvent buffer_event; 30 KernelHelpers::ServiceContext service_context;
31
32 Kernel::KEvent* buffer_event;
31}; 33};
32 34
33class AudInU final : public ServiceFramework<AudInU> { 35class AudInU final : public ServiceFramework<AudInU> {
diff --git a/src/core/hle/service/audio/audout_u.cpp b/src/core/hle/service/audio/audout_u.cpp
index 92d4510b1..beb387745 100644
--- a/src/core/hle/service/audio/audout_u.cpp
+++ b/src/core/hle/service/audio/audout_u.cpp
@@ -15,11 +15,10 @@
15#include "core/hle/ipc_helpers.h" 15#include "core/hle/ipc_helpers.h"
16#include "core/hle/kernel/hle_ipc.h" 16#include "core/hle/kernel/hle_ipc.h"
17#include "core/hle/kernel/k_event.h" 17#include "core/hle/kernel/k_event.h"
18#include "core/hle/kernel/k_readable_event.h"
19#include "core/hle/kernel/k_writable_event.h"
20#include "core/hle/kernel/kernel.h" 18#include "core/hle/kernel/kernel.h"
21#include "core/hle/service/audio/audout_u.h" 19#include "core/hle/service/audio/audout_u.h"
22#include "core/hle/service/audio/errors.h" 20#include "core/hle/service/audio/errors.h"
21#include "core/hle/service/kernel_helpers.h"
23#include "core/memory.h" 22#include "core/memory.h"
24 23
25namespace Service::Audio { 24namespace Service::Audio {
@@ -41,11 +40,12 @@ enum class AudioState : u32 {
41 40
42class IAudioOut final : public ServiceFramework<IAudioOut> { 41class IAudioOut final : public ServiceFramework<IAudioOut> {
43public: 42public:
44 IAudioOut(Core::System& system_, AudoutParams audio_params_, AudioCore::AudioOut& audio_core_, 43 explicit IAudioOut(Core::System& system_, AudoutParams audio_params_,
45 std::string&& device_name_, std::string&& unique_name) 44 AudioCore::AudioOut& audio_core_, std::string&& device_name_,
46 : ServiceFramework{system_, "IAudioOut"}, audio_core{audio_core_}, device_name{std::move( 45 std::string&& unique_name)
47 device_name_)}, 46 : ServiceFramework{system_, "IAudioOut"}, audio_core{audio_core_},
48 audio_params{audio_params_}, buffer_event{system.Kernel()}, main_memory{system.Memory()} { 47 device_name{std::move(device_name_)}, audio_params{audio_params_},
48 main_memory{system.Memory()}, service_context{system_, "IAudioOut"} {
49 // clang-format off 49 // clang-format off
50 static const FunctionInfo functions[] = { 50 static const FunctionInfo functions[] = {
51 {0, &IAudioOut::GetAudioOutState, "GetAudioOutState"}, 51 {0, &IAudioOut::GetAudioOutState, "GetAudioOutState"},
@@ -67,16 +67,19 @@ public:
67 RegisterHandlers(functions); 67 RegisterHandlers(functions);
68 68
69 // This is the event handle used to check if the audio buffer was released 69 // This is the event handle used to check if the audio buffer was released
70 Kernel::KAutoObject::Create(std::addressof(buffer_event)); 70 buffer_event = service_context.CreateEvent("IAudioOutBufferReleased");
71 buffer_event.Initialize("IAudioOutBufferReleased");
72 71
73 stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate, 72 stream = audio_core.OpenStream(system.CoreTiming(), audio_params.sample_rate,
74 audio_params.channel_count, std::move(unique_name), [this] { 73 audio_params.channel_count, std::move(unique_name), [this] {
75 const auto guard = LockService(); 74 const auto guard = LockService();
76 buffer_event.GetWritableEvent().Signal(); 75 buffer_event->GetWritableEvent().Signal();
77 }); 76 });
78 } 77 }
79 78
79 ~IAudioOut() override {
80 service_context.CloseEvent(buffer_event);
81 }
82
80private: 83private:
81 struct AudioBuffer { 84 struct AudioBuffer {
82 u64_le next; 85 u64_le next;
@@ -126,7 +129,7 @@ private:
126 129
127 IPC::ResponseBuilder rb{ctx, 2, 1}; 130 IPC::ResponseBuilder rb{ctx, 2, 1};
128 rb.Push(ResultSuccess); 131 rb.Push(ResultSuccess);
129 rb.PushCopyObjects(buffer_event.GetReadableEvent()); 132 rb.PushCopyObjects(buffer_event->GetReadableEvent());
130 } 133 }
131 134
132 void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) { 135 void AppendAudioOutBufferImpl(Kernel::HLERequestContext& ctx) {
@@ -227,9 +230,12 @@ private:
227 230
228 [[maybe_unused]] AudoutParams audio_params{}; 231 [[maybe_unused]] AudoutParams audio_params{};
229 232
230 /// This is the event handle used to check if the audio buffer was released
231 Kernel::KEvent buffer_event;
232 Core::Memory::Memory& main_memory; 233 Core::Memory::Memory& main_memory;
234
235 KernelHelpers::ServiceContext service_context;
236
237 /// This is the event handle used to check if the audio buffer was released
238 Kernel::KEvent* buffer_event;
233}; 239};
234 240
235AudOutU::AudOutU(Core::System& system_) : ServiceFramework{system_, "audout:u"} { 241AudOutU::AudOutU(Core::System& system_) : ServiceFramework{system_, "audout:u"} {
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index 1a91719f5..1f69d39cc 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -17,8 +17,6 @@
17#include "core/hle/ipc_helpers.h" 17#include "core/hle/ipc_helpers.h"
18#include "core/hle/kernel/hle_ipc.h" 18#include "core/hle/kernel/hle_ipc.h"
19#include "core/hle/kernel/k_event.h" 19#include "core/hle/kernel/k_event.h"
20#include "core/hle/kernel/k_readable_event.h"
21#include "core/hle/kernel/k_writable_event.h"
22#include "core/hle/kernel/kernel.h" 20#include "core/hle/kernel/kernel.h"
23#include "core/hle/service/audio/audren_u.h" 21#include "core/hle/service/audio/audren_u.h"
24#include "core/hle/service/audio/errors.h" 22#include "core/hle/service/audio/errors.h"
@@ -30,7 +28,7 @@ public:
30 explicit IAudioRenderer(Core::System& system_, 28 explicit IAudioRenderer(Core::System& system_,
31 const AudioCommon::AudioRendererParameter& audren_params, 29 const AudioCommon::AudioRendererParameter& audren_params,
32 const std::size_t instance_number) 30 const std::size_t instance_number)
33 : ServiceFramework{system_, "IAudioRenderer"}, system_event{system.Kernel()} { 31 : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"} {
34 // clang-format off 32 // clang-format off
35 static const FunctionInfo functions[] = { 33 static const FunctionInfo functions[] = {
36 {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"}, 34 {0, &IAudioRenderer::GetSampleRate, "GetSampleRate"},
@@ -49,17 +47,20 @@ public:
49 // clang-format on 47 // clang-format on
50 RegisterHandlers(functions); 48 RegisterHandlers(functions);
51 49
52 Kernel::KAutoObject::Create(std::addressof(system_event)); 50 system_event = service_context.CreateEvent("IAudioRenderer:SystemEvent");
53 system_event.Initialize("IAudioRenderer:SystemEvent");
54 renderer = std::make_unique<AudioCore::AudioRenderer>( 51 renderer = std::make_unique<AudioCore::AudioRenderer>(
55 system.CoreTiming(), system.Memory(), audren_params, 52 system.CoreTiming(), system.Memory(), audren_params,
56 [this]() { 53 [this]() {
57 const auto guard = LockService(); 54 const auto guard = LockService();
58 system_event.GetWritableEvent().Signal(); 55 system_event->GetWritableEvent().Signal();
59 }, 56 },
60 instance_number); 57 instance_number);
61 } 58 }
62 59
60 ~IAudioRenderer() override {
61 service_context.CloseEvent(system_event);
62 }
63
63private: 64private:
64 void GetSampleRate(Kernel::HLERequestContext& ctx) { 65 void GetSampleRate(Kernel::HLERequestContext& ctx) {
65 LOG_DEBUG(Service_Audio, "called"); 66 LOG_DEBUG(Service_Audio, "called");
@@ -130,7 +131,7 @@ private:
130 131
131 IPC::ResponseBuilder rb{ctx, 2, 1}; 132 IPC::ResponseBuilder rb{ctx, 2, 1};
132 rb.Push(ResultSuccess); 133 rb.Push(ResultSuccess);
133 rb.PushCopyObjects(system_event.GetReadableEvent()); 134 rb.PushCopyObjects(system_event->GetReadableEvent());
134 } 135 }
135 136
136 void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) { 137 void SetRenderingTimeLimit(Kernel::HLERequestContext& ctx) {
@@ -164,14 +165,16 @@ private:
164 rb.Push(ERR_NOT_SUPPORTED); 165 rb.Push(ERR_NOT_SUPPORTED);
165 } 166 }
166 167
167 Kernel::KEvent system_event; 168 KernelHelpers::ServiceContext service_context;
169
170 Kernel::KEvent* system_event;
168 std::unique_ptr<AudioCore::AudioRenderer> renderer; 171 std::unique_ptr<AudioCore::AudioRenderer> renderer;
169 u32 rendering_time_limit_percent = 100; 172 u32 rendering_time_limit_percent = 100;
170}; 173};
171 174
172class IAudioDevice final : public ServiceFramework<IAudioDevice> { 175class IAudioDevice final : public ServiceFramework<IAudioDevice> {
173public: 176public:
174 explicit IAudioDevice(Core::System& system_, Kernel::KEvent& buffer_event_, u32_le revision_) 177 explicit IAudioDevice(Core::System& system_, Kernel::KEvent* buffer_event_, u32_le revision_)
175 : ServiceFramework{system_, "IAudioDevice"}, buffer_event{buffer_event_}, revision{ 178 : ServiceFramework{system_, "IAudioDevice"}, buffer_event{buffer_event_}, revision{
176 revision_} { 179 revision_} {
177 static const FunctionInfo functions[] = { 180 static const FunctionInfo functions[] = {
@@ -279,11 +282,11 @@ private:
279 void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) { 282 void QueryAudioDeviceSystemEvent(Kernel::HLERequestContext& ctx) {
280 LOG_WARNING(Service_Audio, "(STUBBED) called"); 283 LOG_WARNING(Service_Audio, "(STUBBED) called");
281 284
282 buffer_event.GetWritableEvent().Signal(); 285 buffer_event->GetWritableEvent().Signal();
283 286
284 IPC::ResponseBuilder rb{ctx, 2, 1}; 287 IPC::ResponseBuilder rb{ctx, 2, 1};
285 rb.Push(ResultSuccess); 288 rb.Push(ResultSuccess);
286 rb.PushCopyObjects(buffer_event.GetReadableEvent()); 289 rb.PushCopyObjects(buffer_event->GetReadableEvent());
287 } 290 }
288 291
289 void GetActiveChannelCount(Kernel::HLERequestContext& ctx) { 292 void GetActiveChannelCount(Kernel::HLERequestContext& ctx) {
@@ -300,7 +303,7 @@ private:
300 303
301 IPC::ResponseBuilder rb{ctx, 2, 1}; 304 IPC::ResponseBuilder rb{ctx, 2, 1};
302 rb.Push(ResultSuccess); 305 rb.Push(ResultSuccess);
303 rb.PushCopyObjects(buffer_event.GetReadableEvent()); 306 rb.PushCopyObjects(buffer_event->GetReadableEvent());
304 } 307 }
305 308
306 void QueryAudioDeviceOutputEvent(Kernel::HLERequestContext& ctx) { 309 void QueryAudioDeviceOutputEvent(Kernel::HLERequestContext& ctx) {
@@ -308,16 +311,15 @@ private:
308 311
309 IPC::ResponseBuilder rb{ctx, 2, 1}; 312 IPC::ResponseBuilder rb{ctx, 2, 1};
310 rb.Push(ResultSuccess); 313 rb.Push(ResultSuccess);
311 rb.PushCopyObjects(buffer_event.GetReadableEvent()); 314 rb.PushCopyObjects(buffer_event->GetReadableEvent());
312 } 315 }
313 316
314 Kernel::KEvent& buffer_event; 317 Kernel::KEvent* buffer_event;
315 u32_le revision = 0; 318 u32_le revision = 0;
316}; 319};
317 320
318AudRenU::AudRenU(Core::System& system_) 321AudRenU::AudRenU(Core::System& system_)
319 : ServiceFramework{system_, "audren:u"}, buffer_event{system.Kernel()} { 322 : ServiceFramework{system_, "audren:u"}, service_context{system_, "audren:u"} {
320
321 // clang-format off 323 // clang-format off
322 static const FunctionInfo functions[] = { 324 static const FunctionInfo functions[] = {
323 {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, 325 {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"},
@@ -330,11 +332,12 @@ AudRenU::AudRenU(Core::System& system_)
330 332
331 RegisterHandlers(functions); 333 RegisterHandlers(functions);
332 334
333 Kernel::KAutoObject::Create(std::addressof(buffer_event)); 335 buffer_event = service_context.CreateEvent("IAudioOutBufferReleasedEvent");
334 buffer_event.Initialize("IAudioOutBufferReleasedEvent");
335} 336}
336 337
337AudRenU::~AudRenU() = default; 338AudRenU::~AudRenU() {
339 service_context.CloseEvent(buffer_event);
340}
338 341
339void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) { 342void AudRenU::OpenAudioRenderer(Kernel::HLERequestContext& ctx) {
340 LOG_DEBUG(Service_Audio, "called"); 343 LOG_DEBUG(Service_Audio, "called");
diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h
index 0ee6f9542..5922b4b27 100644
--- a/src/core/hle/service/audio/audren_u.h
+++ b/src/core/hle/service/audio/audren_u.h
@@ -4,7 +4,7 @@
4 4
5#pragma once 5#pragma once
6 6
7#include "core/hle/kernel/k_event.h" 7#include "core/hle/service/kernel_helpers.h"
8#include "core/hle/service/service.h" 8#include "core/hle/service/service.h"
9 9
10namespace Core { 10namespace Core {
@@ -31,8 +31,10 @@ private:
31 31
32 void OpenAudioRendererImpl(Kernel::HLERequestContext& ctx); 32 void OpenAudioRendererImpl(Kernel::HLERequestContext& ctx);
33 33
34 KernelHelpers::ServiceContext service_context;
35
34 std::size_t audren_instance_count = 0; 36 std::size_t audren_instance_count = 0;
35 Kernel::KEvent buffer_event; 37 Kernel::KEvent* buffer_event;
36}; 38};
37 39
38// Describes a particular audio feature that may be supported in a particular revision. 40// Describes a particular audio feature that may be supported in a particular revision.