audio_renderer.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. // SPDX-FileCopyrightText: Copyright 2024 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "core/hle/service/audio/audio_renderer.h"
  4. #include "core/hle/service/cmif_serialization.h"
  5. namespace Service::Audio {
  6. using namespace AudioCore::Renderer;
  7. IAudioRenderer::IAudioRenderer(Core::System& system_, Manager& manager_,
  8. AudioCore::AudioRendererParameterInternal& params,
  9. Kernel::KTransferMemory* transfer_memory, u64 transfer_memory_size,
  10. Kernel::KProcess* process_handle_, u64 applet_resource_user_id,
  11. s32 session_id)
  12. : ServiceFramework{system_, "IAudioRenderer"}, service_context{system_, "IAudioRenderer"},
  13. rendered_event{service_context.CreateEvent("IAudioRendererEvent")}, manager{manager_},
  14. impl{std::make_unique<Renderer>(system_, manager, rendered_event)}, process_handle{
  15. process_handle_} {
  16. // clang-format off
  17. static const FunctionInfo functions[] = {
  18. {0, D<&IAudioRenderer::GetSampleRate>, "GetSampleRate"},
  19. {1, D<&IAudioRenderer::GetSampleCount>, "GetSampleCount"},
  20. {2, D<&IAudioRenderer::GetMixBufferCount>, "GetMixBufferCount"},
  21. {3, D<&IAudioRenderer::GetState>, "GetState"},
  22. {4, D<&IAudioRenderer::RequestUpdate>, "RequestUpdate"},
  23. {5, D<&IAudioRenderer::Start>, "Start"},
  24. {6, D<&IAudioRenderer::Stop>, "Stop"},
  25. {7, D<&IAudioRenderer::QuerySystemEvent>, "QuerySystemEvent"},
  26. {8, D<&IAudioRenderer::SetRenderingTimeLimit>, "SetRenderingTimeLimit"},
  27. {9, D<&IAudioRenderer::GetRenderingTimeLimit>, "GetRenderingTimeLimit"},
  28. {10, D<&IAudioRenderer::RequestUpdateAuto>, "RequestUpdateAuto"},
  29. {11, nullptr, "ExecuteAudioRendererRendering"},
  30. {12, D<&IAudioRenderer::SetVoiceDropParameter>, "SetVoiceDropParameter"},
  31. {13, D<&IAudioRenderer::GetVoiceDropParameter>, "GetVoiceDropParameter"},
  32. };
  33. // clang-format on
  34. RegisterHandlers(functions);
  35. process_handle->Open();
  36. impl->Initialize(params, transfer_memory, transfer_memory_size, process_handle,
  37. applet_resource_user_id, session_id);
  38. }
  39. IAudioRenderer::~IAudioRenderer() {
  40. impl->Finalize();
  41. service_context.CloseEvent(rendered_event);
  42. process_handle->Close();
  43. }
  44. Result IAudioRenderer::GetSampleRate(Out<u32> out_sample_rate) {
  45. *out_sample_rate = impl->GetSystem().GetSampleRate();
  46. LOG_DEBUG(Service_Audio, "called. Sample rate {}", *out_sample_rate);
  47. R_SUCCEED();
  48. }
  49. Result IAudioRenderer::GetSampleCount(Out<u32> out_sample_count) {
  50. *out_sample_count = impl->GetSystem().GetSampleCount();
  51. LOG_DEBUG(Service_Audio, "called. Sample count {}", *out_sample_count);
  52. R_SUCCEED();
  53. }
  54. Result IAudioRenderer::GetState(Out<u32> out_state) {
  55. *out_state = !impl->GetSystem().IsActive();
  56. LOG_DEBUG(Service_Audio, "called, state {}", *out_state);
  57. R_SUCCEED();
  58. }
  59. Result IAudioRenderer::GetMixBufferCount(Out<u32> out_mix_buffer_count) {
  60. LOG_DEBUG(Service_Audio, "called");
  61. *out_mix_buffer_count = impl->GetSystem().GetMixBufferCount();
  62. R_SUCCEED();
  63. }
  64. Result IAudioRenderer::RequestUpdate(OutBuffer<BufferAttr_HipcMapAlias> out_buffer,
  65. OutBuffer<BufferAttr_HipcMapAlias> out_performance_buffer,
  66. InBuffer<BufferAttr_HipcMapAlias> input) {
  67. R_RETURN(this->RequestUpdateAuto(out_buffer, out_performance_buffer, input));
  68. }
  69. Result IAudioRenderer::RequestUpdateAuto(
  70. OutBuffer<BufferAttr_HipcAutoSelect> out_buffer,
  71. OutBuffer<BufferAttr_HipcAutoSelect> out_performance_buffer,
  72. InBuffer<BufferAttr_HipcAutoSelect> input) {
  73. LOG_TRACE(Service_Audio, "called");
  74. const auto result = impl->RequestUpdate(input, out_performance_buffer, out_buffer);
  75. if (result.IsFailure()) {
  76. LOG_ERROR(Service_Audio, "RequestUpdate failed error 0x{:02X}!", result.GetDescription());
  77. }
  78. R_RETURN(result);
  79. }
  80. Result IAudioRenderer::Start() {
  81. LOG_DEBUG(Service_Audio, "called");
  82. impl->Start();
  83. R_SUCCEED();
  84. }
  85. Result IAudioRenderer::Stop() {
  86. LOG_DEBUG(Service_Audio, "called");
  87. impl->Stop();
  88. R_SUCCEED();
  89. }
  90. Result IAudioRenderer::QuerySystemEvent(OutCopyHandle<Kernel::KReadableEvent> out_event) {
  91. LOG_DEBUG(Service_Audio, "called");
  92. R_UNLESS(impl->GetSystem().GetExecutionMode() != AudioCore::ExecutionMode::Manual,
  93. Audio::ResultNotSupported);
  94. *out_event = &rendered_event->GetReadableEvent();
  95. R_SUCCEED();
  96. }
  97. Result IAudioRenderer::SetRenderingTimeLimit(u32 rendering_time_limit) {
  98. LOG_DEBUG(Service_Audio, "called");
  99. impl->GetSystem().SetRenderingTimeLimit(rendering_time_limit);
  100. ;
  101. R_SUCCEED();
  102. }
  103. Result IAudioRenderer::GetRenderingTimeLimit(Out<u32> out_rendering_time_limit) {
  104. LOG_DEBUG(Service_Audio, "called");
  105. *out_rendering_time_limit = impl->GetSystem().GetRenderingTimeLimit();
  106. R_SUCCEED();
  107. }
  108. Result IAudioRenderer::SetVoiceDropParameter(f32 voice_drop_parameter) {
  109. LOG_DEBUG(Service_Audio, "called");
  110. impl->GetSystem().SetVoiceDropParameter(voice_drop_parameter);
  111. R_SUCCEED();
  112. }
  113. Result IAudioRenderer::GetVoiceDropParameter(Out<f32> out_voice_drop_parameter) {
  114. LOG_DEBUG(Service_Audio, "called");
  115. *out_voice_drop_parameter = impl->GetSystem().GetVoiceDropParameter();
  116. R_SUCCEED();
  117. }
  118. } // namespace Service::Audio