Improve error messages for AudioClip assets

This commit is contained in:
VaDiM 2024-12-14 02:44:21 +03:00
parent ff92d1784d
commit 6608e76471
2 changed files with 23 additions and 9 deletions

View File

@ -1104,7 +1104,10 @@ namespace AssetStudioGUI
channels + channels +
bits; bits;
} }
StatusStripUpdate("Preview not available: Unsupported fmod audio format. Try to export instead."); var errorMsg = result == FMOD.RESULT.ERR_VERSION
? "Unsupported fmod version. Try to export raw and convert with an external tool instead."
: $"Preview not available, try to export instead. {FMOD.Error.String(result)}";
StatusStripUpdate(errorMsg);
FMODreset(); FMODreset();
return; return;
} }

View File

@ -39,16 +39,16 @@ namespace AssetStudio
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, ref exinfo, out var sound);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
result = sound.getNumSubSounds(out var numsubsounds); result = sound.getNumSubSounds(out var numsubsounds);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
byte[] buff; byte[] buff;
if (numsubsounds > 0) if (numsubsounds > 0)
{ {
result = sound.getSubSound(0, out var subsound); result = sound.getSubSound(0, out var subsound);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
buff = SoundToWav(subsound, out debugLog); buff = SoundToWav(subsound, out debugLog);
subsound.release(); subsound.release();
@ -67,32 +67,43 @@ namespace AssetStudio
{ {
debugLog = "[Fmod] Detecting sound format..\n"; debugLog = "[Fmod] Detecting sound format..\n";
var result = sound.getFormat(out SOUND_TYPE soundType, out SOUND_FORMAT soundFormat, out int channels, out int bits); var result = sound.getFormat(out SOUND_TYPE soundType, out SOUND_FORMAT soundFormat, out int channels, out int bits);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
debugLog += $"Detected sound type: {soundType}\n" + debugLog += $"Detected sound type: {soundType}\n" +
$"Detected sound format: {soundFormat}\n" + $"Detected sound format: {soundFormat}\n" +
$"Detected channels: {channels}\n" + $"Detected channels: {channels}\n" +
$"Detected bit depth: {bits}\n"; $"Detected bit depth: {bits}\n";
result = sound.getDefaults(out var frequency, out _); result = sound.getDefaults(out var frequency, out _);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
var sampleRate = (int)frequency; var sampleRate = (int)frequency;
result = sound.getLength(out var length, TIMEUNIT.PCMBYTES); result = sound.getLength(out var length, TIMEUNIT.PCMBYTES);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
result = sound.@lock(0, length, out var ptr1, out var ptr2, out var len1, out var len2); result = sound.@lock(0, length, out var ptr1, out var ptr2, out var len1, out var len2);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
var buffer = new byte[len1 + 44]; var buffer = new byte[len1 + 44];
//添加wav头 //添加wav头
WriteWavHeader(buffer, len1, sampleRate, channels, bits); WriteWavHeader(buffer, len1, sampleRate, channels, bits);
Marshal.Copy(ptr1, buffer, 44, (int)len1); Marshal.Copy(ptr1, buffer, 44, (int)len1);
result = sound.unlock(ptr1, ptr2, len1, len2); result = sound.unlock(ptr1, ptr2, len1, len2);
if (result != RESULT.OK) if (ErrorCheck(result, out debugLog))
return null; return null;
return buffer; return buffer;
} }
private static bool ErrorCheck(RESULT result, out string log)
{
log = string.Empty;
if (result != RESULT.OK)
{
log += $"FMOD error! {result} - {Error.String(result)}\n";
return true;
}
return false;
}
public byte[] RawAudioClipToWav(out string debugLog) public byte[] RawAudioClipToWav(out string debugLog)
{ {
var audioSize = m_AudioClip.m_Size; var audioSize = m_AudioClip.m_Size;