/// <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> /// 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); }
/// <summary> /// DataChunk を読み込みます。 /// </summary> /// <param name="reader">BinaryReader。</param> /// <returns>DataChunk。</returns> public static WaveDataChunk ReadFrom(BinaryReader reader) { var result = new WaveDataChunk(); result.Header = ChunkHeader.ReadFrom(reader); result.Data = reader.ReadBytes(result.Header.Size); return(result); }
/// <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); }