Class SoundFileReader
Reads any audio file libsndfile can decode (WAV, AIFF, FLAC, Ogg/Vorbis, Opus, MP3, …) as a repositionable WaveStream. Audio is exposed as 32-bit IEEE float, so the reader is also an ISampleProvider and feeds NAudio's float pipeline without an extra conversion stage.
public sealed class SoundFileReader : WaveStream, IAsyncDisposable, IDisposable, IWaveProvider, ISampleProvider
- Inheritance
-
SoundFileReader
- Implements
- Inherited Members
- Extension Methods
Remarks
Requires a system libsndfile. Which codecs are available depends on how that build was configured — see SoundFileCapabilities.
Constructors
SoundFileReader(Stream)
Opens an audio file from a stream. The stream is not disposed by the reader (the caller owns it). For non-seekable streams, formats that need random access to decode may fail.
public SoundFileReader(Stream inputStream)
Parameters
inputStreamStreamA readable stream positioned at the start of the audio file.
Exceptions
- SoundFileException
The stream could not be opened or decoded.
- ArgumentException
inputStreamis not readable.
SoundFileReader(string)
Opens an audio file by path.
public SoundFileReader(string path)
Parameters
pathstringPath to the audio file.
Exceptions
- SoundFileException
The file could not be opened or decoded.
Properties
CanSeek
We can seek within this stream
public override bool CanSeek { get; }
Property Value
Length
Length of the decoded audio in bytes (32-bit float samples), or 0 when the source is non-seekable and libsndfile cannot report the frame count up front (some streamed Ogg/MP3). Check CanSeek before relying on this for streamed input.
public override long Length { get; }
Property Value
Position
Position in the decoded float stream, in bytes. Setting requires a seekable source.
public override long Position { get; set; }
Property Value
Exceptions
- InvalidOperationException
The source is not seekable.
Tags
Embedded string metadata (title/artist/album/…), or empty fields when the format/file carries none.
public SoundFileTags Tags { get; }
Property Value
WaveFormat
Retrieves the WaveFormat for this stream
public override WaveFormat WaveFormat { get; }
Property Value
Methods
Dispose(bool)
Releases the unmanaged resources used by the Stream and optionally releases the managed resources.
protected override void Dispose(bool disposing)
Parameters
disposingbooltrue to release both managed and unmanaged resources; false to release only unmanaged resources.
Read(byte[], int, int)
When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read.
public override int Read(byte[] buffer, int offset, int count)
Parameters
bufferbyte[]An array of bytes. When this method returns, the buffer contains the specified byte array with the values between
offsetand (offset+count- 1) replaced by the bytes read from the current source.offsetintThe zero-based byte offset in
bufferat which to begin storing the data read from the current stream.countintThe maximum number of bytes to be read from the current stream.
Returns
- int
The total number of bytes read into the buffer. This can be less than the number of bytes requested if that many bytes are not currently available, or zero (0) if
countis 0 or the end of the stream has been reached.
Exceptions
- ArgumentException
The sum of
offsetandcountis larger than the buffer length.- ArgumentNullException
bufferis null.- ArgumentOutOfRangeException
offsetorcountis negative.- IOException
An I/O error occurs.
- NotSupportedException
The stream does not support reading.
- ObjectDisposedException
Methods were called after the stream was closed.
Read(Span<byte>)
When overridden in a derived class, reads a sequence of bytes from the current stream and advances the position within the stream by the number of bytes read.
public override int Read(Span<byte> buffer)
Parameters
bufferSpan<byte>A region of memory. When this method returns, the contents of this region are replaced by the bytes read from the current source.
Returns
- int
The total number of bytes read into the buffer. This can be less than the size of the buffer if that many bytes are not currently available, or zero (0) if the buffer's length is zero or the end of the stream has been reached.
Read(Span<float>)
Fill the specified buffer with 32 bit floating point samples
public int Read(Span<float> buffer)
Parameters
Returns
- int
The number of samples written. Return 0 to signal end of stream.