/// <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); }
/// <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); }