mix_context.h 3.5 KB

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