audio_renderer.cpp 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #include "audio_core/audio_render_manager.h"
  4. #include "audio_core/common/audio_renderer_parameter.h"
  5. #include "audio_core/renderer/audio_renderer.h"
  6. #include "audio_core/renderer/system_manager.h"
  7. #include "core/core.h"
  8. #include "core/hle/kernel/k_transfer_memory.h"
  9. #include "core/hle/service/audio/errors.h"
  10. namespace AudioCore::Renderer {
  11. Renderer::Renderer(Core::System& system_, Manager& manager_, Kernel::KEvent* rendered_event)
  12. : core{system_}, manager{manager_}, system{system_, rendered_event} {}
  13. Result Renderer::Initialize(const AudioRendererParameterInternal& params,
  14. Kernel::KTransferMemory* transfer_memory,
  15. const u64 transfer_memory_size, const u32 process_handle,
  16. const u64 applet_resource_user_id, const s32 session_id) {
  17. if (params.execution_mode == ExecutionMode::Auto) {
  18. if (!manager.AddSystem(system)) {
  19. LOG_ERROR(Service_Audio,
  20. "Both Audio Render sessions are in use, cannot create any more");
  21. return Service::Audio::ResultOutOfSessions;
  22. }
  23. system_registered = true;
  24. }
  25. initialized = true;
  26. system.Initialize(params, transfer_memory, transfer_memory_size, process_handle,
  27. applet_resource_user_id, session_id);
  28. return ResultSuccess;
  29. }
  30. void Renderer::Finalize() {
  31. auto session_id{system.GetSessionId()};
  32. system.Finalize();
  33. if (system_registered) {
  34. manager.RemoveSystem(system);
  35. system_registered = false;
  36. }
  37. manager.ReleaseSessionId(session_id);
  38. }
  39. System& Renderer::GetSystem() {
  40. return system;
  41. }
  42. void Renderer::Start() {
  43. system.Start();
  44. }
  45. void Renderer::Stop() {
  46. system.Stop();
  47. }
  48. Result Renderer::RequestUpdate(std::span<const u8> input, std::span<u8> performance,
  49. std::span<u8> output) {
  50. return system.Update(input, performance, output);
  51. }
  52. } // namespace AudioCore::Renderer