NAudio 3.1.0

NAudio

Nuget

NAudio is an open source .NET audio library written by Mark Heath and contributors.

This is the main NAudio meta-package. Installing it pulls in everything you need to play, record and manipulate audio on .NET, and adds AudioFileReader — the one-line "just open this audio file" reader that picks the right decoder for you — along with Mp3FileReader.

Requires net9.0 or later. If you need .NET Framework or .NET Standard 2.0, use NAudio 2.x.

What it pulls in

Always, on every target framework:

  • NAudio.Core — the format-independent core: WaveStream, IWaveProvider / ISampleProvider, WAV and AIFF readers and writers, mixing, resampling, DSP, and the NAudio.Effects framework
  • NAudio.Midi — the MIDI event model and Standard MIDI File reading and writing

Additionally, on a Windows target framework:

  • NAudio.Wasapi — WASAPI playback, capture and loopback (WasapiPlayer / WasapiRecorder), plus Media Foundation codecs
  • NAudio.WinMM — WaveOut / WaveIn, classic MIDI I/O, ACM codecs and mixer controls via winmm.dll
  • NAudio.Asio — low-latency multichannel playback and capture through ASIO drivers
  • NAudio.Dmo — DMO effects, the DMO MP3 decoder and resampler, and DirectSoundOut
  • NAudio.WinForms — Windows Forms controls, and the window-callback WaveOutWindow / WaveInWindow

On a non-Windows target framework only the cross-platform pieces are referenced. If you only need a subset, reference the individual packages directly rather than this meta-package.

Optional packages

These are not pulled in by the meta-package — add them explicitly if you want them:

Package Platform What it gives you
NAudio.Sampler cross-platform Polyphonic software sampler — SoundFont (.sf2), SFZ and single-sample instruments
NAudio.SoundFile cross-platform Read and write WAV/AIFF/FLAC/Ogg-Vorbis/Opus/MP3 via libsndfile
NAudio.Alsa Linux AlsaOut / AlsaIn playback and capture via libasound
NAudio.Vst3 Windows VST 3 plug-in hosting (preview) — effects and instruments
NAudio.Extras cross-platform (+ Windows extras) Opinionated helpers — playback engine, capture mixing, ID3 tags

Getting started

using NAudio.Wave;

using var audioFile = new AudioFileReader("myfile.mp3");
using var player = new WasapiPlayerBuilder().Build();
player.Init(audioFile);
player.Play();
while (player.PlaybackState == PlaybackState.Playing)
{
    Thread.Sleep(500);
}

License

MIT. See the project site for source, issues, and contribution guidelines.

No packages depend on NAudio.

