command_generator.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // Copyright 2020 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 <span>
  7. #include "audio_core/common.h"
  8. #include "audio_core/voice_context.h"
  9. #include "common/common_types.h"
  10. namespace Core::Memory {
  11. class Memory;
  12. }
  13. namespace AudioCore {
  14. class MixContext;
  15. class SplitterContext;
  16. class ServerSplitterDestinationData;
  17. class ServerMixInfo;
  18. class EffectContext;
  19. class EffectBase;
  20. struct AuxInfoDSP;
  21. struct I3dl2ReverbParams;
  22. struct I3dl2ReverbState;
  23. using MixVolumeBuffer = std::array<float, AudioCommon::MAX_MIX_BUFFERS>;
  24. class CommandGenerator {
  25. public:
  26. explicit CommandGenerator(AudioCommon::AudioRendererParameter& worker_params_,
  27. VoiceContext& voice_context_, MixContext& mix_context_,
  28. SplitterContext& splitter_context_, EffectContext& effect_context_,
  29. Core::Memory::Memory& memory_);
  30. ~CommandGenerator();
  31. void ClearMixBuffers();
  32. void GenerateVoiceCommands();
  33. void GenerateVoiceCommand(ServerVoiceInfo& voice_info);
  34. void GenerateSubMixCommands();
  35. void GenerateFinalMixCommands();
  36. void PreCommand();
  37. void PostCommand();
  38. [[nodiscard]] std::span<s32> GetChannelMixBuffer(s32 channel);
  39. [[nodiscard]] std::span<const s32> GetChannelMixBuffer(s32 channel) const;
  40. [[nodiscard]] std::span<s32> GetMixBuffer(std::size_t index);
  41. [[nodiscard]] std::span<const s32> GetMixBuffer(std::size_t index) const;
  42. [[nodiscard]] std::size_t GetMixChannelBufferOffset(s32 channel) const;
  43. [[nodiscard]] std::size_t GetTotalMixBufferCount() const;
  44. private:
  45. void GenerateDataSourceCommand(ServerVoiceInfo& voice_info, VoiceState& dsp_state, s32 channel);
  46. void GenerateBiquadFilterCommandForVoice(ServerVoiceInfo& voice_info, VoiceState& dsp_state,
  47. s32 mix_buffer_count, s32 channel);
  48. void GenerateVolumeRampCommand(float last_volume, float current_volume, s32 channel,
  49. s32 node_id);
  50. void GenerateVoiceMixCommand(const MixVolumeBuffer& mix_volumes,
  51. const MixVolumeBuffer& last_mix_volumes, VoiceState& dsp_state,
  52. s32 mix_buffer_offset, s32 mix_buffer_count, s32 voice_index,
  53. s32 node_id);
  54. void GenerateSubMixCommand(ServerMixInfo& mix_info);
  55. void GenerateMixCommands(ServerMixInfo& mix_info);
  56. void GenerateMixCommand(std::size_t output_offset, std::size_t input_offset, float volume,
  57. s32 node_id);
  58. void GenerateFinalMixCommand();
  59. void GenerateBiquadFilterCommand(s32 mix_buffer, const BiquadFilterParameter& params,
  60. std::array<s64, 2>& state, std::size_t input_offset,
  61. std::size_t output_offset, s32 sample_count, s32 node_id);
  62. void GenerateDepopPrepareCommand(VoiceState& dsp_state, std::size_t mix_buffer_count,
  63. std::size_t mix_buffer_offset);
  64. void GenerateDepopForMixBuffersCommand(std::size_t mix_buffer_count,
  65. std::size_t mix_buffer_offset, s32 sample_rate);
  66. void GenerateEffectCommand(ServerMixInfo& mix_info);
  67. void GenerateI3dl2ReverbEffectCommand(s32 mix_buffer_offset, EffectBase* info, bool enabled);
  68. void GenerateBiquadFilterEffectCommand(s32 mix_buffer_offset, EffectBase* info, bool enabled);
  69. void GenerateAuxCommand(s32 mix_buffer_offset, EffectBase* info, bool enabled);
  70. [[nodiscard]] ServerSplitterDestinationData* GetDestinationData(s32 splitter_id, s32 index);
  71. s32 WriteAuxBuffer(AuxInfoDSP& dsp_info, VAddr send_buffer, u32 max_samples,
  72. std::span<const s32> data, u32 sample_count, u32 write_offset,
  73. u32 write_count);
  74. s32 ReadAuxBuffer(AuxInfoDSP& recv_info, VAddr recv_buffer, u32 max_samples,
  75. std::span<s32> out_data, u32 sample_count, u32 read_offset, u32 read_count);
  76. void InitializeI3dl2Reverb(I3dl2ReverbParams& info, I3dl2ReverbState& state,
  77. std::vector<u8>& work_buffer);
  78. void UpdateI3dl2Reverb(I3dl2ReverbParams& info, I3dl2ReverbState& state, bool should_clear);
  79. // DSP Code
  80. template <typename T>
  81. s32 DecodePcm(ServerVoiceInfo& voice_info, VoiceState& dsp_state, s32 sample_start_offset,
  82. s32 sample_end_offset, s32 sample_count, s32 channel, std::size_t mix_offset);
  83. s32 DecodeAdpcm(ServerVoiceInfo& voice_info, VoiceState& dsp_state, s32 sample_start_offset,
  84. s32 sample_end_offset, s32 sample_count, s32 channel, std::size_t mix_offset);
  85. void DecodeFromWaveBuffers(ServerVoiceInfo& voice_info, std::span<s32> output,
  86. VoiceState& dsp_state, s32 channel, s32 target_sample_rate,
  87. s32 sample_count, s32 node_id);
  88. AudioCommon::AudioRendererParameter& worker_params;
  89. VoiceContext& voice_context;
  90. MixContext& mix_context;
  91. SplitterContext& splitter_context;
  92. EffectContext& effect_context;
  93. Core::Memory::Memory& memory;
  94. std::vector<s32> mix_buffer{};
  95. std::vector<s32> sample_buffer{};
  96. std::vector<s32> depop_buffer{};
  97. bool dumping_frame{false};
  98. };
  99. } // namespace AudioCore