[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)
This commit is contained in:
VaDiM 2025-01-19 22:23:06 +03:00
parent 1cdb0b762a
commit e3e343320c
7 changed files with 131 additions and 106 deletions

View File

@ -80,17 +80,18 @@ namespace AssetStudio
lock (binaryReader) lock (binaryReader)
{ {
binaryReader.BaseStream.Position = Offset; 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(); var binaryReader = GetReader();
lock (binaryReader) lock (binaryReader)
{ {
binaryReader.BaseStream.Position = Offset; binaryReader.BaseStream.Position = Offset;
binaryReader.Read(buff, startIndex, (int) size); read = binaryReader.Read(buff, startIndex, (int)size);
} }
} }

View File

@ -102,8 +102,8 @@ namespace AssetStudioCLI
var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size); var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
try try
{ {
m_AudioClip.m_AudioData.GetData(m_AudioData); m_AudioClip.m_AudioData.GetData(m_AudioData, out var read);
if (m_AudioData == null || m_AudioData.Length == 0) if (read <= 0)
{ {
Logger.Error($"Export error. \"{item.Text}\": AudioData was not found"); Logger.Error($"Export error. \"{item.Text}\": AudioData was not found");
return false; return false;
@ -116,24 +116,8 @@ namespace AssetStudioCLI
if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug) if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
{ {
var sb = new StringBuilder(); debugLog += $"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..\n";
sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav.."); debugLog += GenerateAudioClipInfo(m_AudioClip);
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();
} }
var debugLogConverter = ""; var debugLogConverter = "";
@ -155,23 +139,8 @@ namespace AssetStudioCLI
if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug) if (CLIOptions.o_logLevel.Value <= LoggerEvent.Debug)
{ {
var sb = new StringBuilder(); debugLog += $"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..\n";
sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\".."); debugLog += GenerateAudioClipInfo(m_AudioClip);
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();
} }
using (var file = File.OpenWrite(exportFullPath)) using (var file = File.OpenWrite(exportFullPath))
{ {
@ -187,6 +156,32 @@ namespace AssetStudioCLI
} }
} }
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) private static bool TryExportFile(string dir, AssetItem item, string extension, out string fullPath)
{ {
var fileName = FixFileName(item.Text); var fileName = FixFileName(item.Text);

View File

@ -124,7 +124,8 @@
this.previewPanel = new System.Windows.Forms.PictureBox(); this.previewPanel = new System.Windows.Forms.PictureBox();
this.assetInfoLabel = new System.Windows.Forms.Label(); this.assetInfoLabel = new System.Windows.Forms.Label();
this.FMODpanel = new System.Windows.Forms.Panel(); this.FMODpanel = new System.Windows.Forms.Panel();
this.FMODcopyright = new System.Windows.Forms.Label(); this.FMODaudioChannelsLabel = new System.Windows.Forms.Label();
this.FMODcopyrightLabel = new System.Windows.Forms.Label();
this.FMODinfoLabel = new System.Windows.Forms.Label(); this.FMODinfoLabel = new System.Windows.Forms.Label();
this.FMODtimerLabel = new System.Windows.Forms.Label(); this.FMODtimerLabel = new System.Windows.Forms.Label();
this.FMODstatusLabel = new System.Windows.Forms.Label(); this.FMODstatusLabel = new System.Windows.Forms.Label();
@ -1077,7 +1078,8 @@
// FMODpanel // FMODpanel
// //
this.FMODpanel.BackColor = System.Drawing.SystemColors.ControlDark; this.FMODpanel.BackColor = System.Drawing.SystemColors.ControlDark;
this.FMODpanel.Controls.Add(this.FMODcopyright); this.FMODpanel.Controls.Add(this.FMODaudioChannelsLabel);
this.FMODpanel.Controls.Add(this.FMODcopyrightLabel);
this.FMODpanel.Controls.Add(this.FMODinfoLabel); this.FMODpanel.Controls.Add(this.FMODinfoLabel);
this.FMODpanel.Controls.Add(this.FMODtimerLabel); this.FMODpanel.Controls.Add(this.FMODtimerLabel);
this.FMODpanel.Controls.Add(this.FMODstatusLabel); this.FMODpanel.Controls.Add(this.FMODstatusLabel);
@ -1094,18 +1096,31 @@
this.FMODpanel.TabIndex = 2; this.FMODpanel.TabIndex = 2;
this.FMODpanel.Visible = false; this.FMODpanel.Visible = false;
// //
// FMODcopyright // FMODaudioChannelsLabel
// //
this.FMODcopyright.Anchor = System.Windows.Forms.AnchorStyles.Top; this.FMODaudioChannelsLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.FMODcopyright.AutoSize = true; this.FMODaudioChannelsLabel.AutoSize = true;
this.FMODcopyright.BackColor = System.Drawing.Color.Transparent; this.FMODaudioChannelsLabel.BackColor = System.Drawing.Color.Transparent;
this.FMODcopyright.ForeColor = System.Drawing.Color.White; this.FMODaudioChannelsLabel.ForeColor = System.Drawing.Color.White;
this.FMODcopyright.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.FMODaudioChannelsLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.FMODcopyright.Location = new System.Drawing.Point(214, 365); this.FMODaudioChannelsLabel.Location = new System.Drawing.Point(368, 255);
this.FMODcopyright.Name = "FMODcopyright"; this.FMODaudioChannelsLabel.Name = "FMODaudioChannelsLabel";
this.FMODcopyright.Size = new System.Drawing.Size(283, 13); this.FMODaudioChannelsLabel.Size = new System.Drawing.Size(38, 13);
this.FMODcopyright.TabIndex = 9; this.FMODaudioChannelsLabel.TabIndex = 10;
this.FMODcopyright.Text = "Audio Engine supplied by FMOD by Firelight Technologies."; this.FMODaudioChannelsLabel.Text = "Stereo";
//
// FMODcopyrightLabel
//
this.FMODcopyrightLabel.Anchor = System.Windows.Forms.AnchorStyles.Top;
this.FMODcopyrightLabel.AutoSize = true;
this.FMODcopyrightLabel.BackColor = System.Drawing.Color.Transparent;
this.FMODcopyrightLabel.ForeColor = System.Drawing.Color.White;
this.FMODcopyrightLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.FMODcopyrightLabel.Location = new System.Drawing.Point(214, 365);
this.FMODcopyrightLabel.Name = "FMODcopyrightLabel";
this.FMODcopyrightLabel.Size = new System.Drawing.Size(283, 13);
this.FMODcopyrightLabel.TabIndex = 9;
this.FMODcopyrightLabel.Text = "Audio Engine supplied by FMOD by Firelight Technologies.";
// //
// FMODinfoLabel // FMODinfoLabel
// //
@ -1126,7 +1141,7 @@
this.FMODtimerLabel.BackColor = System.Drawing.Color.Transparent; this.FMODtimerLabel.BackColor = System.Drawing.Color.Transparent;
this.FMODtimerLabel.ForeColor = System.Drawing.Color.White; this.FMODtimerLabel.ForeColor = System.Drawing.Color.White;
this.FMODtimerLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl; this.FMODtimerLabel.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.FMODtimerLabel.Location = new System.Drawing.Point(457, 253); this.FMODtimerLabel.Location = new System.Drawing.Point(457, 255);
this.FMODtimerLabel.Name = "FMODtimerLabel"; this.FMODtimerLabel.Name = "FMODtimerLabel";
this.FMODtimerLabel.Size = new System.Drawing.Size(102, 13); this.FMODtimerLabel.Size = new System.Drawing.Size(102, 13);
this.FMODtimerLabel.TabIndex = 7; this.FMODtimerLabel.TabIndex = 7;
@ -1649,7 +1664,7 @@
private System.Windows.Forms.ColumnHeader columnHeader1; private System.Windows.Forms.ColumnHeader columnHeader1;
private System.Windows.Forms.TextBox classTextBox; private System.Windows.Forms.TextBox classTextBox;
private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem; private System.Windows.Forms.ToolStripMenuItem exportClassStructuresMenuItem;
private System.Windows.Forms.Label FMODcopyright; private System.Windows.Forms.Label FMODcopyrightLabel;
private OpenTK.GLControl glControl1; private OpenTK.GLControl glControl1;
private System.Windows.Forms.ContextMenuStrip contextMenuStrip1; private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;
private System.Windows.Forms.ToolStripMenuItem showOriginalFileToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem showOriginalFileToolStripMenuItem;
@ -1735,6 +1750,7 @@
private System.Windows.Forms.ToolStripMenuItem colorThemeAutoToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem colorThemeAutoToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem colorThemeLightToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem colorThemeLightToolStripMenuItem;
private System.Windows.Forms.ToolStripMenuItem colorThemeDarkToolStripMenuItem; private System.Windows.Forms.ToolStripMenuItem colorThemeDarkToolStripMenuItem;
private System.Windows.Forms.Label FMODaudioChannelsLabel;
} }
} }

