diff --git a/GameRes/AudioWAV.cs b/GameRes/AudioWAV.cs index 6db8d3d2..40c681c0 100644 --- a/GameRes/AudioWAV.cs +++ b/GameRes/AudioWAV.cs @@ -26,17 +26,16 @@ using System.ComponentModel.Composition; using System.IO; using System.Text; +using NAudio.Wave; namespace GameRes { public class WaveInput : SoundInput { - long m_data_offset; - public override long Position { - get { return m_input.Position - m_data_offset; } - set { m_input.Position = m_data_offset + value; } + get { return m_input.Position; } + set { m_input.Position = value; } } public override bool CanSeek { get { return m_input.CanSeek; } } @@ -48,98 +47,30 @@ namespace GameRes public WaveInput (Stream file) : base (file) { - using (var input = new BinaryReader (m_input, System.Text.Encoding.UTF8, true)) + var reader = new WaveFileReader (file); + m_input = reader; + var wf = reader.WaveFormat; + if (WaveFormatEncoding.MuLaw == wf.Encoding) // == 7 { - input.BaseStream.Seek (8, SeekOrigin.Current); - uint header = input.ReadUInt32(); - if (header != 0x45564157) - throw new InvalidFormatException ("Invalid WAVE file format."); - - bool found_fmt = false; - bool found_data = false; - long current_offset = input.BaseStream.Position; - - while (!found_fmt || !found_data) - { - uint header0 = input.ReadUInt32(); - uint header1 = input.ReadUInt32(); - - if (!found_fmt && 0x20746d66 == header0) - { - if (header1 < 0x10) - throw new InvalidFormatException ("Invalid WAVE file format"); - - ushort tag = input.ReadUInt16(); - var format = new WaveFormat(); - format.FormatTag = tag; - format.Channels = input.ReadUInt16(); - format.SamplesPerSecond = input.ReadUInt32(); - format.AverageBytesPerSecond = input.ReadUInt32(); - format.BlockAlign = input.ReadUInt16(); - format.BitsPerSample = input.ReadUInt16(); - format.ExtraSize = input.ReadUInt16(); - this.Format = format; - - found_fmt = true; - current_offset += 8 + ((header1 + 1) & ~1); - input.BaseStream.Seek (current_offset, SeekOrigin.Begin); - continue; - } - if (!found_data && 0x61746164 == header0) - { - found_data = true; - m_data_offset = current_offset + 8; - this.PcmSize = header1; - if (found_fmt) - break; - } - long chunk_size = (header1 + 1) & ~1; - input.BaseStream.Seek (chunk_size, SeekOrigin.Current); - - current_offset += 8 + chunk_size; - } - this.Reset(); + var wav = WaveFormatConversionStream.CreatePcmStream (reader); + wf = wav.WaveFormat; + m_input = wav; } - } - - public override void Reset () - { - m_input.Seek (m_data_offset, SeekOrigin.Begin); - } - - public override long Seek (long offset, SeekOrigin origin) - { - if (SeekOrigin.Begin == origin) - offset += m_data_offset; - else if (SeekOrigin.Current == origin) - offset = m_input.Position + offset; - else if (SeekOrigin.End == origin) - offset = m_data_offset + PcmSize + offset; - - if (offset < m_data_offset) - offset = m_data_offset; - else if (offset > m_data_offset + PcmSize) - offset = m_data_offset + PcmSize; - - offset = m_input.Seek (offset, SeekOrigin.Begin); - return offset - m_data_offset; + var format = new GameRes.WaveFormat(); + format.FormatTag = (ushort)wf.Encoding; + format.Channels = (ushort)wf.Channels; + format.SamplesPerSecond = (uint)wf.SampleRate; + format.BitsPerSample = (ushort)wf.BitsPerSample; + format.BlockAlign = (ushort)wf.BlockAlign; + format.AverageBytesPerSecond = (uint)wf.AverageBytesPerSecond; + this.Format = format; + this.PcmSize = m_input.Length; } public override int Read (byte[] buffer, int offset, int count) { - long remaining = PcmSize - Position; - if (count > remaining) - count = (int)remaining; return m_input.Read (buffer, offset, count); } - - public override int ReadByte () - { - if (Position < PcmSize) - return m_input.ReadByte(); - else - return -1; - } } [Export(typeof(AudioFormat))] diff --git a/GameRes/GameRes.csproj b/GameRes/GameRes.csproj index ac1f5660..6bfbab96 100644 --- a/GameRes/GameRes.csproj +++ b/GameRes/GameRes.csproj @@ -36,6 +36,10 @@ true + + False + ..\packages\NAudio.1.7.2\lib\net35\NAudio.dll +