improve AudioClip export

This commit is contained in:
Perfare
2018-01-22 03:55:30 +08:00
parent 7e67f354e4
commit 4d85c7f665
12 changed files with 356 additions and 260 deletions

View File

@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Unity_Studio
{
public enum TextureFormat
{
Alpha8 = 1,
ARGB4444,
RGB24,
RGBA32,
ARGB32,
RGB565 = 7,
R16 = 9,
DXT1,
DXT5 = 12,
RGBA4444,
BGRA32,
RHalf,
RGHalf,
RGBAHalf,
RFloat,
RGFloat,
RGBAFloat,
YUY2,
RGB9e5Float,
BC4 = 26,
BC5,
BC6H = 24,
BC7,
DXT1Crunched = 28,
DXT5Crunched,
PVRTC_RGB2,
PVRTC_RGBA2,
PVRTC_RGB4,
PVRTC_RGBA4,
ETC_RGB4,
ATC_RGB4,
ATC_RGBA8,
EAC_R = 41,
EAC_R_SIGNED,
EAC_RG,
EAC_RG_SIGNED,
ETC2_RGB,
ETC2_RGBA1,
ETC2_RGBA8,
ASTC_RGB_4x4,
ASTC_RGB_5x5,
ASTC_RGB_6x6,
ASTC_RGB_8x8,
ASTC_RGB_10x10,
ASTC_RGB_12x12,
ASTC_RGBA_4x4,
ASTC_RGBA_5x5,
ASTC_RGBA_6x6,
ASTC_RGBA_8x8,
ASTC_RGBA_10x10,
ASTC_RGBA_12x12,
ETC_RGB4_3DS,
ETC_RGBA8_3DS,
RG16,
R8,
ETC_RGB4Crunched,
ETC2_RGBA8Crunched,
}
public enum AudioType
{
UNKNOWN,
ACC,
AIFF,
IT = 10,
MOD = 12,
MPEG,
OGGVORBIS,
S3M = 17,
WAV = 20,
XM,
XMA,
VAG,
AUDIOQUEUE
}
public enum AudioCompressionFormat
{
PCM,
Vorbis,
ADPCM,
MP3,
VAG,
HEVAG,
XMA,
AAC,
GCADPCM,
ATRAC9
}
}

View File

@ -1621,49 +1621,40 @@ namespace Unity_Studio
var m_AudioClip = new AudioClip(asset, true);
if (m_AudioClip.m_AudioData == null)
return false;
var oldextension = asset.extension;
var exportFileExtension = asset.extension;
var convertfsb = (bool)Properties.Settings.Default["convertfsb"];
if (convertfsb && exportFileExtension == ".fsb")
{
exportFileExtension = ".wav";
}
var exportFullName = exportPath + asset.Text + exportFileExtension;
if (ExportFileExists(exportFullName))
return false;
if (convertfsb && oldextension == ".fsb")
var convertAudio = (bool)Properties.Settings.Default["convertAudio"];
if (convertAudio && m_AudioClip.IsFMODSupport)
{
var exportFullName = exportPath + asset.Text + ".wav";
if (ExportFileExists(exportFullName))
return false;
FMOD.CREATESOUNDEXINFO exinfo = new FMOD.CREATESOUNDEXINFO();
var result = FMOD.Factory.System_Create(out var system);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
result = system.init(1, FMOD.INITFLAGS.NORMAL, IntPtr.Zero);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
exinfo.cbsize = Marshal.SizeOf(exinfo);
exinfo.length = (uint)m_AudioClip.m_Size;
result = system.createSound(m_AudioClip.m_AudioData, FMOD.MODE.OPENMEMORY, ref exinfo, out var sound);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
result = sound.getSubSound(0, out var subsound);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
result = subsound.getFormat(out var type, out var format, out int NumChannels, out int BitsPerSample);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
result = subsound.getDefaults(out var frequency, out int priority);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
var SampleRate = (int)frequency;
result = subsound.getLength(out var length, FMOD.TIMEUNIT.PCMBYTES);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
result = subsound.@lock(0, length, out var ptr1, out var ptr2, out var len1, out var len2);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
byte[] buffer = new byte[len1 + 44];
//添加wav头
Encoding.UTF8.GetBytes("RIFF").CopyTo(buffer, 0);
@ -1680,16 +1671,18 @@ namespace Unity_Studio
BitConverter.GetBytes(len1).CopyTo(buffer, 40);
Marshal.Copy(ptr1, buffer, 44, (int)len1);
File.WriteAllBytes(exportFullName, buffer);
result = subsound.unlock(ptr1, ptr2, len1, len2);
if (result != FMOD.RESULT.OK) { return false; }
if (result != FMOD.RESULT.OK)
return false;
subsound.release();
sound.release();
system.release();
}
else
{
var exportFullName = exportPath + asset.Text + asset.extension;
if (ExportFileExists(exportFullName))
return false;
File.WriteAllBytes(exportFullName, m_AudioClip.m_AudioData);
}
return true;