mix_context.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  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 <vector>
  7. #include "audio_core/common.h"
  8. #include "audio_core/splitter_context.h"
  9. #include "common/common_funcs.h"
  10. #include "common/common_types.h"
  11. namespace AudioCore {
  12. class BehaviorInfo;
  13. class EffectContext;
  14. class MixInfo {
  15. public:
  16. struct DirtyHeader {
  17. u32_le magic{};
  18. u32_le mixer_count{};
  19. INSERT_PADDING_BYTES(0x18);
  20. };
  21. static_assert(sizeof(DirtyHeader) == 0x20, "MixInfo::DirtyHeader is an invalid size");
  22. struct InParams {
  23. float_le volume{};
  24. s32_le sample_rate{};
  25. s32_le buffer_count{};
  26. bool in_use{};
  27. INSERT_PADDING_BYTES(3);
  28. s32_le mix_id{};
  29. s32_le effect_count{};
  30. u32_le node_id{};
  31. INSERT_PADDING_WORDS(2);
  32. std::array<std::array<float_le, AudioCommon::MAX_MIX_BUFFERS>, AudioCommon::MAX_MIX_BUFFERS>
  33. mix_volume{};
  34. s32_le dest_mix_id{};
  35. s32_le splitter_id{};
  36. INSERT_PADDING_WORDS(1);
  37. };
  38. static_assert(sizeof(MixInfo::InParams) == 0x930, "MixInfo::InParams is an invalid size");
  39. };
  40. class ServerMixInfo {
  41. public:
  42. struct InParams {
  43. float volume{};
  44. s32 sample_rate{};
  45. s32 buffer_count{};
  46. bool in_use{};
  47. s32 mix_id{};
  48. u32 node_id{};
  49. std::array<std::array<float_le, AudioCommon::MAX_MIX_BUFFERS>, AudioCommon::MAX_MIX_BUFFERS>
  50. mix_volume{};
  51. s32 dest_mix_id{};
  52. s32 splitter_id{};
  53. s32 buffer_offset{};
  54. s32 final_mix_distance{};
  55. };
  56. ServerMixInfo();
  57. ~ServerMixInfo();
  58. [[nodiscard]] const ServerMixInfo::InParams& GetInParams() const;
  59. [[nodiscard]] ServerMixInfo::InParams& GetInParams();
  60. bool Update(EdgeMatrix& edge_matrix, const MixInfo::InParams& mix_in,
  61. BehaviorInfo& behavior_info, SplitterContext& splitter_context,
  62. EffectContext& effect_context);
  63. [[nodiscard]] bool HasAnyConnection() const;
  64. void Cleanup();
  65. void SetEffectCount(std::size_t count);
  66. void ResetEffectProcessingOrder();
  67. [[nodiscard]] s32 GetEffectOrder(std::size_t i) const;
  68. private:
  69. std::vector<s32> effect_processing_order;
  70. InParams in_params{};
  71. bool UpdateConnection(EdgeMatrix& edge_matrix, const MixInfo::InParams& mix_in,
  72. SplitterContext& splitter_context);
  73. };
  74. class MixContext {
  75. public:
  76. MixContext();
  77. ~MixContext();
  78. void Initialize(const BehaviorInfo& behavior_info, std::size_t mix_count,
  79. std::size_t effect_count);
  80. void SortInfo();
  81. bool TsortInfo(SplitterContext& splitter_context);
  82. [[nodiscard]] std::size_t GetCount() const;
  83. [[nodiscard]] ServerMixInfo& GetInfo(std::size_t i);
  84. [[nodiscard]] const ServerMixInfo& GetInfo(std::size_t i) const;
  85. [[nodiscard]] ServerMixInfo& GetSortedInfo(std::size_t i);
  86. [[nodiscard]] const ServerMixInfo& GetSortedInfo(std::size_t i) const;
  87. [[nodiscard]] ServerMixInfo& GetFinalMixInfo();
  88. [[nodiscard]] const ServerMixInfo& GetFinalMixInfo() const;
  89. [[nodiscard]] EdgeMatrix& GetEdgeMatrix();
  90. [[nodiscard]] const EdgeMatrix& GetEdgeMatrix() const;
  91. private:
  92. void CalcMixBufferOffset();
  93. void UpdateDistancesFromFinalMix();
  94. NodeStates node_states{};
  95. EdgeMatrix edge_matrix{};
  96. std::size_t info_count{};
  97. std::vector<ServerMixInfo> infos{};
  98. std::vector<ServerMixInfo*> sorted_info{};
  99. };
  100. } // namespace AudioCore