audio_renderer.h 2.4 KB

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