using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; namespace AssetStudio { public sealed class AudioClip : NamedObject { public int m_Format; public AudioType m_Type; public bool m_3D; public bool m_UseHardware; //version 5 public int m_LoadType; public int m_Channels; public int m_Frequency; public int m_BitsPerSample; public float m_Length; public bool m_IsTrackerFormat; public int m_SubsoundIndex; public bool m_PreloadAudioData; public bool m_LoadInBackground; public bool m_Legacy3D; public AudioCompressionFormat m_CompressionFormat; public string m_Source; public ulong m_Offset; public long m_Size; public ResourceReader m_AudioData; public AudioClip(ObjectReader reader) : base(reader) { if (version[0] < 5) { m_Format = reader.ReadInt32(); m_Type = (AudioType)reader.ReadInt32(); m_3D = reader.ReadBoolean(); m_UseHardware = reader.ReadBoolean(); reader.AlignStream(); if (version[0] >= 4 || (version[0] == 3 && version[1] >= 2)) //3.2.0 to 5 { int m_Stream = reader.ReadInt32(); m_Size = reader.ReadInt32(); var tsize = m_Size % 4 != 0 ? m_Size + 4 - m_Size % 4 : m_Size; if (reader.byteSize + reader.byteStart - reader.Position != tsize) { m_Offset = reader.ReadUInt32(); m_Source = assetsFile.fullName + ".resS"; } } else { m_Size = reader.ReadInt32(); } } else { m_LoadType = reader.ReadInt32(); m_Channels = reader.ReadInt32(); m_Frequency = reader.ReadInt32(); m_BitsPerSample = reader.ReadInt32(); m_Length = reader.ReadSingle(); m_IsTrackerFormat = reader.ReadBoolean(); reader.AlignStream(); m_SubsoundIndex = reader.ReadInt32(); m_PreloadAudioData = reader.ReadBoolean(); m_LoadInBackground = reader.ReadBoolean(); m_Legacy3D = reader.ReadBoolean(); reader.AlignStream(); //StreamedResource m_Resource m_Source = reader.ReadAlignedString(); m_Offset = reader.ReadUInt64(); m_Size = reader.ReadInt64(); m_CompressionFormat = (AudioCompressionFormat)reader.ReadInt32(); } ResourceReader resourceReader; if (!string.IsNullOrEmpty(m_Source)) { resourceReader = new ResourceReader(m_Source, assetsFile, m_Offset, (int)m_Size); } else { resourceReader = new ResourceReader(reader, reader.BaseStream.Position, (int)m_Size); } m_AudioData = resourceReader; } } 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 } }