Skip to content

Commit 73b9440

Browse files
committed
添加项目文件。
1 parent 44106cc commit 73b9440

File tree

1,374 files changed

+194547
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,374 files changed

+194547
-0
lines changed
+243
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,243 @@
1+
using Android.Media;
2+
using System;
3+
using System.Collections.Generic;
4+
5+
namespace Engine.Audio
6+
{
7+
internal static class AudioTrackCache
8+
{
9+
public class AudioTrackData
10+
{
11+
public AudioTrack AudioTrack;
12+
13+
public SoundBuffer SoundBuffer;
14+
15+
public int BytesCount;
16+
17+
public double ReloadStaticDataTime;
18+
19+
public bool IsAvailable;
20+
}
21+
22+
public const int MaxCacheSize = 16;
23+
24+
public static List<AudioTrackData> m_audioTracks;
25+
26+
public static byte[] m_buffer;
27+
28+
public static int m_cacheHits;
29+
30+
public static int m_cacheHitsWithWrite;
31+
32+
public static int m_cacheMisses;
33+
34+
public static int m_cacheFulls;
35+
36+
static AudioTrackCache()
37+
{
38+
m_audioTracks = new List<AudioTrackData>();
39+
Window.Frame += Frame;
40+
Window.Deactivated += Deactivated;
41+
}
42+
43+
public static int GetAudioTrackBytesCount(AudioTrack audioTrack)
44+
{
45+
foreach (AudioTrackData audioTrack2 in m_audioTracks)
46+
{
47+
if (audioTrack2.AudioTrack == audioTrack)
48+
{
49+
return audioTrack2.BytesCount;
50+
}
51+
}
52+
return 0;
53+
}
54+
55+
public static AudioTrack GetAudioTrack(SoundBuffer soundBuffer, bool isLooped)
56+
{
57+
if (!isLooped && Mixer.EnableAudioTrackCaching && m_audioTracks.Count >= 16)
58+
{
59+
foreach (AudioTrackData audioTrack2 in m_audioTracks)
60+
{
61+
if (audioTrack2.IsAvailable && audioTrack2.SoundBuffer == soundBuffer)
62+
{
63+
audioTrack2.IsAvailable = false;
64+
m_cacheHits++;
65+
LogCacheStats();
66+
return audioTrack2.AudioTrack;
67+
}
68+
}
69+
AudioTrackData audioTrackData = null;
70+
foreach (AudioTrackData audioTrack3 in m_audioTracks)
71+
{
72+
if (audioTrack3.IsAvailable && audioTrack3.SoundBuffer.ChannelsCount == soundBuffer.ChannelsCount && audioTrack3.SoundBuffer.SamplingFrequency == soundBuffer.SamplingFrequency && audioTrack3.BytesCount >= soundBuffer.m_data.Length && (audioTrackData == null || audioTrack3.BytesCount <= audioTrackData.BytesCount))
73+
{
74+
audioTrackData = audioTrack3;
75+
}
76+
}
77+
if (audioTrackData != null)
78+
{
79+
if (m_buffer == null || m_buffer.Length < audioTrackData.BytesCount)
80+
{
81+
m_buffer = new byte[audioTrackData.BytesCount];
82+
}
83+
Array.Copy(soundBuffer.m_data, 0, m_buffer, 0, soundBuffer.m_data.Length);
84+
Array.Clear(m_buffer, soundBuffer.m_data.Length, audioTrackData.BytesCount - soundBuffer.m_data.Length);
85+
audioTrackData.AudioTrack.Write(m_buffer, 0, audioTrackData.BytesCount);
86+
audioTrackData.SoundBuffer = soundBuffer;
87+
audioTrackData.IsAvailable = false;
88+
m_cacheHitsWithWrite++;
89+
LogCacheStats();
90+
return audioTrackData.AudioTrack;
91+
}
92+
bool flag = true;
93+
foreach (AudioTrackData audioTrack4 in m_audioTracks)
94+
{
95+
if (audioTrack4.BytesCount < soundBuffer.m_data.Length)
96+
{
97+
flag = false;
98+
break;
99+
}
100+
}
101+
if (flag)
102+
{
103+
m_cacheFulls++;
104+
Log.Warning("AudioTrackCache full, no audio tracks available.");
105+
LogCacheStats();
106+
return null;
107+
}
108+
}
109+
AudioTrack audioTrack = new AudioTrack(Stream.Music, soundBuffer.SamplingFrequency, (soundBuffer.ChannelsCount == 1) ? ChannelOut.FrontLeft : ChannelOut.Stereo, Encoding.Pcm16bit, soundBuffer.m_data.Length, AudioTrackMode.Static);
110+
// AudioTrack audioTrack = new AudioTrack(new AudioAttributes.Builder().SetUsage(AudioUsageKind.Media).SetContentType(AudioContentType.Music).Build(),new AudioFormat(), soundBuffer.m_data.Length, AudioTrackMode.Static,0);
111+
112+
if (audioTrack.State != 0)
113+
{
114+
audioTrack.Write(soundBuffer.m_data, 0, soundBuffer.m_data.Length);
115+
if (!isLooped)
116+
{
117+
m_audioTracks.Add(new AudioTrackData
118+
{
119+
AudioTrack = audioTrack,
120+
SoundBuffer = soundBuffer,
121+
BytesCount = soundBuffer.m_data.Length,
122+
IsAvailable = false
123+
});
124+
}
125+
else
126+
{
127+
Mixer.CheckTrackStatus(audioTrack.SetLoopPoints(0, soundBuffer.SamplesCount, -1));
128+
}
129+
}
130+
else
131+
{
132+
audioTrack.Release();
133+
audioTrack = null;
134+
Log.Warning("Failed to create Cache AudioTrack.");
135+
}
136+
m_cacheMisses++;
137+
if (Mixer.EnableAudioTrackCaching && m_cacheMisses > 200 && m_cacheMisses % 100 == 0)
138+
{
139+
Log.Warning("Over {0} AudioTrack objects created.", m_cacheMisses);
140+
}
141+
LogCacheStats();
142+
return audioTrack;
143+
}
144+
145+
public static void ReturnAudioTrack(AudioTrack audioTrack)
146+
{
147+
AudioTrackData audioTrackData = null;
148+
for (int i = 0; i < m_audioTracks.Count; i++)
149+
{
150+
if (m_audioTracks[i].AudioTrack == audioTrack)
151+
{
152+
audioTrackData = m_audioTracks[i];
153+
break;
154+
}
155+
}
156+
if (!Mixer.EnableAudioTrackCaching)
157+
{
158+
if (audioTrackData != null)
159+
{
160+
m_audioTracks.Remove(audioTrackData);
161+
}
162+
audioTrack.Pause();
163+
audioTrack.Release();
164+
return;
165+
}
166+
if (audioTrackData == null)
167+
{
168+
audioTrack.Pause();
169+
audioTrack.Release();
170+
return;
171+
}
172+
bool flag = false;
173+
if (m_audioTracks.Count > 16)
174+
{
175+
flag = true;
176+
for (int j = 0; j < m_audioTracks.Count; j++)
177+
{
178+
if (m_audioTracks[j].BytesCount < audioTrackData.BytesCount)
179+
{
180+
flag = false;
181+
break;
182+
}
183+
}
184+
}
185+
if (flag)
186+
{
187+
audioTrack.Pause();
188+
audioTrack.Release();
189+
m_audioTracks.Remove(audioTrackData);
190+
}
191+
else
192+
{
193+
audioTrack.Stop();
194+
audioTrack.SetPlaybackHeadPosition(audioTrackData.BytesCount / audioTrackData.SoundBuffer.ChannelsCount / 2);
195+
audioTrackData.ReloadStaticDataTime = Time.FrameStartTime + 0.75;
196+
}
197+
LogCacheStats();
198+
}
199+
200+
public static void Frame()
201+
{
202+
if (!Mixer.EnableAudioTrackCaching)
203+
{
204+
Clear();
205+
}
206+
foreach (AudioTrackData audioTrack in m_audioTracks)
207+
{
208+
if (audioTrack.ReloadStaticDataTime > 0.0 && Time.FrameStartTime >= audioTrack.ReloadStaticDataTime)
209+
{
210+
audioTrack.ReloadStaticDataTime = 0.0;
211+
audioTrack.AudioTrack.ReloadStaticData();
212+
audioTrack.IsAvailable = true;
213+
}
214+
}
215+
}
216+
217+
public static void Deactivated()
218+
{
219+
Clear();
220+
}
221+
222+
public static void Clear()
223+
{
224+
int num = 0;
225+
while (num < m_audioTracks.Count)
226+
{
227+
if (m_audioTracks[num].IsAvailable || m_audioTracks[num].ReloadStaticDataTime > 0.0)
228+
{
229+
m_audioTracks[num].AudioTrack.Release();
230+
m_audioTracks.RemoveAt(num);
231+
}
232+
else
233+
{
234+
num++;
235+
}
236+
}
237+
}
238+
239+
public static void LogCacheStats()
240+
{
241+
}
242+
}
243+
}

0 commit comments

Comments
 (0)