コード例 #1
0
        /// <summary>
        /// インスタンスを生成します。
        /// StreamingWave が存在する間、ストリーミングのために input はオープン状態が継続され、
        /// Dispose メソッドでその Dispose メソッドが呼び出されます。
        /// </summary>
        /// <param name="input">Wave ファイルの Stream。</param>
        /// <param name="bufferDuration">バッファリングする再生時間。</param>
        public StreamingWave(Stream input, TimeSpan bufferDuration)
        {
            if (input == null)
            {
                throw new ArgumentNullException("input");
            }
            this.input = input;

            reader = new BinaryReader(input);

            // 'data' chunk のデータ部の直前まで読み込みます。
            riffChunk       = RiffChunk.ReadFrom(reader);
            formatChunk     = WaveFormatChunk.ReadFrom(reader);
            dataChunkHeader = ChunkHeader.ReadFrom(reader);

            // 'data' chunk のデータ部の開始位置を記憶します。
            dataOffset = input.Position;

            int           sampleRate = (int)formatChunk.SampleRate;
            AudioChannels channels   = (AudioChannels)formatChunk.Channels;

            dynamicSound = new DynamicSoundEffectInstance(sampleRate, channels);
            dynamicSound.BufferNeeded += new EventHandler <EventArgs>(OnDynamicSoundBufferNeeded);

            bufferSize = dynamicSound.GetSampleSizeInBytes(bufferDuration);
            buffer     = new byte[bufferSize];

            readDataAsyncCaller = new ReadDataAsyncCaller(ReadData);
        }
コード例 #2
0
ファイル: WaveData.cs プロジェクト: willcraftia/Blocks
        /// <summary>
        /// WaveData を読み込みます。
        /// </summary>
        /// <param name="reader">Wave ファイルの BinaryReader。</param>
        /// <returns>WaveData。</returns>
        public static WaveData ReadFrom(BinaryReader reader)
        {
            var result = new WaveData();

            result.Riff   = RiffChunk.ReadFrom(reader);
            result.Format = WaveFormatChunk.ReadFrom(reader);
            result.Data   = WaveDataChunk.ReadFrom(reader);

            return(result);
        }
コード例 #3
0
        /// <summary>
        /// FormatChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>FormatChunk。</returns>
        public static WaveFormatChunk ReadFrom(BinaryReader reader)
        {
            var result = new WaveFormatChunk();

            result.Header     = ChunkHeader.ReadFrom(reader);
            result.Format     = reader.ReadInt16();
            result.Channels   = reader.ReadUInt16();
            result.SampleRate = reader.ReadUInt32();
            result.BytePerSec = reader.ReadUInt32();
            result.BlockAlign = reader.ReadUInt16();
            result.BitsWidth  = reader.ReadUInt16();

            // extension
            if (result.Format == 18)
            {
                result.ExtendedSize = reader.ReadUInt16();
                result.Extended     = reader.ReadBytes(result.ExtendedSize);
            }

            return(result);
        }
コード例 #4
0
ファイル: WaveFormatChunk.cs プロジェクト: willcraftia/Blocks
        /// <summary>
        /// FormatChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>FormatChunk。</returns>
        public static WaveFormatChunk ReadFrom(BinaryReader reader)
        {
            var result = new WaveFormatChunk();

            result.Header = ChunkHeader.ReadFrom(reader);
            result.Format = reader.ReadInt16();
            result.Channels = reader.ReadUInt16();
            result.SampleRate = reader.ReadUInt32();
            result.BytePerSec = reader.ReadUInt32();
            result.BlockAlign = reader.ReadUInt16();
            result.BitsWidth = reader.ReadUInt16();

            // extension
            if (result.Format == 18)
            {
                result.ExtendedSize = reader.ReadUInt16();
                result.Extended = reader.ReadBytes(result.ExtendedSize);
            }

            return result;
        }
コード例 #5
0
ファイル: StreamingWave.cs プロジェクト: willcraftia/Blocks
        /// <summary>
        /// インスタンスを生成します。
        /// StreamingWave が存在する間、ストリーミングのために input はオープン状態が継続され、
        /// Dispose メソッドでその Dispose メソッドが呼び出されます。
        /// </summary>
        /// <param name="input">Wave ファイルの Stream。</param>
        /// <param name="bufferDuration">バッファリングする再生時間。</param>
        public StreamingWave(Stream input, TimeSpan bufferDuration)
        {
            if (input == null) throw new ArgumentNullException("input");
            this.input = input;

            reader = new BinaryReader(input);

            // 'data' chunk のデータ部の直前まで読み込みます。
            riffChunk = RiffChunk.ReadFrom(reader);
            formatChunk = WaveFormatChunk.ReadFrom(reader);
            dataChunkHeader = ChunkHeader.ReadFrom(reader);

            // 'data' chunk のデータ部の開始位置を記憶します。
            dataOffset = input.Position;

            int sampleRate = (int) formatChunk.SampleRate;
            AudioChannels channels = (AudioChannels) formatChunk.Channels;
            dynamicSound = new DynamicSoundEffectInstance(sampleRate, channels);
            dynamicSound.BufferNeeded += new EventHandler<EventArgs>(OnDynamicSoundBufferNeeded);

            bufferSize = dynamicSound.GetSampleSizeInBytes(bufferDuration);
            buffer = new byte[bufferSize];

            readDataAsyncCaller = new ReadDataAsyncCaller(ReadData);
        }