audio_renderer.h 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // SPDX-FileCopyrightText: Copyright 2018 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <array>
  5. #include <memory>
  6. #include <mutex>
  7. #include <vector>
  8. #include "audio_core/behavior_info.h"
  9. #include "audio_core/command_generator.h"
  10. #include "audio_core/common.h"
  11. #include "audio_core/effect_context.h"
  12. #include "audio_core/memory_pool.h"
  13. #include "audio_core/mix_context.h"
  14. #include "audio_core/sink_context.h"
  15. #include "audio_core/splitter_context.h"
  16. #include "audio_core/stream.h"
  17. #include "audio_core/voice_context.h"
  18. #include "common/common_funcs.h"
  19. #include "common/common_types.h"
  20. #include "common/swap.h"
  21. #include "core/hle/result.h"
  22. namespace Core::Timing {
  23. class CoreTiming;
  24. }
  25. namespace Core::Memory {
  26. class Memory;
  27. }
  28. namespace AudioCore {
  29. using DSPStateHolder = std::array<VoiceState*, AudioCommon::MAX_CHANNEL_COUNT>;
  30. class AudioOut;
  31. class AudioRenderer {
  32. public:
  33. AudioRenderer(Core::Timing::CoreTiming& core_timing, Core::Memory::Memory& memory_,
  34. AudioCommon::AudioRendererParameter params,
  35. Stream::ReleaseCallback&& release_callback, std::size_t instance_number);
  36. ~AudioRenderer();
  37. [[nodiscard]] Result UpdateAudioRenderer(const std::vector<u8>& input_params,
  38. std::vector<u8>& output_params);
  39. [[nodiscard]] Result Start();
  40. [[nodiscard]] Result Stop();
  41. void QueueMixedBuffer(Buffer::Tag tag);
  42. void ReleaseAndQueueBuffers();
  43. [[nodiscard]] u32 GetSampleRate() const;
  44. [[nodiscard]] u32 GetSampleCount() const;
  45. [[nodiscard]] u32 GetMixBufferCount() const;
  46. [[nodiscard]] Stream::State GetStreamState() const;
  47. private:
  48. BehaviorInfo behavior_info{};
  49. AudioCommon::AudioRendererParameter worker_params;
  50. std::vector<ServerMemoryPoolInfo> memory_pool_info;
  51. VoiceContext voice_context;
  52. EffectContext effect_context;
  53. MixContext mix_context;
  54. SinkContext sink_context;
  55. SplitterContext splitter_context;
  56. std::vector<VoiceState> voices;
  57. std::unique_ptr<AudioOut> audio_out;
  58. StreamPtr stream;
  59. Core::Memory::Memory& memory;
  60. CommandGenerator command_generator;
  61. std::size_t elapsed_frame_count{};
  62. Core::Timing::CoreTiming& core_timing;
  63. std::shared_ptr<Core::Timing::EventType> process_event;
  64. std::mutex mutex;
  65. };
  66. } // namespace AudioCore