command_generator.h 5.1 KB

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