Skip to content

Commit

Permalink
[GUI] AudioClip improvements
Browse files Browse the repository at this point in the history
- 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)
  • Loading branch information
aelurum committed Jan 20, 2025
1 parent 1cdb0b7 commit e3e3433
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 107 deletions.
7 changes: 4 additions & 3 deletions AssetStudio/ResourceReader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -80,17 +80,18 @@ public byte[] GetData()
lock (binaryReader)
{
binaryReader.BaseStream.Position = Offset;
return binaryReader.ReadBytes((int) size);
return binaryReader.ReadBytes((int)size);
}
}

public void GetData(byte[] buff, int startIndex = 0)
public void GetData(byte[] buff, out int read, int startIndex = 0)
{
read = -1;
var binaryReader = GetReader();
lock (binaryReader)
{
binaryReader.BaseStream.Position = Offset;
binaryReader.Read(buff, startIndex, (int) size);
read = binaryReader.Read(buff, startIndex, (int)size);
}
}

Expand Down
69 changes: 32 additions & 37 deletions AssetStudioCLI/ParallelExporter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,8 +102,8 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
try
{
m_AudioClip.m_AudioData.GetData(m_AudioData);
if (m_AudioData == null || m_AudioData.Length == 0)
m_AudioClip.m_AudioData.GetData(m_AudioData, out var read);
if (read <= 0)
{
Logger.Error($"Export error. \"{item.Text}\": AudioData was not found");
return false;
Expand All @@ -116,24 +116,8 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string

if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
{
var sb = new StringBuilder();
sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..");
if (m_AudioClip.version >= (2, 6))
{
sb.AppendLine(m_AudioClip.version < 5
? $"AudioClip type: {m_AudioClip.m_Type}"
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
}
else
{
sb.AppendLine($"Is raw AudioClip: {m_AudioClip.m_Format != 0x05}");
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
}
debugLog += sb.ToString();
debugLog += $"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..\n";
debugLog += GenerateAudioClipInfo(m_AudioClip);
}

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

if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
{
var sb = new StringBuilder();
sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..");
if (m_AudioClip.version >= (2, 6))
{
sb.AppendLine(m_AudioClip.version < 5
? $"AudioClip type: {m_AudioClip.m_Type}"
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
}
else
{
sb.AppendLine($"Is raw AudioClip: {m_AudioClip.m_Format != 0x05}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
}
debugLog += sb.ToString();
debugLog += $"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..\n";
debugLog += GenerateAudioClipInfo(m_AudioClip);
}
using (var file = File.OpenWrite(exportFullPath))
{
Expand All @@ -187,6 +156,32 @@ public static bool ExportAudioClip(AssetItem item, string exportPath, out string
}
}

private static string GenerateAudioClipInfo(AudioClip m_AudioClip)
{
var sb = new StringBuilder();
if (m_AudioClip.version >= (2, 6))
{
sb.AppendLine(m_AudioClip.version < 5
? $"AudioClip type: {m_AudioClip.m_Type}"
: $"AudioClip compression format: {m_AudioClip.m_CompressionFormat}");
if (m_AudioClip.version >= 5)
{
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
sb.AppendLine($"AudioClip bit depth: {m_AudioClip.m_BitsPerSample}");
}
}
else
{
var isRawWav = m_AudioClip.m_Format != 0x05;
sb.AppendLine($"Is raw wav data: {isRawWav}");
if (isRawWav)
sb.AppendLine($"AudioClip channel count: {m_AudioClip.m_Channels}");
sb.AppendLine($"AudioClip sample rate: {m_AudioClip.m_Frequency}");
}
return sb.ToString();
}

private static bool TryExportFile(string dir, AssetItem item, string extension, out string fullPath)
{
var fileName = FixFileName(item.Text);
Expand Down
48 changes: 32 additions & 16 deletions AssetStudioGUI/AssetStudioGUIForm.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

31 changes: 25 additions & 6 deletions AssetStudioGUI/AssetStudioGUIForm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ partial class AssetStudioGUIForm : Form
private FMOD.Channel channel;
private FMOD.SoundGroup masterSoundGroup;
private FMOD.MODE loopMode = FMOD.MODE.LOOP_OFF;
private byte[] soundBuff;
private uint FMODlenms;
private uint FMODloopstartms;
private uint FMODloopendms;
Expand Down Expand Up @@ -1101,17 +1102,16 @@ private void PreviewAudioClip(AssetItem assetItem, AudioClip m_AudioClip)
break;
}
}

var m_AudioData = m_AudioClip.m_AudioData.GetData();
if (m_AudioData == null || m_AudioData.Length == 0)
soundBuff = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
m_AudioClip.m_AudioData.GetData(soundBuff, out var read);
if (read <= 0)
return;

var exinfo = new FMOD.CREATESOUNDEXINFO();

exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)m_AudioClip.m_Size;

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

sound.getNumSubSounds(out var numsubsounds);

if (numsubsounds > 0)
{
result = sound.getSubSound(0, out var subsound);
Expand Down Expand Up @@ -1172,6 +1171,20 @@ private void PreviewAudioClip(AssetItem assetItem, AudioClip m_AudioClip)

FMODinfoLabel.Text = frequency + " Hz";
FMODtimerLabel.Text = $"00:00.00 / {(FMODlenms / 1000 / 60):00}:{(FMODlenms / 1000 % 60):00}.{(FMODlenms / 10 % 100):00}";

sound.getFormat(out _, out _, out var audioChannels, out _);
switch (audioChannels)
{
case 1:
FMODaudioChannelsLabel.Text = "Mono";
break;
case 2:
FMODaudioChannelsLabel.Text = "Stereo";
break;
default:
FMODaudioChannelsLabel.Text = $"{audioChannels}-Channel";
break;
}
}

private void PreviewVideoClip(AssetItem assetItem, VideoClip m_VideoClip)
Expand Down Expand Up @@ -2589,13 +2602,19 @@ private void FMODreset()
FMODtimerLabel.Text = "00:00.00 / 00:00.00";
FMODstatusLabel.Text = "Stopped";
FMODinfoLabel.Text = "";
FMODaudioChannelsLabel.Text = "";

if (sound.hasHandle())
{
var result = sound.release();
ERRCHECK(result);
sound.clearHandle();
}
if (soundBuff != null)
{
BigArrayPool<byte>.Shared.Return(soundBuff, clearArray: true);
soundBuff = null;
}
}

private void FMODplayButton_Click(object sender, EventArgs e)
Expand Down
Loading

0 comments on commit e3e3433

Please sign in to comment.