summaryrefslogtreecommitdiff
path: root/src/audio_core/splitter_context.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/audio_core/splitter_context.h')
-rw-r--r--src/audio_core/splitter_context.h218
1 files changed, 0 insertions, 218 deletions
diff --git a/src/audio_core/splitter_context.h b/src/audio_core/splitter_context.h
deleted file mode 100644
index 3a4b055eb..000000000
--- a/src/audio_core/splitter_context.h
+++ /dev/null
@@ -1,218 +0,0 @@
1// SPDX-FileCopyrightText: Copyright 2020 yuzu Emulator Project
2// SPDX-License-Identifier: GPL-2.0-or-later
3
4#pragma once
5
6#include <stack>
7#include <vector>
8#include "audio_core/common.h"
9#include "common/common_funcs.h"
10#include "common/common_types.h"
11#include "common/swap.h"
12
13namespace AudioCore {
14class BehaviorInfo;
15
16class EdgeMatrix {
17public:
18 EdgeMatrix();
19 ~EdgeMatrix();
20
21 void Initialize(std::size_t _node_count);
22 bool Connected(s32 a, s32 b);
23 void Connect(s32 a, s32 b);
24 void Disconnect(s32 a, s32 b);
25 void RemoveEdges(s32 edge);
26 std::size_t GetNodeCount() const;
27
28private:
29 void SetState(s32 a, s32 b, bool state);
30 bool GetState(s32 a, s32 b);
31
32 bool InRange(s32 a, s32 b) const;
33 std::vector<bool> edge_matrix{};
34 std::size_t node_count{};
35};
36
37class NodeStates {
38public:
39 enum class State {
40 NoState = 0,
41 InFound = 1,
42 InCompleted = 2,
43 };
44
45 // Looks to be a fixed size stack. Placed within the NodeStates class based on symbols
46 class Stack {
47 public:
48 Stack();
49 ~Stack();
50
51 void Reset(std::size_t size);
52 void push(s32 val);
53 std::size_t Count() const;
54 s32 top() const;
55 s32 pop();
56
57 private:
58 std::vector<s32> stack{};
59 std::size_t stack_size{};
60 std::size_t stack_pos{};
61 };
62 NodeStates();
63 ~NodeStates();
64
65 void Initialize(std::size_t node_count_);
66 bool Tsort(EdgeMatrix& edge_matrix);
67 std::size_t GetIndexPos() const;
68 const std::vector<s32>& GetIndexList() const;
69
70private:
71 void PushTsortResult(s32 index);
72 bool DepthFirstSearch(EdgeMatrix& edge_matrix);
73 void ResetState();
74 void UpdateState(State state, std::size_t i);
75 State GetState(std::size_t i);
76
77 std::size_t node_count{};
78 std::vector<bool> was_node_found{};
79 std::vector<bool> was_node_completed{};
80 std::size_t index_pos{};
81 std::vector<s32> index_list{};
82 Stack index_stack{};
83};
84
85enum class SplitterMagic : u32_le {
86 SplitterHeader = Common::MakeMagic('S', 'N', 'D', 'H'),
87 DataHeader = Common::MakeMagic('S', 'N', 'D', 'D'),
88 InfoHeader = Common::MakeMagic('S', 'N', 'D', 'I'),
89};
90
91class SplitterInfo {
92public:
93 struct InHeader {
94 SplitterMagic magic{};
95 s32_le info_count{};
96 s32_le data_count{};
97 INSERT_PADDING_WORDS(5);
98 };
99 static_assert(sizeof(InHeader) == 0x20, "SplitterInfo::InHeader is an invalid size");
100
101 struct InInfoPrams {
102 SplitterMagic magic{};
103 s32_le send_id{};
104 s32_le sample_rate{};
105 s32_le length{};
106 s32_le resource_id_base{};
107 };
108 static_assert(sizeof(InInfoPrams) == 0x14, "SplitterInfo::InInfoPrams is an invalid size");
109
110 struct InDestinationParams {
111 SplitterMagic magic{};
112 s32_le splitter_id{};
113 std::array<float_le, AudioCommon::MAX_MIX_BUFFERS> mix_volumes{};
114 s32_le mix_id{};
115 bool in_use{};
116 INSERT_PADDING_BYTES(3);
117 };
118 static_assert(sizeof(InDestinationParams) == 0x70,
119 "SplitterInfo::InDestinationParams is an invalid size");
120};
121
122class ServerSplitterDestinationData {
123public:
124 explicit ServerSplitterDestinationData(s32 id_);
125 ~ServerSplitterDestinationData();
126
127 void Update(SplitterInfo::InDestinationParams& header);
128
129 ServerSplitterDestinationData* GetNextDestination();
130 const ServerSplitterDestinationData* GetNextDestination() const;
131 void SetNextDestination(ServerSplitterDestinationData* dest);
132 bool ValidMixId() const;
133 s32 GetMixId() const;
134 bool IsConfigured() const;
135 float GetMixVolume(std::size_t i) const;
136 const std::array<float, AudioCommon::MAX_MIX_BUFFERS>& CurrentMixVolumes() const;
137 const std::array<float, AudioCommon::MAX_MIX_BUFFERS>& LastMixVolumes() const;
138 void MarkDirty();
139 void UpdateInternalState();
140
141private:
142 bool needs_update{};
143 bool in_use{};
144 s32 id{};
145 s32 mix_id{};
146 std::array<float, AudioCommon::MAX_MIX_BUFFERS> current_mix_volumes{};
147 std::array<float, AudioCommon::MAX_MIX_BUFFERS> last_mix_volumes{};
148 ServerSplitterDestinationData* next = nullptr;
149};
150
151class ServerSplitterInfo {
152public:
153 explicit ServerSplitterInfo(s32 id_);
154 ~ServerSplitterInfo();
155
156 void InitializeInfos();
157 void ClearNewConnectionFlag();
158 std::size_t Update(SplitterInfo::InInfoPrams& header);
159
160 ServerSplitterDestinationData* GetHead();
161 const ServerSplitterDestinationData* GetHead() const;
162 ServerSplitterDestinationData* GetData(std::size_t depth);
163 const ServerSplitterDestinationData* GetData(std::size_t depth) const;
164
165 bool HasNewConnection() const;
166 s32 GetLength() const;
167
168 void SetHead(ServerSplitterDestinationData* new_head);
169 void SetHeadDepth(s32 length);
170
171private:
172 s32 sample_rate{};
173 s32 id{};
174 s32 send_length{};
175 ServerSplitterDestinationData* head = nullptr;
176 bool new_connection{};
177};
178
179class SplitterContext {
180public:
181 SplitterContext();
182 ~SplitterContext();
183
184 void Initialize(BehaviorInfo& behavior_info, std::size_t splitter_count,
185 std::size_t data_count);
186
187 bool Update(const std::vector<u8>& input, std::size_t& input_offset, std::size_t& bytes_read);
188 bool UsingSplitter() const;
189
190 ServerSplitterInfo& GetInfo(std::size_t i);
191 const ServerSplitterInfo& GetInfo(std::size_t i) const;
192 ServerSplitterDestinationData& GetData(std::size_t i);
193 const ServerSplitterDestinationData& GetData(std::size_t i) const;
194 ServerSplitterDestinationData* GetDestinationData(std::size_t info, std::size_t data);
195 const ServerSplitterDestinationData* GetDestinationData(std::size_t info,
196 std::size_t data) const;
197 void UpdateInternalState();
198
199 std::size_t GetInfoCount() const;
200 std::size_t GetDataCount() const;
201
202private:
203 void Setup(std::size_t info_count, std::size_t data_count, bool is_splitter_bug_fixed);
204 bool UpdateInfo(const std::vector<u8>& input, std::size_t& input_offset,
205 std::size_t& bytes_read, s32 in_splitter_count);
206 bool UpdateData(const std::vector<u8>& input, std::size_t& input_offset,
207 std::size_t& bytes_read, s32 in_data_count);
208 bool RecomposeDestination(ServerSplitterInfo& info, SplitterInfo::InInfoPrams& header,
209 const std::vector<u8>& input, const std::size_t& input_offset);
210
211 std::vector<ServerSplitterInfo> infos{};
212 std::vector<ServerSplitterDestinationData> datas{};
213
214 std::size_t info_count{};
215 std::size_t data_count{};
216 bool bug_fixed{};
217};
218} // namespace AudioCore