From 9a43b6b05520505527bbcda15c094a9c7b0a6d00 Mon Sep 17 00:00:00 2001 From: morkt Date: Thu, 14 May 2015 11:26:47 +0400 Subject: [PATCH] refactored SoundInput interface. added Source property for access to underlying stream. --- ArcFormats/AudioMP3.cs | 4 ++- ArcFormats/AudioOGG.cs | 6 +++-- ArcFormats/AudioPMW.cs | 2 ++ ArcFormats/AudioWADY.cs | 24 +++++++++-------- ArcFormats/Properties/AssemblyInfo.cs | 4 +-- GameRes/Audio.cs | 29 +++++++++----------- GameRes/AudioWAV.cs | 38 ++++++++++++++++++++------- 7 files changed, 64 insertions(+), 43 deletions(-) diff --git a/ArcFormats/AudioMP3.cs b/ArcFormats/AudioMP3.cs index 5cd47dc9..7b7e856a 100644 --- a/ArcFormats/AudioMP3.cs +++ b/ArcFormats/AudioMP3.cs @@ -47,9 +47,11 @@ namespace GameRes.Formats get { return m_bitrate; } } + public override string SourceFormat { get { return "mp3"; } } + public Mp3Input (Stream file) : base (file) { - m_reader = new Mp3FileReader (m_input); + m_reader = new Mp3FileReader (file); m_bitrate = m_reader.Mp3WaveFormat.AverageBytesPerSecond*8; var format = new GameRes.WaveFormat(); format.FormatTag = (ushort)m_reader.WaveFormat.Encoding; diff --git a/ArcFormats/AudioOGG.cs b/ArcFormats/AudioOGG.cs index 9de15c46..fec595d2 100644 --- a/ArcFormats/AudioOGG.cs +++ b/ArcFormats/AudioOGG.cs @@ -48,16 +48,18 @@ namespace GameRes.Formats } } - public override bool CanSeek { get { return m_input.CanSeek; } } + public override bool CanSeek { get { return Source.CanSeek; } } public override int SourceBitrate { get { return m_reader.NominalBitrate; } } + public override string SourceFormat { get { return "ogg"; } } + public OggInput (Stream file) : base (file) { - m_reader = new VorbisReader (m_input, false); + m_reader = new VorbisReader (Source, false); var format = new GameRes.WaveFormat(); format.FormatTag = 3; // WAVE_FORMAT_IEEE_FLOAT format.Channels = (ushort)m_reader.Channels; diff --git a/ArcFormats/AudioPMW.cs b/ArcFormats/AudioPMW.cs index 702aa61b..f0dda172 100644 --- a/ArcFormats/AudioPMW.cs +++ b/ArcFormats/AudioPMW.cs @@ -57,6 +57,8 @@ namespace GameRes.Formats.ScenePlayer { if (null == sound) wav.Dispose(); + else + file.Dispose(); } return sound; } diff --git a/ArcFormats/AudioWADY.cs b/ArcFormats/AudioWADY.cs index 7a7fd9a8..11fa54a4 100644 --- a/ArcFormats/AudioWADY.cs +++ b/ArcFormats/AudioWADY.cs @@ -36,30 +36,32 @@ namespace GameRes.Formats.Marble public override long Position { - get { return m_input.Position; } - set { m_input.Position = value; } + get { return Source.Position; } + set { Source.Position = value; } } - public override bool CanSeek { get { return m_input.CanSeek; } } + public override bool CanSeek { get { return Source.CanSeek; } } public override int SourceBitrate { get { return (int)Format.AverageBytesPerSecond * 8; } } + public override string SourceFormat { get { return "raw"; } } + public override long Seek (long offset, SeekOrigin origin) { - return m_input.Seek (offset, origin); + return Source.Seek (offset, origin); } public override int Read (byte[] buffer, int offset, int count) { - return m_input.Read (buffer, offset, count); + return Source.Read (buffer, offset, count); } public override int ReadByte () { - return m_input.ReadByte(); + return Source.ReadByte(); } public WadyInput (Stream file) : base (new MemoryStream()) @@ -83,13 +85,13 @@ namespace GameRes.Formats.Marble int remaining = (int)(input.BaseStream.Length-input.BaseStream.Position); if (remaining == src_size) { - (m_input as MemoryStream).Capacity = src_size * 2; - Decode (input, src_size, m_input); + (Source as MemoryStream).Capacity = src_size * 2; + Decode (input, src_size, Source); } else - Decode2 (input, m_input); - m_input.Position = 0; - this.PcmSize = m_input.Length; + Decode2 (input, Source); + Source.Position = 0; + this.PcmSize = Source.Length; } } diff --git a/ArcFormats/Properties/AssemblyInfo.cs b/ArcFormats/Properties/AssemblyInfo.cs index fa987e9f..6a7ba544 100644 --- a/ArcFormats/Properties/AssemblyInfo.cs +++ b/ArcFormats/Properties/AssemblyInfo.cs @@ -32,5 +32,5 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion ("1.0.4.50")] -[assembly: AssemblyFileVersion ("1.0.4.50")] +[assembly: AssemblyVersion ("1.0.4.51")] +[assembly: AssemblyFileVersion ("1.0.4.51")] diff --git a/GameRes/Audio.cs b/GameRes/Audio.cs index 17c5bbbb..c000622a 100644 --- a/GameRes/Audio.cs +++ b/GameRes/Audio.cs @@ -40,26 +40,17 @@ namespace GameRes public abstract class SoundInput : Stream { - protected Stream m_input; - protected long m_pcm_size; - - public override bool CanRead { get { return m_input.CanRead; } } - public override bool CanWrite { get { return false; } } - public override long Length { get { return m_pcm_size; } } - - public long PcmSize - { - get { return m_pcm_size; } - protected set { m_pcm_size = value; } - } - - public abstract int SourceBitrate { get; } + public abstract int SourceBitrate { get; } + public abstract string SourceFormat { get; } public WaveFormat Format { get; protected set; } + public Stream Source { get; protected set; } + public long PcmSize { get; protected set; } + protected SoundInput (Stream input) { - m_input = input; + Source = input; } public virtual void Reset () @@ -68,9 +59,13 @@ namespace GameRes } #region System.IO.Stream methods + public override bool CanRead { get { return Source.CanRead; } } + public override bool CanWrite { get { return false; } } + public override long Length { get { return PcmSize; } } + public override void Flush() { - m_input.Flush(); + Source.Flush(); } public override long Seek(long offset, SeekOrigin origin) @@ -108,7 +103,7 @@ namespace GameRes { if (disposing) { - m_input.Dispose(); + Source.Dispose(); } disposed = true; base.Dispose (disposing); diff --git a/GameRes/AudioWAV.cs b/GameRes/AudioWAV.cs index 3b7dd306..dfb5aac3 100644 --- a/GameRes/AudioWAV.cs +++ b/GameRes/AudioWAV.cs @@ -32,29 +32,32 @@ namespace GameRes { public class WaveInput : SoundInput { + WaveStream m_reader; + public override long Position { - get { return m_input.Position; } - set { m_input.Position = value; } + get { return m_reader.Position; } + set { m_reader.Position = value; } } - public override bool CanSeek { get { return m_input.CanSeek; } } + public override bool CanSeek { get { return m_reader.CanSeek; } } public override int SourceBitrate { get { return (int)Format.AverageBytesPerSecond * 8; } } + public override string SourceFormat { get { return "wav"; } } + public WaveInput (Stream file) : base (file) { - var reader = new WaveFileReader (file); - m_input = reader; - var wf = reader.WaveFormat; + m_reader = new WaveFileReader (file); + var wf = m_reader.WaveFormat; if (WaveFormatEncoding.Adpcm == wf.Encoding || WaveFormatEncoding.MuLaw == wf.Encoding) // 2 || 7 { - var wav = WaveFormatConversionStream.CreatePcmStream (reader); + var wav = WaveFormatConversionStream.CreatePcmStream (m_reader); wf = wav.WaveFormat; - m_input = wav; + m_reader = wav; } var format = new GameRes.WaveFormat(); format.FormatTag = (ushort)wf.Encoding; @@ -64,13 +67,28 @@ namespace GameRes format.BlockAlign = (ushort)wf.BlockAlign; format.AverageBytesPerSecond = (uint)wf.AverageBytesPerSecond; this.Format = format; - this.PcmSize = m_input.Length; + this.PcmSize = m_reader.Length; } public override int Read (byte[] buffer, int offset, int count) { - return m_input.Read (buffer, offset, count); + return m_reader.Read (buffer, offset, count); } + + #region IDisposable Members + protected override void Dispose (bool disposing) + { + if (null != m_reader) + { + if (disposing) + { + m_reader.Dispose(); + } + m_reader = null; + base.Dispose (disposing); + } + } + #endregion } [Export(typeof(AudioFormat))]