NVorbis
-------

NVorbis is a .Net library for decoding Xiph.org Vorbis files.  It is purely
managed code, and should run correctly in partial-trust environments.

This implementation is based on the Vorbis specification found on xiph.org.
The MDCT and Huffman codeword generator were borrowed from public domain
implementations at http://nothings.org/stb_vorbis/.

Currently the only container supported is Xiph.org Ogg.  Matroska and RTP
are planned.

To use:

- Create an instance of NVorbis.VorbisReader (pass the Ogg Vorbis filename in)
- Use these properties to gather data about the logical stream:
    - Channels
    - SampleRate
    - TotalTime		- A TimeSpan indicating the total length of the audio data
    - DecodedTime	- A TimeSpan indicating the last returned sample's timestamp
    - NominalBitrate, UpperBitrate, and LowerBitrate
        - These are the encoder's reported bitrates
    - Vendor	- The encoder's vendor string
    - Comments	- An array of comments in the file (usually tags)
- Call "int ReadSamples(float[], int, int)" to retrieve the next batch of
  samples.  It will return 0 when the logical Vorbis stream is done.


- For NAudio support:
    - Reference NVorbis.NAudioSupport.dll
    - Create an instance of NVorbis.NAudioSupport.VorbisWaveReader
    - VorbisWaveReader implements NAudio.Wave.WaveStream.

History
-------
0.1	- 08/03/2012
    * Initial Release
0.2 - 08/07/2012
    * Swapped out LGPL code for public domain implementations
    * Relicensed under Ms-PL
    * Added NAudio support project
    * Added test files & app
    * Performance improvements
0.3 - 08/08/2012
    * Fixed Page / Packet decode (packets overlapping 2 pages)
    * Fixed "no energy" packet handling
    * Fixed packet reader not merging when unsolicited packets are added
    * Added .gitignore
    * Added initial multi-stream support
    * Added statistics (see VorbisReader.Stats)
0.4 - 08/14/2012
    * Refactoring to clean up code and make room for later improvements
    * Changed lapping algorithm to be simpler
    * Switched to higher-performance clipping algorithm
    * Some cleanup
0.4.1 - 09/11/2012
    * Fixed a couple Ogg container bugs
    * Optimized memory allocations for better performance / memory usage
0.5 - 09/20/2012
    * Added seeking support
    * Changed OggPacketReader to use a doubly-linked list for the packet queue / history
    * Changed OggPacketReader.GetTotalPageCount() to count pages directly instead of making .AddPacket(...) keep a list
    * Fixed a few bugs (mostly race conditions in multi-threaded playback scenarios)
    * Added multi-stream support to VorbisWaveReader
    * Added several info properties to VorbisWaveReader
0.5.5 - 11/15/2012
    * Added OpenTK support
    * Added makefiles for Mono
    * Added constructor to NAudioSupport for already opened Stream instances
    * Made Ogg container logic thread-safe
    * Cleanup & Optimization
0.6.0 - 06/27/2013
    * Remove ACache from project
    * Make clipping optional (default: on)
    * Set clipping to clamp at +/-.99999994 instead of +/-1 as a courtesy to those not outputing float samples
    * Performance improvements for RingBuffer
    * Performance improvements in ThreadSafeStream
0.7.0 - 07/15/2013
    * Rewrite Ogg Reader buffering logic to vastly improve memory usage
    * Reorganize to more easily support other container types / work with other Ogg stream decoders
    * Exposed Ogg reading types
    * Performance improvements
    * Bugfix: Don't throw on Vorbis streams that only have a single mode
0.7.1 - 07/18/2013
    * Removed use of generics & lambda from Huffman decoder
    * Reduced computation by only processing samples that are required for output
    * Bugfix: Seeking now works again
    * Bugfix: OpenTKSupport.OggStream now only queues as many source buffers as it filled
0.7.2 - 07/22/2013
    * Bugfix: Floor 0 implementation is now correct
    * Bugfix: Residue 0 & 1 implementation is now correct
    * Bugfix: Seeking back less than the current buffer size no longer corrupts the read buffer
0.7.3 - 08/02/2013
    * Bugfix: Fix residue 1
0.7.4 - 09/16/2013
    * Bugfix: Some stereo files with sound on only one channel decoded noise on the silent channel.
0.8.0test1 - 09/16/2013
    * Rebuilt container reading infrastructure so it is properly decoupled from the decoder
    * Added unit tests for the packet reader, Ogg container reader
0.8.0 - 01/16/2014
    * Minor bugfixing to test1
    * Replaces 0.7.4 as recommended release
0.8.1 - 02/24/2014
    * Bugfix: Threading issues in Ogg reader
    * Rewrite StreamReadBuffer (again) for simplicity and correctness
    * Add "saved buffer" concept to StreamReadBuffer for multi-threaded performance
    * Reduce Ogg reader memory usage
    * Add locking for multi-threading support in Ogg reader
    * Remove exception-based logic where possible for better performance
0.8.2 - 03/19/2014
    * BugFix: Don't try to copy StreamReadBuffer data when offset is bigger than source
    * Add parameter change event to packet provider interface
    * Refactored decoder setup so parameter change can be handled
    * Rewrote packet peek / get logic for simplicity
    * Refactored locking in OggPacketReader / OggContainerReader
    * Improved Ogg end of stream handling
    * Changed container seek API to use packets instead of indexes to reduce linked list traversals
0.8.3 - 04/29/2014
    * BugFix: Don't set the end of stream flag until the last packet of the page
