summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar bunnei2018-02-13 20:47:33 -0500
committerGravatar GitHub2018-02-13 20:47:33 -0500
commit0a55eb588b55a10ca8c864bbc82423a40245283d (patch)
treee59b5ab87924bb29a5b1fd03936c3cfe6d01ad86
parentMerge pull request #181 from bunnei/vi-fixes-2 (diff)
downloadyuzu-0a55eb588b55a10ca8c864bbc82423a40245283d.tar.gz
yuzu-0a55eb588b55a10ca8c864bbc82423a40245283d.tar.xz
yuzu-0a55eb588b55a10ca8c864bbc82423a40245283d.zip
audren_u: Schedule reoccuring event. (#183)
* audren_u: Schedule reoccuring event. * audren_u: Stub GetAudioRenderersProcessMasterVolume, and misc. changes.
-rw-r--r--src/core/hle/service/audio/audren_u.cpp41
-rw-r--r--src/core/hle/service/audio/audren_u.h1
2 files changed, 36 insertions, 6 deletions
diff --git a/src/core/hle/service/audio/audren_u.cpp b/src/core/hle/service/audio/audren_u.cpp
index 01f8ba4bb..c8d8ba748 100644
--- a/src/core/hle/service/audio/audren_u.cpp
+++ b/src/core/hle/service/audio/audren_u.cpp
@@ -3,6 +3,7 @@
3// Refer to the license.txt file included. 3// Refer to the license.txt file included.
4 4
5#include "common/logging/log.h" 5#include "common/logging/log.h"
6#include "core/core_timing.h"
6#include "core/hle/ipc_helpers.h" 7#include "core/hle/ipc_helpers.h"
7#include "core/hle/kernel/event.h" 8#include "core/hle/kernel/event.h"
8#include "core/hle/kernel/hle_ipc.h" 9#include "core/hle/kernel/hle_ipc.h"
@@ -11,6 +12,9 @@
11namespace Service { 12namespace Service {
12namespace Audio { 13namespace Audio {
13 14
15/// TODO(bunnei): Find a proper value for the audio_ticks
16constexpr u64 audio_ticks{static_cast<u64>(BASE_CLOCK_RATE / 200)};
17
14class IAudioRenderer final : public ServiceFramework<IAudioRenderer> { 18class IAudioRenderer final : public ServiceFramework<IAudioRenderer> {
15public: 19public:
16 IAudioRenderer() : ServiceFramework("IAudioRenderer") { 20 IAudioRenderer() : ServiceFramework("IAudioRenderer") {
@@ -30,10 +34,24 @@ public:
30 34
31 system_event = 35 system_event =
32 Kernel::Event::Create(Kernel::ResetType::OneShot, "IAudioRenderer:SystemEvent"); 36 Kernel::Event::Create(Kernel::ResetType::OneShot, "IAudioRenderer:SystemEvent");
37
38 // Register event callback to update the Audio Buffer
39 audio_event = CoreTiming::RegisterEvent(
40 "IAudioRenderer::UpdateAudioCallback", [this](u64 userdata, int cycles_late) {
41 UpdateAudioCallback();
42 CoreTiming::ScheduleEvent(audio_ticks - cycles_late, audio_event);
43 });
44
45 // Start the audio event
46 CoreTiming::ScheduleEvent(audio_ticks, audio_event);
33 } 47 }
34 ~IAudioRenderer() = default; 48 ~IAudioRenderer() = default;
35 49
36private: 50private:
51 void UpdateAudioCallback() {
52 system_event->Signal();
53 }
54
37 void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) { 55 void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {
38 AudioRendererResponseData response_data = {0}; 56 AudioRendererResponseData response_data = {0};
39 57
@@ -126,15 +144,18 @@ private:
126 static_assert(sizeof(AudioRendererResponseData) == 0x20e0, 144 static_assert(sizeof(AudioRendererResponseData) == 0x20e0,
127 "AudioRendererResponseData has wrong size"); 145 "AudioRendererResponseData has wrong size");
128 146
147 /// This is used to trigger the audio event callback.
148 CoreTiming::EventType* audio_event;
149
129 Kernel::SharedPtr<Kernel::Event> system_event; 150 Kernel::SharedPtr<Kernel::Event> system_event;
130}; 151};
131 152
132AudRenU::AudRenU() : ServiceFramework("audren:u") { 153AudRenU::AudRenU() : ServiceFramework("audren:u") {
133 static const FunctionInfo functions[] = { 154 static const FunctionInfo functions[] = {
134 {0x00000000, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, 155 {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"},
135 {0x00000001, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"}, 156 {1, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"},
136 {0x00000002, nullptr, "GetAudioRenderersProcessMasterVolume"}, 157 {2, &AudRenU::GetAudioRenderersProcessMasterVolume, "GetAudioRenderersProcessMasterVolume"},
137 {0x00000003, nullptr, "SetAudioRenderersProcessMasterVolume"}, 158 {3, nullptr, "SetAudioRenderersProcessMasterVolume"},
138 }; 159 };
139 RegisterHandlers(functions); 160 RegisterHandlers(functions);
140} 161}
@@ -152,9 +173,17 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {
152 IPC::ResponseBuilder rb{ctx, 4}; 173 IPC::ResponseBuilder rb{ctx, 4};
153 174
154 rb.Push(RESULT_SUCCESS); 175 rb.Push(RESULT_SUCCESS);
155 rb.Push<u64>(0x1000); 176 rb.Push<u64>(0x400);
177
178 LOG_WARNING(Service_Audio, "(STUBBED) called");
179}
180
181void AudRenU::GetAudioRenderersProcessMasterVolume(Kernel::HLERequestContext& ctx) {
182 IPC::ResponseBuilder rb{ctx, 2};
183
184 rb.Push(RESULT_SUCCESS);
156 185
157 LOG_WARNING(Service_Audio, "called"); 186 LOG_WARNING(Service_Audio, "(STUBBED) called");
158} 187}
159 188
160} // namespace Audio 189} // namespace Audio
diff --git a/src/core/hle/service/audio/audren_u.h b/src/core/hle/service/audio/audren_u.h
index e97543742..939d353a9 100644
--- a/src/core/hle/service/audio/audren_u.h
+++ b/src/core/hle/service/audio/audren_u.h
@@ -21,6 +21,7 @@ public:
21private: 21private:
22 void OpenAudioRenderer(Kernel::HLERequestContext& ctx); 22 void OpenAudioRenderer(Kernel::HLERequestContext& ctx);
23 void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); 23 void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx);
24 void GetAudioRenderersProcessMasterVolume(Kernel::HLERequestContext& ctx);
24}; 25};
25 26
26} // namespace Audio 27} // namespace Audio