View File

@ -43,6 +43,7 @@ namespace AssetStudioGUI
private FMOD.Channel channel; private FMOD.Channel channel;
private FMOD.SoundGroup masterSoundGroup; private FMOD.SoundGroup masterSoundGroup;
private FMOD.MODE loopMode = FMOD.MODE.LOOP_OFF; private FMOD.MODE loopMode = FMOD.MODE.LOOP_OFF;
private byte[] soundBuff;
private uint FMODlenms; private uint FMODlenms;
private uint FMODloopstartms; private uint FMODloopstartms;
private uint FMODloopendms; private uint FMODloopendms;
@ -1101,17 +1102,16 @@ namespace AssetStudioGUI
break; break;
} }
} }
soundBuff = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
var m_AudioData = m_AudioClip.m_AudioData.GetData(); m_AudioClip.m_AudioData.GetData(soundBuff, out var read);
if (m_AudioData == null || m_AudioData.Length == 0) if (read <= 0)
return; return;
var exinfo = new FMOD.CREATESOUNDEXINFO(); var exinfo = new FMOD.CREATESOUNDEXINFO();
exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)m_AudioClip.m_Size; 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 (result != FMOD.RESULT.OK)
{ {
if (m_AudioClip.version < (2, 6) || m_AudioClip.version >= 5) if (m_AudioClip.version < (2, 6) || m_AudioClip.version >= 5)
@ -1141,7 +1141,6 @@ namespace AssetStudioGUI
} }
sound.getNumSubSounds(out var numsubsounds); sound.getNumSubSounds(out var numsubsounds);
if (numsubsounds > 0) if (numsubsounds > 0)
{ {
result = sound.getSubSound(0, out var subsound); result = sound.getSubSound(0, out var subsound);
@ -1172,6 +1171,20 @@ namespace AssetStudioGUI
FMODinfoLabel.Text = frequency + " Hz"; FMODinfoLabel.Text = frequency + " Hz";
FMODtimerLabel.Text = $"00:00.00 / {(FMODlenms / 1000 / 60):00}:{(FMODlenms / 1000 % 60):00}.{(FMODlenms / 10 % 100):00}"; 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) private void PreviewVideoClip(AssetItem assetItem, VideoClip m_VideoClip)
@ -2589,6 +2602,7 @@ namespace AssetStudioGUI
FMODtimerLabel.Text = "00:00.00 / 00:00.00"; FMODtimerLabel.Text = "00:00.00 / 00:00.00";
FMODstatusLabel.Text = "Stopped"; FMODstatusLabel.Text = "Stopped";
FMODinfoLabel.Text = ""; FMODinfoLabel.Text = "";
FMODaudioChannelsLabel.Text = "";
if (sound.hasHandle()) if (sound.hasHandle())
{ {
@ -2596,6 +2610,11 @@ namespace AssetStudioGUI
ERRCHECK(result); ERRCHECK(result);
sound.clearHandle(); sound.clearHandle();
} }
if (soundBuff != null)
{
BigArrayPool<byte>.Shared.Return(soundBuff, clearArray: true);
soundBuff = null;
}
} }
private void FMODplayButton_Click(object sender, EventArgs e) private void FMODplayButton_Click(object sender, EventArgs e)

