diff options
| -rw-r--r-- | src/core/hle/service/audio/audren_u.cpp | 41 | ||||
| -rw-r--r-- | src/core/hle/service/audio/audren_u.h | 1 | 
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 @@  // Refer to the license.txt file included.  #include "common/logging/log.h" +#include "core/core_timing.h"  #include "core/hle/ipc_helpers.h"  #include "core/hle/kernel/event.h"  #include "core/hle/kernel/hle_ipc.h" @@ -11,6 +12,9 @@  namespace Service {  namespace Audio { +/// TODO(bunnei): Find a proper value for the audio_ticks +constexpr u64 audio_ticks{static_cast<u64>(BASE_CLOCK_RATE / 200)}; +  class IAudioRenderer final : public ServiceFramework<IAudioRenderer> {  public:      IAudioRenderer() : ServiceFramework("IAudioRenderer") { @@ -30,10 +34,24 @@ public:          system_event =              Kernel::Event::Create(Kernel::ResetType::OneShot, "IAudioRenderer:SystemEvent"); + +        // Register event callback to update the Audio Buffer +        audio_event = CoreTiming::RegisterEvent( +            "IAudioRenderer::UpdateAudioCallback", [this](u64 userdata, int cycles_late) { +                UpdateAudioCallback(); +                CoreTiming::ScheduleEvent(audio_ticks - cycles_late, audio_event); +            }); + +        // Start the audio event +        CoreTiming::ScheduleEvent(audio_ticks, audio_event);      }      ~IAudioRenderer() = default;  private: +    void UpdateAudioCallback() { +        system_event->Signal(); +    } +      void RequestUpdateAudioRenderer(Kernel::HLERequestContext& ctx) {          AudioRendererResponseData response_data = {0}; @@ -126,15 +144,18 @@ private:      static_assert(sizeof(AudioRendererResponseData) == 0x20e0,                    "AudioRendererResponseData has wrong size"); +    /// This is used to trigger the audio event callback. +    CoreTiming::EventType* audio_event; +      Kernel::SharedPtr<Kernel::Event> system_event;  };  AudRenU::AudRenU() : ServiceFramework("audren:u") {      static const FunctionInfo functions[] = { -        {0x00000000, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, -        {0x00000001, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"}, -        {0x00000002, nullptr, "GetAudioRenderersProcessMasterVolume"}, -        {0x00000003, nullptr, "SetAudioRenderersProcessMasterVolume"}, +        {0, &AudRenU::OpenAudioRenderer, "OpenAudioRenderer"}, +        {1, &AudRenU::GetAudioRendererWorkBufferSize, "GetAudioRendererWorkBufferSize"}, +        {2, &AudRenU::GetAudioRenderersProcessMasterVolume, "GetAudioRenderersProcessMasterVolume"}, +        {3, nullptr, "SetAudioRenderersProcessMasterVolume"},      };      RegisterHandlers(functions);  } @@ -152,9 +173,17 @@ void AudRenU::GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx) {      IPC::ResponseBuilder rb{ctx, 4};      rb.Push(RESULT_SUCCESS); -    rb.Push<u64>(0x1000); +    rb.Push<u64>(0x400); + +    LOG_WARNING(Service_Audio, "(STUBBED) called"); +} + +void AudRenU::GetAudioRenderersProcessMasterVolume(Kernel::HLERequestContext& ctx) { +    IPC::ResponseBuilder rb{ctx, 2}; + +    rb.Push(RESULT_SUCCESS); -    LOG_WARNING(Service_Audio, "called"); +    LOG_WARNING(Service_Audio, "(STUBBED) called");  }  } // 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:  private:      void OpenAudioRenderer(Kernel::HLERequestContext& ctx);      void GetAudioRendererWorkBufferSize(Kernel::HLERequestContext& ctx); +    void GetAudioRenderersProcessMasterVolume(Kernel::HLERequestContext& ctx);  };  } // namespace Audio | 
