public void Initialize(Stream stream) { _audioInfo = new WaveAudioInfoDecoder().ReadAudioInfo(stream); _reader = new RiffReader(stream); _bitsPerSample = _audioInfo.BitsPerSample; _bytesPerSample = (int)Math.Ceiling(_audioInfo.BitsPerSample / 8.0); _framesRemaining = _audioInfo.FrameCount; _reader.Initialize(); _reader.SeekToChunk("data"); }
public AudioInfo ReadAudioInfo(Stream stream) { using (var reader = new RiffReader(stream)) { try { reader.Initialize(); if (stream.Length != reader.RiffChunkSize + 8) { throw new AudioInvalidException("Stream is unexpectedly truncated."); } reader.BaseStream.Position = 8; if (!reader.ReadFourCc().Equals("WAVE", StringComparison.Ordinal)) { throw new AudioInvalidException("Not a Wave stream."); } var fmtChunkSize = reader.SeekToChunk("fmt "); if (fmtChunkSize == 0) { throw new AudioInvalidException("Missing 'fmt' chunk."); } var isExtensible = false; switch (reader.ReadUInt16()) { // WAVE_FORMAT_PCM case 1: break; // WAVE_FORMAT_EXTENSIBLE case 0xFFFE: isExtensible = true; break; default: throw new AudioUnsupportedException("Only PCM wave streams are supported."); } var channels = reader.ReadUInt16(); var sampleRate = reader.ReadUInt32(); // Ignore nAvgBytesPerSec stream.Seek(4, SeekOrigin.Current); var blockAlign = reader.ReadUInt16(); // Use wValidBitsPerSample if this is WAVE_FORMAT_EXTENSIBLE if (isExtensible) { stream.Seek(4, SeekOrigin.Current); } return(AudioInfo.CreateForLossless( "LPCM", channels, reader.ReadUInt16(), (int)sampleRate, reader.SeekToChunk("data") / blockAlign)); } catch (EndOfStreamException e) { // The end of the stream was unexpectedly reached throw new AudioInvalidException(e.Message); } } }