From d2e51dbeef5a16d2c0bb29b30ea5963d5a1a479d Mon Sep 17 00:00:00 2001 From: VaDiM Date: Mon, 19 Oct 2026 14:33:05 +0300 Subject: [PATCH] Some improvements to wav export for Unity 1.x - 2.5 --- AssetStudioCLI/ParallelExporter.cs | 14 ++++--- AssetStudioGUI/AssetStudioGUIForm.cs | 4 +- AssetStudioGUI/ParallelExporter.cs | 14 ++++--- .../Audio/AudioClipConverter.cs | 41 +++++++++---------- .../Audio/AudioClipExtension.cs | 4 +- 5 files changed, 40 insertions(+), 37 deletions(-) diff --git a/AssetStudioCLI/ParallelExporter.cs b/AssetStudioCLI/ParallelExporter.cs index 47415ad..11e4a9e 100644 --- a/AssetStudioCLI/ParallelExporter.cs +++ b/AssetStudioCLI/ParallelExporter.cs @@ -156,13 +156,15 @@ namespace AssetStudioCLI { if (m_AudioClip.IsLegacyRawWav()) { - var buffer = converter.WrapWavData(ref debugLog); - file.Write(buffer, 0, buffer.Length); - } - else - { - file.Write(audioBuff, 0, m_AudioClip.m_AudioData.Size); + if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian) + { + AudioClipConverter.LegacyRawWavSwapEndian(audioBuff, m_AudioClip.m_AudioData.Size, (LegacyAudioType)m_AudioClip.m_Format); + } + var wavHeaderBuff = AudioClipConverter.LegacyRawWavGenerateHeader(m_AudioClip, ref debugLog); + file.Write(wavHeaderBuff, 0, wavHeaderBuff.Length); } + + file.Write(audioBuff, 0, m_AudioClip.m_AudioData.Size); } } debugLog += $"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\""; diff --git a/AssetStudioGUI/AssetStudioGUIForm.cs b/AssetStudioGUI/AssetStudioGUIForm.cs index befa274..3e2e0d3 100644 --- a/AssetStudioGUI/AssetStudioGUIForm.cs +++ b/AssetStudioGUI/AssetStudioGUIForm.cs @@ -1081,9 +1081,9 @@ namespace AssetStudioGUI exinfo.numchannels = m_AudioClip.m_Channels; exinfo.defaultfrequency = m_AudioClip.m_Frequency; mode |= FMOD.MODE.OPENRAW; - if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian && exinfo.format == FMOD.SOUND_FORMAT.PCM16) + if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian) { - AudioClipConverter.SwapPcm16Endian(soundBuff.AsSpan(0, m_AudioClip.m_AudioData.Size)); + AudioClipConverter.LegacyRawWavSwapEndian(soundBuff, m_AudioClip.m_AudioData.Size, (LegacyAudioType)m_AudioClip.m_Format); } } diff --git a/AssetStudioGUI/ParallelExporter.cs b/AssetStudioGUI/ParallelExporter.cs index 47eea83..cbc0a26 100644 --- a/AssetStudioGUI/ParallelExporter.cs +++ b/AssetStudioGUI/ParallelExporter.cs @@ -155,13 +155,15 @@ namespace AssetStudioGUI { if (m_AudioClip.IsLegacyRawWav()) { - var buffer = converter.WrapWavData(ref debugLog); - file.Write(buffer, 0, buffer.Length); - } - else - { - file.Write(audioBuff, 0, m_AudioClip.m_AudioData.Size); + if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian) + { + AudioClipConverter.LegacyRawWavSwapEndian(audioBuff, m_AudioClip.m_AudioData.Size, (LegacyAudioType)m_AudioClip.m_Format); + } + var wavHeaderBuff = AudioClipConverter.LegacyRawWavGenerateHeader(m_AudioClip, ref debugLog); + file.Write(wavHeaderBuff, 0, wavHeaderBuff.Length); } + + file.Write(audioBuff, 0, m_AudioClip.m_AudioData.Size); } } debugLog += $"{item.TypeString} \"{item.Text}\" exported to \"{exportFullPath}\""; diff --git a/AssetStudioUtility/Audio/AudioClipConverter.cs b/AssetStudioUtility/Audio/AudioClipConverter.cs index c2a122b..ce1e047 100644 --- a/AssetStudioUtility/Audio/AudioClipConverter.cs +++ b/AssetStudioUtility/Audio/AudioClipConverter.cs @@ -71,9 +71,9 @@ namespace AssetStudio if (isLegacyRawWav) { mode |= MODE.OPENRAW; - if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian && exinfo.format == SOUND_FORMAT.PCM16) + if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian) { - SwapPcm16Endian(audioBuff.AsSpan(0, (int)m_AudioClip.m_Size)); + LegacyRawWavSwapEndian(audioBuff, m_AudioClip.m_AudioData.Size, (LegacyAudioType)m_AudioClip.m_Format); } } var result = system.createSound(audioBuff, mode, ref exinfo, out var sound); @@ -185,40 +185,37 @@ namespace AssetStudio debugLog += "Finished FMOD_PCMFLOAT -> PCM16 converting\n"; } + #region LegacyRawWav //For raw wav data in unity 1.x - 2.5 //we can handle it with fmod as well, but this way should be better, I guess - public byte[] WrapWavData(ref string debugLog) + public static byte[] LegacyRawWavGenerateHeader(AudioClip m_AudioClip, ref string debugLog) { - if (!isLegacyRawWav) - return null; - - var legacyType = (LegacyAudioType)m_AudioClip.m_Format; - var audioSize = (int)m_AudioClip.m_Size; + var audioSize = (uint)m_AudioClip.m_AudioData.Size; var channels = m_AudioClip.m_Channels; - var sampleRate = m_AudioClip.m_Frequency; + var sampleRate = (uint)m_AudioClip.m_Frequency; var audioFormat = WavAudioFormat.PCM; - var bits = legacyType == LegacyAudioType.RawWavU8Mono ? 8 : 16; + var bits = (LegacyAudioType)m_AudioClip.m_Format == LegacyAudioType.RawWavU8Mono ? 8 : 16; debugLog += "[Legacy AudioClip] Generating wav header..\n"; - if (m_AudioClip.m_AudioData.Endian == EndianType.BigEndian && bits == 16) - { - SwapPcm16Endian(audioBuff.AsSpan(0, audioSize)); - } - var wavBuffer = new byte[audioSize + 44]; - var wavHeader = new WavHeader((uint)audioSize, audioFormat, channels, (uint)sampleRate, bits); - wavHeader.WriteToArray(wavBuffer); - audioBuff.AsSpan(0, audioSize).CopyTo(wavBuffer.AsSpan(44)); + var headerBuff = new byte[44]; + var wavHeader = new WavHeader(audioSize, audioFormat, channels, sampleRate, bits); + wavHeader.WriteToArray(headerBuff); - return wavBuffer; + return headerBuff; } - public static void SwapPcm16Endian(Span buffer) + public static void LegacyRawWavSwapEndian(byte[] audioData, int audioSize, LegacyAudioType legacyType) { - for (var i = 0; i < buffer.Length; i += 2) + if (legacyType == LegacyAudioType.RawWavS16Mono || legacyType == LegacyAudioType.RawWavS16Stereo) { - buffer.Slice(i, 2).Reverse(); + var dataSpan = audioData.AsSpan(0, audioSize); + for (var i = 0; i < audioSize; i += 2) + { + dataSpan.Slice(i, 2).Reverse(); + } } } + #endregion private static bool ErrorCheck(RESULT result, ref string log) { diff --git a/AssetStudioUtility/Audio/AudioClipExtension.cs b/AssetStudioUtility/Audio/AudioClipExtension.cs index fb85d4e..afbb171 100644 --- a/AssetStudioUtility/Audio/AudioClipExtension.cs +++ b/AssetStudioUtility/Audio/AudioClipExtension.cs @@ -55,7 +55,9 @@ public static bool IsLegacyRawWav(this AudioClip m_AudioClip) { - return m_AudioClip.version < (2, 6) && m_AudioClip.m_Format > 0 && (LegacyAudioType)m_AudioClip.m_Format < LegacyAudioType.CompressedAudio; + return m_AudioClip.version < (2, 6) + && m_AudioClip.m_Format > 0 + && (LegacyAudioType)m_AudioClip.m_Format < LegacyAudioType.CompressedAudio; } } }