[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

@ -38,7 +38,7 @@ namespace AssetStudio
var exinfo = new CREATESOUNDEXINFO();
exinfo.cbsize = Marshal.SizeOf(exinfo);
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))
return null;
result = sound.getNumSubSounds(out var numsubsounds);
@ -106,19 +106,20 @@ namespace AssetStudio
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 sampleRate = m_AudioClip.m_Frequency;
var bits = 16;
debugLog = "[Legacy wav converter] Generating wav header..\n";
var buffer = new byte[audioSize + 44];
m_AudioClip.m_AudioData.GetData(buffer, 44);
WriteWavHeader(buffer, audioSize, sampleRate, channels, bits);
m_AudioClip.m_AudioData.GetData(buffer, out var read, 44);
if (read > 0)
WriteWavHeader(buffer, audioSize, sampleRate, channels, bits);
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);
BitConverter.GetBytes(size + 36).CopyTo(buffer, 4);

View File

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