View File

@ -101,8 +101,8 @@ namespace AssetStudioGUI
var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size); var m_AudioData = BigArrayPool<byte>.Shared.Rent(m_AudioClip.m_AudioData.Size);
try try
{ {
m_AudioClip.m_AudioData.GetData(m_AudioData); m_AudioClip.m_AudioData.GetData(m_AudioData, out var read);
if (m_AudioData == null || m_AudioData.Length == 0) if (read <= 0)
{ {
Logger.Warning($"Failed to export \"{item.Text}\": AudioData was not found"); Logger.Warning($"Failed to export \"{item.Text}\": AudioData was not found");
return false; return false;
@ -115,25 +115,8 @@ namespace AssetStudioGUI
if (GUILogger.ShowDebugMessage) if (GUILogger.ShowDebugMessage)
{ {
var sb = new StringBuilder(); debugLog += $"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav..\n";
sb.AppendLine($"Converting {item.TypeString} \"{m_AudioClip.m_Name}\" to wav.."); debugLog += GenerateAudioClipInfo(m_AudioClip);
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();
} }
var debugLogConverter = ""; var debugLogConverter = "";
@ -155,24 +138,8 @@ namespace AssetStudioGUI
if (GUILogger.ShowDebugMessage) if (GUILogger.ShowDebugMessage)
{ {
var sb = new StringBuilder(); debugLog += $"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\"..\n";
sb.AppendLine($"Exporting non-fmod {item.TypeString} \"{m_AudioClip.m_Name}\".."); debugLog += GenerateAudioClipInfo(m_AudioClip);
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();
} }
using (var file = File.OpenWrite(exportFullPath)) using (var file = File.OpenWrite(exportFullPath))
{ {
@ -188,6 +155,32 @@ namespace AssetStudioGUI
} }
} }
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) private static bool TryExportFile(string dir, AssetItem item, string extension, out string fullPath)
{ {
var fileName = FixFileName(item.Text); var fileName = FixFileName(item.Text);

View File

@ -38,7 +38,7 @@ namespace AssetStudio
var exinfo = new CREATESOUNDEXINFO(); var exinfo = new CREATESOUNDEXINFO();
exinfo.cbsize = Marshal.SizeOf(exinfo); exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)m_AudioClip.m_Size; exinfo.length = (uint)m_AudioClip.m_Size;
var result = system.createSound(m_AudioData, MODE.OPENMEMORY, ref exinfo, out var sound); var result = system.createSound(m_AudioData, MODE.OPENMEMORY | MODE.LOWMEM | MODE.ACCURATETIME, ref exinfo, out var sound);
if (ErrorCheck(result, out debugLog)) if (ErrorCheck(result, out debugLog))
return null; return null;
result = sound.getNumSubSounds(out var numsubsounds); result = sound.getNumSubSounds(out var numsubsounds);
@ -106,19 +106,20 @@ namespace AssetStudio
public byte[] RawAudioClipToWav(out string debugLog) public byte[] RawAudioClipToWav(out string debugLog)
{ {
var audioSize = m_AudioClip.m_Size; var audioSize = (uint)m_AudioClip.m_Size;
var channels = m_AudioClip.m_Channels; var channels = m_AudioClip.m_Channels;
var sampleRate = m_AudioClip.m_Frequency; var sampleRate = m_AudioClip.m_Frequency;
var bits = 16; var bits = 16;
debugLog = "[Legacy wav converter] Generating wav header..\n"; debugLog = "[Legacy wav converter] Generating wav header..\n";
var buffer = new byte[audioSize + 44]; var buffer = new byte[audioSize + 44];
m_AudioClip.m_AudioData.GetData(buffer, 44); m_AudioClip.m_AudioData.GetData(buffer, out var read, 44);
WriteWavHeader(buffer, audioSize, sampleRate, channels, bits); if (read > 0)
WriteWavHeader(buffer, audioSize, sampleRate, channels, bits);
return buffer; return buffer;
} }
private static void WriteWavHeader(byte[] buffer, long size, int sampleRate, int channels, int bits) private static void WriteWavHeader(byte[] buffer, uint size, int sampleRate, int channels, int bits)
{ {
Encoding.ASCII.GetBytes("RIFF").CopyTo(buffer, 0); Encoding.ASCII.GetBytes("RIFF").CopyTo(buffer, 0);
BitConverter.GetBytes(size + 36).CopyTo(buffer, 4); BitConverter.GetBytes(size + 36).CopyTo(buffer, 4);

View File

@ -89,7 +89,7 @@ namespace AssetStudio
var buff = BigArrayPool<byte>.Shared.Rent(reader.Size); var buff = BigArrayPool<byte>.Shared.Rent(reader.Size);
try try
{ {
reader.GetData(buff); reader.GetData(buff, out _);
if (switchSwizzled) if (switchSwizzled)
{ {
var unswizzledData = BigArrayPool<byte>.Shared.Rent(reader.Size); var unswizzledData = BigArrayPool<byte>.Shared.Rent(reader.Size);