Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches
LegacyAudioSystem.cs
Go to the documentation of this file.
1using System;
4using System.IO;
5using Microsoft.Xna.Framework.Audio;
7
8namespace Terraria.Audio;
9
11{
13
14 public int MusicReplayDelay;
15
16 public AudioEngine Engine;
17
18 public SoundBank SoundBank;
19
20 public WaveBank WaveBank;
21
23
25
27
28 public void LoadFromSources()
29 {
31 for (int i = 0; i < AudioTracks.Length; i++)
32 {
34 {
35 string assetPath = "Music" + Path.DirectorySeparatorChar + value;
39 if (audioTrack3 != null)
40 {
42 }
43 if (AudioTracks[i] != audioTrack2)
44 {
45 AudioTracks[i].Stop(AudioStopOptions.Immediate);
46 }
47 if (AudioTracks[i] != audioTrack)
48 {
50 }
52 }
53 }
54 }
55
61
62 public void Update()
63 {
64 if (!WaveBank.IsPrepared)
65 {
66 return;
67 }
68 for (int i = 0; i < AudioTracks.Length; i++)
69 {
70 if (AudioTracks[i] != null)
71 {
73 }
74 }
75 }
76
78 {
80 for (int i = 0; i < sources.Count; i++)
81 {
82 IContentSource val = sources[i];
83 if (!val.HasAsset(assetPath))
84 {
85 continue;
86 }
87 string extension = val.GetExtension(assetPath);
88 try
89 {
91 switch (extension)
92 {
93 case ".ogg":
95 break;
96 case ".wav":
98 break;
99 case ".mp3":
101 break;
102 }
103 if (audioTrack2 != null)
104 {
105 audioTrack?.Dispose();
107 }
108 }
109 catch
110 {
111 string textToShow = "A resource pack failed to load " + assetPath + "!";
112 Main.IssueReporter.AddReport(textToShow);
113 Main.IssueReporterIndicator.AttemptLettingPlayerKnow();
114 }
115 }
116 return audioTrack;
117 }
118
120 {
121 Engine = new AudioEngine("Content\\TerrariaMusic.xgs");
122 SoundBank = new SoundBank(Engine, "Content\\Sound Bank.xsb");
123 Engine.Update();
124 WaveBank = new WaveBank(Engine, "Content\\Wave Bank.xwb", 0, 512);
125 Engine.Update();
129 }
130
132 {
133 while (!WaveBank.IsPrepared)
134 {
135 Engine.Update();
136 yield return null;
137 }
138 }
139
147
148 public void UpdateMisc()
149 {
150 if (Main.curMusic != Main.newMusic)
151 {
153 }
154 if (MusicReplayDelay > 0)
155 {
157 }
158 }
159
160 public void PauseAll()
161 {
162 if (!WaveBank.IsPrepared)
163 {
164 return;
165 }
166 float[] musicFade = Main.musicFade;
167 for (int i = 0; i < AudioTracks.Length; i++)
168 {
169 if (AudioTracks[i] != null && !AudioTracks[i].IsPaused && AudioTracks[i].IsPlaying && musicFade[i] > 0f)
170 {
171 try
172 {
173 AudioTracks[i].Pause();
174 }
175 catch (Exception)
176 {
177 }
178 }
179 }
180 }
181
182 public void ResumeAll()
183 {
184 if (!WaveBank.IsPrepared)
185 {
186 return;
187 }
188 float[] musicFade = Main.musicFade;
189 for (int i = 0; i < AudioTracks.Length; i++)
190 {
191 if (AudioTracks[i] != null && AudioTracks[i].IsPaused && musicFade[i] > 0f)
192 {
193 try
194 {
195 AudioTracks[i].Resume();
196 }
197 catch (Exception)
198 {
199 }
200 }
201 }
202 }
203
204 public void UpdateAmbientCueState(int i, bool gameIsActive, ref float trackVolume, float systemVolume)
205 {
206 if (!WaveBank.IsPrepared)
207 {
208 return;
209 }
210 if (systemVolume == 0f)
211 {
212 if (AudioTracks[i].IsPlaying)
213 {
214 AudioTracks[i].Stop(AudioStopOptions.Immediate);
215 }
216 return;
217 }
218 if (!AudioTracks[i].IsPlaying)
219 {
220 AudioTracks[i].Reuse();
221 AudioTracks[i].Play();
223 return;
224 }
225 if (AudioTracks[i].IsPaused && gameIsActive)
226 {
227 AudioTracks[i].Resume();
228 return;
229 }
230 trackVolume += 0.005f;
231 if (trackVolume > 1f)
232 {
233 trackVolume = 1f;
234 }
236 }
237
239 {
240 if (!WaveBank.IsPrepared)
241 {
242 return;
243 }
244 if (!AudioTracks[i].IsPlaying)
245 {
246 trackVolume = 0f;
247 return;
248 }
249 if (trackVolume > 0f)
250 {
252 if (trackVolume < 0f)
253 {
254 trackVolume = 0f;
255 }
256 }
257 if (trackVolume <= 0f)
258 {
259 AudioTracks[i].Stop(AudioStopOptions.Immediate);
260 }
261 else
262 {
264 }
265 }
266
267 public bool IsTrackPlaying(int trackIndex)
268 {
269 if (!WaveBank.IsPrepared)
270 {
271 return false;
272 }
274 }
275
276 public void UpdateCommonTrack(bool active, int i, float totalVolume, ref float tempFade)
277 {
278 if (!WaveBank.IsPrepared)
279 {
280 return;
281 }
282 tempFade += 0.005f;
283 if (tempFade > 1f)
284 {
285 tempFade = 1f;
286 }
287 if (!AudioTracks[i].IsPlaying && active)
288 {
289 if (MusicReplayDelay == 0)
290 {
292 {
293 MusicReplayDelay = Main.rand.Next(14400, 21601);
294 }
295 AudioTracks[i].Reuse();
296 AudioTracks[i].SetVariable("Volume", totalVolume);
297 AudioTracks[i].Play();
298 }
299 }
300 else
301 {
302 AudioTracks[i].SetVariable("Volume", totalVolume);
303 }
304 }
305
307 {
308 if (!WaveBank.IsPrepared)
309 {
310 return;
311 }
312 if (AudioTracks[i].IsPlaying || !AudioTracks[i].IsStopped)
313 {
315 {
316 tempFade -= 0.005f;
317 }
318 else if (Main.curMusic == 0)
319 {
320 tempFade = 0f;
321 }
322 if (tempFade <= 0f)
323 {
324 tempFade = 0f;
325 AudioTracks[i].SetVariable("Volume", 0f);
326 AudioTracks[i].Stop(AudioStopOptions.Immediate);
327 }
328 else
329 {
330 AudioTracks[i].SetVariable("Volume", totalVolume);
331 }
332 }
333 else
334 {
335 tempFade = 0f;
336 }
337 }
338
339 public void UpdateAudioEngine()
340 {
341 Engine.Update();
342 }
343
344 public void Dispose()
345 {
346 SoundBank.Dispose();
347 WaveBank.Dispose();
348 Engine.Dispose();
349 }
350}
bool TryGetValue(TKey key, [MaybeNullWhen(false)] out TValue value)
void UpdateAmbientCueState(int i, bool gameIsActive, ref float trackVolume, float systemVolume)
Dictionary< int, IAudioTrack > DefaultTrackByIndex
void UpdateAmbientCueTowardStopping(int i, float stoppingSpeed, ref float trackVolume, float systemVolume)
void UpdateCommonTrack(bool active, int i, float totalVolume, ref float tempFade)
void UpdateCommonTrackTowardStopping(int i, float totalVolume, ref float tempFade, bool isMainTrackAudible)
IAudioTrack FindReplacementTrack(List< IContentSource > sources, string assetPath)
Dictionary< int, string > TrackNamesByIndex
void UseSources(List< IContentSource > sourcesFromLowestToHighest)
void LoadCue(int cueIndex, string cueName)
List< IContentSource > FileSources
static readonly int maxMusic
Definition Main.cs:447
static float[] musicFade
Definition Main.cs:1419
static IssueReportsIndicator IssueReporterIndicator
Definition Main.cs:1882
static UnifiedRandom rand
Definition Main.cs:1387
static int newMusic
Definition Main.cs:1236
static GeneralIssueReporter IssueReporter
Definition Main.cs:2291
static bool SettingMusicReplayDelayEnabled
Definition Main.cs:255
static int curMusic
Definition Main.cs:1230
Stream OpenStream(string fullAssetName)
Must be threadsafe!
bool HasAsset(string assetName)
Checks Rejections and GetExtension to determine if an asset exists.
string GetExtension(string assetName)
Must be threadsafe!
void SetVariable(string variableName, float value)
void Stop(AudioStopOptions options)