Esempio n. 1
0
        /// <summary>
        /// ChunkHeader を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>ChunkHeader。</returns>
        public static ChunkHeader ReadFrom(BinaryReader reader)
        {
            var result = new ChunkHeader();

            result.Id = reader.ReadUInt32();
            result.Size = reader.ReadInt32();

            return result;
        }
Esempio n. 2
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);
        }
Esempio n. 3
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);
        }