Пример #1
0
        /// <summary>
        /// RiffChunk を読み込みます。
        /// </summary>
        /// <param name="reader">BinaryReader。</param>
        /// <returns>RiffChunk。</returns>
        public static RiffChunk ReadFrom(BinaryReader reader)
        {
            var result = new RiffChunk();

            result.Header = ChunkHeader.ReadFrom(reader);
            result.Type = reader.ReadUInt32();

            return result;
        }
Пример #2
0
        /// <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>
        /// インスタンスを生成します。
        /// 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);
        }