Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fork of with some performance improvements and a streaming sample for OpenTK
C# Shell
Branch: master

Fetching latest commit…

Cannot retrieve the latest commit at this time

Failed to load latest commit information.
OpenTKSupport Merge branch 'latest-upstream'
README * Update version numbers and NuGet package
publish.cmd * More cleanup



NVorbis is a .Net library for decoding 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
The MDCT and Huffman codeword generator were borrowed from public domain
implementations at

Currently the only container supported is 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.

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
Something went wrong with that request. Please try again.