Exemplo n.º 1
0
        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");
        }
Exemplo n.º 2
0
        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);
                }
            }
        }