Skip to content

Commit e3e3433

Browse files
committed
[GUI] AudioClip improvements
- Increased loading speed of AudioClip preview - Optimized memory consumption of AudioClip preview - Fixed incorrect length detection for some sound types - Added channel count info (audio channels)
1 parent 1cdb0b7 commit e3e3433

File tree

7 files changed

+132
-107
lines changed

7 files changed

+132
-107
lines changed

AssetStudio/ResourceReader.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,18 @@ public byte[] GetData()
8080
lock (binaryReader)
8181
{
8282
binaryReader.BaseStream.Position = Offset;
83-
return binaryReader.ReadBytes((int) size);
83+
return binaryReader.ReadBytes((int)size);
8484
}
8585
}
8686

87-
public void GetData(byte[] buff, int startIndex = 0)
87+
public void GetData(byte[] buff, out int read, int startIndex = 0)
8888
{
89+
read = -1;
8990
var binaryReader = GetReader();
9091
lock (binaryReader)
9192
{
9293
binaryReader.BaseStream.Position = Offset;
93-
binaryReader.Read(buff, startIndex, (int) size);
94+
read = binaryReader.Read(buff, startIndex, (int)size);
9495
}
9596
}
9697

AssetStudioCLI/ParallelExporter.cs

Lines changed: 32 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -102,8 +102,8 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
102102
var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
103103
try
104104
{
105-
m_AudioClip.m_AudioData.GetData(m_AudioData);
106-
if (m_AudioData == null || m_AudioData.Length == 0)
105+
m_AudioClip.m_AudioData.GetData(m_AudioData, out var read);
106+
if (read <= 0)
107107
{
108108
Logger.Error($"Export error. \"{item.Text}\": AudioData was not found");
109109
return false;
@@ -116,24 +116,8 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
116116

117117
if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
118118
{
119-
var sb = new StringBuilder();
120-
sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..");
121-
if (m_AudioClip.version >= (2, 6))
122-
{
123-
sb.AppendLine(m_AudioClip.version < 5
124-
? $"AudioClip type: {m_AudioClip.m_Type}"
125-
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
126-
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
127-
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
128-
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
129-
}
130-
else
131-
{
132-
sb.AppendLine($"Is raw AudioClip: {m_AudioClip.m_Format != 0x05}");
133-
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
134-
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
135-
}
136-
debugLog += sb.ToString();
119+
debugLog += $"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..\n";
120+
debugLog += GenerateAudioClipInfo(m_AudioClip);
137121
}
138122

139123
var debugLogConverter = "";
@@ -155,23 +139,8 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
155139

156140
if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
157141
{
158-
var sb = new StringBuilder();
159-
sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..");
160-
if (m_AudioClip.version >= (2, 6))
161-
{
162-
sb.AppendLine(m_AudioClip.version < 5
163-
? $"AudioClip type: {m_AudioClip.m_Type}"
164-
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
165-
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
166-
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
167-
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
168-
}
169-
else
170-
{
171-
sb.AppendLine($"Is raw AudioClip: {m_AudioClip.m_Format != 0x05}");
172-
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
173-
}
174-
debugLog += sb.ToString();
142+
debugLog += $"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..\n";
143+
debugLog += GenerateAudioClipInfo(m_AudioClip);
175144
}
176145
using (var file = File.OpenWrite(exportFullPath))
177146
{
@@ -187,6 +156,32 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
187156
}
188157
}
189158

159+
private static string GenerateAudioClipInfo(AudioClip m_AudioClip)
160+
{
161+
var sb = new StringBuilder();
162+
if (m_AudioClip.version >= (2, 6))
163+
{
164+
sb.AppendLine(m_AudioClip.version < 5
165+
? $"AudioClip type: {m_AudioClip.m_Type}"
166+
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
167+
if (m_AudioClip.version >= 5)
168+
{
169+
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
170+
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
171+
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
172+
}
173+
}
174+
else
175+
{
176+
var isRawWav = m_AudioClip.m_Format != 0x05;
177+
sb.AppendLine($"Is raw wav data: {isRawWav}");
178+
if (isRawWav)
179+
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
180+
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
181+
}
182+
return sb.ToString();
183+
}
184+
190185
private static bool TryExportFile(string dir, AssetItem item, string extension, out string fullPath)
191186
{
192187
var fileName = FixFileName(item.Text);

AssetStudioGUI/AssetStudioGUIForm.Designer.cs

Lines changed: 32 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

AssetStudioGUI/AssetStudioGUIForm.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ partial class AssetStudioGUIForm : Form
4343
private FMOD.Channel channel;
4444
private FMOD.SoundGroup masterSoundGroup;
4545
private FMOD.MODE loopMode = FMOD.MODE.LOOP_OFF;
46+
private byte[] soundBuff;
4647
private uint FMODlenms;
4748
private uint FMODloopstartms;
4849
private uint FMODloopendms;
@@ -1101,17 +1102,16 @@ private void PreviewAudioClip(AssetItem assetItem, AudioClip m_AudioClip)
11011102
break;
11021103
}
11031104
}
1104-
1105-
var m_AudioData = m_AudioClip.m_AudioData.GetData();
1106-
if (m_AudioData == null || m_AudioData.Length == 0)
1105+
soundBuff = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
1106+
m_AudioClip.m_AudioData.GetData(soundBuff, out var read);
1107+
if (read <= 0)
11071108
return;
11081109

11091110
var exinfo = new FMOD.CREATESOUNDEXINFO();
1110-
11111111
exinfo.cbsize = Marshal.SizeOf(exinfo);
11121112
exinfo.length = (uint)m_AudioClip.m_Size;
11131113

1114-
var result = system.createSound(m_AudioData, FMOD.MODE.OPENMEMORY | loopMode, ref exinfo, out sound);
1114+
var result = system.createStream(soundBuff, FMOD.MODE.OPENMEMORY | FMOD.MODE.LOWMEM | FMOD.MODE.IGNORETAGS | FMOD.MODE.ACCURATETIME | loopMode, ref exinfo, out sound);
11151115
if (result != FMOD.RESULT.OK)
11161116
{
11171117
if (m_AudioClip.version < (2, 6) || m_AudioClip.version >= 5)
@@ -1141,7 +1141,6 @@ private void PreviewAudioClip(AssetItem assetItem, AudioClip m_AudioClip)
11411141
}
11421142

11431143
sound.getNumSubSounds(out var numsubsounds);
1144-
11451144
if (numsubsounds > 0)
11461145
{
11471146
result = sound.getSubSound(0, out var subsound);
@@ -1172,6 +1171,20 @@ private void PreviewAudioClip(AssetItem assetItem, AudioClip m_AudioClip)
11721171

11731172
FMODinfoLabel.Text = frequency + " Hz";
11741173
FMODtimerLabel.Text = $"00:00.00 / {(FMODlenms / 1000 / 60):00}:{(FMODlenms / 1000 % 60):00}.{(FMODlenms / 10 % 100):00}";
1174+
1175+
sound.getFormat(out _, out _, out var audioChannels, out _);
1176+
switch (audioChannels)
1177+
{
1178+
case 1:
1179+
FMODaudioChannelsLabel.Text = "Mono";
1180+
break;
1181+
case 2:
1182+
FMODaudioChannelsLabel.Text = "Stereo";
1183+
break;
1184+
default:
1185+
FMODaudioChannelsLabel.Text = $"{audioChannels}-Channel";
1186+
break;
1187+
}
11751188
}
11761189

11771190
private void PreviewVideoClip(AssetItem assetItem, VideoClip m_VideoClip)
@@ -2589,13 +2602,19 @@ private void FMODreset()
25892602
FMODtimerLabel.Text = "00:00.00 / 00:00.00";
25902603
FMODstatusLabel.Text = "Stopped";
25912604
FMODinfoLabel.Text = "";
2605+
FMODaudioChannelsLabel.Text = "";
25922606

25932607
if (sound.hasHandle())
25942608
{
25952609
var result = sound.release();
25962610
ERRCHECK(result);
25972611
sound.clearHandle();
25982612
}
2613+
if (soundBuff != null)
2614+
{
2615+
BigArrayPool<byte>.Shared.Return(soundBuff, clearArray: true);
2616+
soundBuff = null;
2617+
}
25992618
}
26002619

26012620
private void FMODplayButton_Click(object sender, EventArgs e)

0 commit comments

Comments
 (0)