A correctness release, with Native AOT as the theme. NAudio's remaining `[StructLayout]` interop types — `WAVEHDR`, `ACMSTREAMHEADER` and `WaveFormat` itself — were passed to native code by value, which CoreCLR pins in place but the AOT marshaller copies into a per-call temporary. Anything the driver or codec wrote back was silently discarded, so `WaveIn`/`WaveOut`, ACM conversion (and with it `Mp3FileReader` and `AudioFileReader`) and every WASAPI, Media Foundation and DMO format negotiation were broken in an AOT-published app while building and running cleanly. Those paths now marshal by hand into stable unmanaged blocks, and `NAudio.WinMM` joins the AOT-compatible package set. The two breaking changes below both fall out of that work. Also fixed are two 3.0.0 regressions — `Mp3FileReaderBase` seeking on files with a Xing/Info header, and `WdlResamplingSampleProvider` losing samples when its source under-feeds — and a pair of infinite loops in the WAV parser on corrupt files. * **Breaking:** `WaveFormat` and its subclasses no longer carry `[StructLayout]`, so `Marshal.SizeOf` and `Marshal.PtrToStructure` on them now throw `ArgumentException` instead of silently returning wrong data under Native AOT (`Marshal.SizeOf<WaveFormatExtensible>()` returned 22 rather than 40, and a decoded format kept its constructor defaults). NAudio itself stopped marshalling these types in 3.1.0; use `ToWaveFormatExBytes`, `MarshalToPtr` or `MarshalFromPtr` to cross a native boundary (#1432) * **Breaking:** `AudioClient.IsFormatSupported` and `WasapiPlayer.IsFormatSupported` now return the closest-match format as `out WaveFormat` rather than `out WaveFormatExtensible`. WASAPI documents this format as either a `WAVEFORMATEX` or a `WAVEFORMATEXTENSIBLE`, and the old signature could only represent the latter — a plain format was previously decoded as a `WaveFormatExtensible` whose base fields were valid but whose extensible fields were meaningless. Callers needing the extensible fields should pattern-match (#1425) * Fixed `WaveIn`/`WaveOut` failing under Native AOT with `WaveHeaderUnprepared` ("The wave header was not prepared"). The `WAVEHDR` was a `[StructLayout]` class passed to winmm by value, which CoreCLR pins in place but NativeAOT copies into a per-call temporary, so the driver's `WHDR_PREPARED`/`WHDR_DONE`/`dwBytesRecorded` writes were discarded. It is now a struct in a stable unmanaged block (#1425) * Fixed ACM conversion failing under Native AOT — `WaveFormatConversionStream`, `AcmStream` and so `Mp3FileReader` and `AudioFileReader`. `ACMSTREAMHEADER` was a `[StructLayout]` class passed to msacm32 by value, and the codec keeps private state in the header's reserved fields between `acmStreamPrepareHeader`, `acmStreamConvert` and `acmStreamUnprepareHeader`; the AOT marshaller's per-call copy round-trips only the declared fields, so that state was lost and conversion failed. It is now a struct in a stable unmanaged block, as `WAVEHDR` already is (#1425) * Fixed `WaveFormat.MarshalToPtr` and `WaveFormat.MarshalFromPtr` corrupting any `WaveFormat` subclass under Native AOT — the AOT marshaller drops the inherited `WAVEFORMATEX` fields of a class hierarchy, so a `WaveFormatExtensible` was written with its SubFormat GUID over the sample rate. Every remaining site that sized or wrote a `WaveFormat` with `Marshal.SizeOf`/`StructureToPtr` was converted too: WASAPI (`AudioClient`), Media Foundation (`MFInitMediaTypeFromWaveFormatEx`, reachable from `MediaFoundationResampler`/`MediaFoundationEncoder`), DMO (`DmoMediaType.SetWaveFormat`, `MediaObject`) and ACM (`AcmStream`, `AcmDriver`) (#1425) * `WaveFormat.MarshalToPtr` now always allocates at least the `18 + cbSize` bytes it advertises. A `WaveFormat` subclass that declares `extraSize` but doesn't write it in `Serialize` previously produced a block shorter than its own `cbSize`, which a native consumer would read past (#1425) * Added `WaveFormat.ToWaveFormatExBytes()`, which renders a `WaveFormat` as a native WAVEFORMATEX byte array. `MarshalToPtr` is now a thin wrapper over it, for callers who need an unmanaged block rather than a buffer they already own (#1425) * Added a `Serialize` override to `Mp3WaveFormat`, which previously advertised `cbSize` = 12 but wrote none of its 12 MPEGLAYER3WAVEFORMAT extra bytes (#1425) * `WaveFormatExtraData` now sizes its buffer from `cbSize` instead of holding a fixed 100-byte array, so a fmt chunk declaring more than 100 bytes of extra data keeps it rather than having all of it discarded (#482). The fixed size existed only because `[MarshalAs(ByValArray, SizeConst = 100)]` needed a compile-time length. `ExtraData` is now exactly `ExtraSize` bytes long rather than always 100 (#1432) * `NAudio.WinMM` is now marked `IsAotCompatible`, and the AOT smoke test covers the winmm WAVEHDR/WAVEFORMATEX paths (#1425) * Fixed `Mp3FileReaderBase` seeking silently restarting playback from the beginning of the file on MP3s with a Xing/Info header — the lazy frame index was gated on `IsLengthExact`, which such a header sets without any frame having been scanned. Also fixed seeks landing on the wrong frame when the target fell exactly on a frame boundary, and Xing/Info header frames being indexed as audio (shifting every seek in those files ~26 ms early). A 3.0.0 regression (#1419) * Fixed `WdlResamplingSampleProvider` losing samples, and eventually returning 0 permanently, when asked for more output than the source could supply — a 3.0.0 regression that broke the common pattern of reading generously from a `BufferedWaveProvider`-backed capture chain. `WdlResampler.ResampleOut` also no longer drifts in input-driven (feed) mode when handed fewer samples than `ResamplePrepare` requested (#1412) * Fixed two infinite loops in the WAV parser triggered by corrupt files declaring a negative chunk size. An RF64 `ds64` chunk with a negative `dataChunkLength`, or a `LIST/adtl` sub-chunk with a negative size, made the chunk walk advance by zero bytes per iteration and spin at 100% CPU without throwing. Negative and oversized sizes are now rejected where they are read, and an undersized `ds64` chunk throws `FormatException` rather than `ArgumentOutOfRangeException` (#1428) * Fixed the `NAudioConsoleTest` WASAPI exclusive-mode quick scan reporting no supported formats at all on devices that support plenty — it built its probe formats with an empty `WAVEFORMATEXTENSIBLE` channel mask, which drivers such as Realtek reject outright. It now probes with the canonical layout for the channel count, the same mask the library's own format adaptation uses (#1431)

.NET 9.0

.NET 9.0

.NET 9.0

Version Downloads Last updated
3.1.1-preview.2 1 09/25/2026
3.1.1-preview.1 2 09/15/2026
3.1.0 2 09/15/2026
3.1.0-preview.2 2 09/15/2026
3.1.0-preview.1 2 09/15/2026
3.0.2-preview.2 2 09/15/2026
3.0.2-preview.1 2 09/15/2026
3.0.1 2 09/15/2026
3.0.1-preview.1 2 09/15/2026
3.0.0 2 09/15/2026
3.0.0-preview.20 2 09/15/2026
3.0.0-preview.19 2 09/15/2026
3.0.0-preview.18 2 09/15/2026
3.0.0-preview.17 2 09/15/2026
3.0.0-preview.16 2 09/15/2026
3.0.0-preview.15 2 09/15/2026
3.0.0-preview.14 2 09/15/2026
3.0.0-preview.10 2 09/15/2026
3.0.0-preview.9 2 09/15/2026
3.0.0-preview.8 2 09/15/2026
3.0.0-preview.7 2 09/15/2026
3.0.0-preview.6 2 09/15/2026
3.0.0-preview.5 2 09/15/2026
3.0.0-preview.4 2 09/15/2026
3.0.0-preview.3 2 09/15/2026
3.0.0-preview.2 2 09/15/2026
2.4.0 2 09/15/2026
2.3.0 2 09/15/2026
2.2.1 2 09/15/2026
2.2.0 2 09/15/2026
2.1.0 2 09/15/2026
2.1.0-beta.1 2 09/15/2026
2.0.1 2 09/15/2026
2.0.0 2 09/15/2026
2.0.0-beta2 2 09/15/2026
2.0.0-beta1 2 09/15/2026
1.10.0 2 09/15/2026
1.9.0 2 09/15/2026
1.9.0-preview2 2 09/15/2026
1.9.0-preview1 2 09/15/2026
1.8.5 2 09/15/2026
1.8.4 2 09/15/2026
1.8.3 2 09/15/2026
1.8.2 2 09/15/2026
1.8.1 2 09/15/2026
1.8.0 2 09/15/2026
1.7.3 6 09/15/2026
1.7.2 2 09/15/2026
1.7.1 2 09/15/2026
1.7.0 2 09/15/2026
1.7.0-beta01 2 09/15/2026
1.7.0-alpha06 2 09/15/2026
1.7.0-alpha05 2 09/15/2026
1.7.0-alpha04 2 09/15/2026
1.7.0-alpha03 2 09/15/2026
1.7.0-alpha02 2 09/15/2026
1.7.0-alpha01 2 09/15/2026
1.6.0 2 09/15/2026
1.5.7-beta 2 09/15/2026
1.5.6-beta 2 09/15/2026
1.5.5-beta 2 09/15/2026
1.5.4-beta 2 09/15/2026
1.5.3-beta 2 09/15/2026
1.5.2-beta 2 09/15/2026
1.5.1-beta 2 09/15/2026
1.5.0 2 09/15/2026