command_generator.h 4.8 KB

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