NAudio 3.3.0-preview.1

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 what you need to play, record and manipulate audio on Windows, 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

On any target framework (net9.0 or later, with or without -windows):

  • 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 (plus WinRT live MIDI I/O when your project targets net9.0-windows10.0.19041.0 or later)
  • 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.Wasapi and NAudio.WinMM are Windows-only at runtime. They're marked [SupportedOSPlatform("windows")], so the platform compatibility analyzer (CA1416) flags unguarded calls from code that isn't Windows-specific. AudioFileReader reads PCM/float WAV and AIFF everywhere, and uses Media Foundation (MP3, AAC, WMA, FLAC…) and ACM (compressed WAV) when running on Windows.

If you're targeting Linux or macOS, you probably want the individual packages (NAudio.Core plus NAudio.Alsa, NAudio.MacOS or NAudio.SoundFile) 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.Asio Windows Low-latency multichannel playback and capture through ASIO drivers (AsioDevice, AsioOut)
NAudio.Dmo Windows DirectSoundOut, DMO effects, and the DMO MP3 decoder and resampler
NAudio.WinForms Windows (netX.0-windows) Windows Forms controls, and the window-callback WaveOutWindow / WaveInWindow
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 (playback engine Windows-only) Opinionated helpers — playback engine, capture mixing, ID3 tags

NAudio 3.0–3.2 included NAudio.Asio, NAudio.Dmo and NAudio.WinForms in this meta-package on Windows target frameworks. If you're upgrading and use any of them, add the package reference.

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.

Showing the top 20 packages that depend on NAudio.

Packages Downloads
NDILibDotNetCoreBase
Provides a wrapper to the NDI libraries for Windows, macOS, and Linux.
21
NDILibDotNetCoreBase
Provides a wrapper to the NDI libraries for Windows, macOS, and eventually Linux.
21
NDILibDotNetCoreBase
Provides a wrapper to the NDI libraries for Windows, macOS, and eventually Linux.
19
NDILibDotNetCoreBase
Provides a wrapper to the NDI libraries for Windows, macOS, and Linux.
19
NDILibDotNetCoreBase
Provides a wrapper to the NDI libraries for Windows, macOS, and eventually Linux.
16

  • Fixed WasapiRecorder not able to re-start after successfully stopping the recorder. (#1479)
  • Nullable reference types in NAudio.Core - NAudio.Core is now compiled with nullable reference types enabled, so its public API carries nullability annotations (e.g. WaveFileReader.ReadNextSampleFrame and Mp3Frame.LoadFromStream return nullable types, and Mp3Frame.RawData is byte[]? when a frame is read without its data). This is a source-level change only: there are no binary breaks, but projects with nullable enabled may see new warnings, and overrides of NAudio.Core virtual members may need matching annotations. XingHeader.LoadXingHeader now returns null for a frame read without its data instead of throwing. Thanks to @Seb-stian (#1452)
  • Nullable reference types in NAudio.Midi - NAudio.Midi is now also compiled with nullable reference types enabled (e.g. MidiInMessageEventArgs.MidiEvent and NoteOnEvent.OffEvent are nullable). Source-level change only; projects with nullable enabled may see new warnings. MidiEvent.ReadNextEvent now throws FormatException instead of NullReferenceException for running status with no previous event, and RawMetaEvent treats null data as empty (#825)
  • Nullable reference types in NAudio.WinMM - NAudio.WinMM is now compiled with nullable reference types enabled (e.g. AcmDriver.FindByShortName and WaveCapabilitiesHelpers.GetNameFromGuid return nullable types, and AcmDriver.ShowFormatChooseDialog has nullable out parameters). Source-level change only; projects with nullable enabled may see new warnings. WaveOut.OutputWaveFormat before Init now throws InvalidOperationException, AcmStream members throw ObjectDisposedException after dispose, and GetNameFromGuid returns null instead of throwing when the registry key is missing, where each previously threw NullReferenceException (#825)
  • Nullable reference types in NAudio.SoundFile and NAudio.Sampler - both packages are now compiled with nullable reference types enabled (e.g. the SoundFileTags fields, SoundFileWriterOptions.Tags and SoundFileException.Function are nullable, and the TryLoad methods on WaveSampleLoader / ISfzSampleLoader mark left as non-null on success and right as null for mono). Source-level change only; projects with nullable enabled may see new warnings, and custom ISfzSampleLoader implementations may need matching annotations (#825)
  • NAudio.WinMM, NAudio.Asio, NAudio.Dmo and NAudio.Vst3 now target plain net9.0 instead of net9.0-windows, matching NAudio.Wasapi. They remain Windows-only, enforced by [SupportedOSPlatform("windows")], but can now be referenced directly from a plain netX.0 project (calls show CA1416 warnings unless guarded or the project is marked Windows-only) and built on Linux/macOS without EnableWindowsTargeting. No change for projects targeting netX.0-windows (#1482)
  • Breaking: the NAudio meta-package is now a single net9.0 package that pulls in NAudio.Core, NAudio.Midi, NAudio.WinMM and NAudio.Wasapi on every target framework. A plain netX.0 project on Windows (e.g. a console app on net10.0) now gets Mp3FileReader, WaveOut, WasapiPlayer and an AudioFileReader that reads MP3, where previously it silently got a cross-platform subset that threw NotSupportedException (#1472). It no longer includes NAudio.Asio, NAudio.Dmo or NAudio.WinForms: add those packages if you use AsioOut/AsioDevice, DirectSoundOut or the DMO effects, or WaveOutWindow/WaveInWindow/the NAudio.Gui controls. AudioFileReader now chooses its Media Foundation/ACM paths at runtime, and off Windows its NotSupportedException messages point to NAudio.SoundFile. NAudio.Extras is now single-target net9.0, with AudioPlaybackEngine marked Windows-only (#1485)
  • Nullable reference types in NAudio.WinForms, NAudio.Alsa and NAudio.Extras - these packages are now compiled with nullable reference types enabled (e.g. WaveViewer.WaveStream, AlsaException.Function and the control/device events are nullable). Source-level change only; projects with nullable enabled may see new warnings. AlsaOut.OutputWaveFormat and WaveOutWindow.OutputWaveFormat now throw InvalidOperationException before Init (previously null and NullReferenceException respectively), and WaveOutWindow.Play before Init throws InvalidOperationException instead of NullReferenceException (#825)
  • Nullable reference types in NAudio.Asio - NAudio.Asio is now compiled with nullable reference types enabled (e.g. the optional AsioPlaybackOptions.OutputChannels / AsioDuplexOptions.InputChannels, the AsioDevice/AsioOut events and the AsioDriverExt callbacks are nullable; required option members such as Source and Processor stay non-nullable). Source-level change only; projects with nullable enabled may see new warnings. AsioOut members now throw ObjectDisposedException after Dispose and AsioOut.OutputWaveFormat throws InvalidOperationException when no playback source is initialised, where they previously threw NullReferenceException or returned null (#825)
  • Nullable reference types in NAudio.Dmo - NAudio.Dmo is now compiled with nullable reference types enabled (e.g. DirectSoundOut.PlaybackStopped and DirectSoundDeviceInfo.ModuleName are nullable). Source-level change only; projects with nullable enabled may see new warnings. DirectSoundOut.OutputWaveFormat now throws InvalidOperationException before Init instead of returning null, and the MediaObject wrappers, DmoResampler.MediaObject, WindowsMediaMp3Decoder.MediaObject and DmoOutputDataBuffer.MediaBuffer throw ObjectDisposedException after Dispose instead of returning null or throwing NullReferenceException (#825)
  • Nullable reference types in NAudio.Wasapi (CoreAudioApi and MediaFoundation) - the NAudio.CoreAudioApi and NAudio.MediaFoundation types are now annotated for nullable reference types (e.g. AudioClient.TryGetAcousticEchoCancellationControl, MMDeviceEnumerator.TryGetDefaultAudioEndpoint, MfSourceReader.ReadSample, PropertyStoreProperty.Value and Part.AudioVolumeLevel/AudioMute/JackDescription are nullable); WasapiOut, WasapiCapture and the other top-level classes follow in a separate change. Source-level change only; projects with nullable enabled may see new warnings. The CoreAudio and Media Foundation COM wrappers now throw ObjectDisposedException when used after Dispose instead of NullReferenceException, AudioSessionManager.Sessions throws InvalidOperationException instead of returning null when sessions are unavailable, and AudioSessionControl.AudioMeterInformation / SimpleAudioVolume throw NotSupportedException instead of returning null if the session does not expose those interfaces (#825)
  • Nullable reference types in NAudio.Wasapi (playback, capture and Media Foundation classes) - WasapiOut, WasapiCapture, WasapiPlayer, WasapiRecorder, their builders and MediaFoundationReader/StreamMediaFoundationReader/MediaFoundationEncoder are now annotated too, completing NAudio.Wasapi (e.g. WasapiPlayer/WasapiRecorder.DeviceId and DeviceFriendlyName, LowLatencyUnavailableReason, WasapiRecorder.AcousticEchoCancellationControl, WasapiPlayer.GetSupportedExclusiveFormat, MediaFoundationEncoder.SelectMediaType and the playback/recording events are nullable). Source-level change only; projects with nullable enabled may see new warnings. The WASAPI classes now throw ObjectDisposedException when used after Dispose, and report InvalidOperationException instead of NullReferenceException through PlaybackStopped when playback is started without Init (#825)
  • Nullable reference types in NAudio.MacOS - NAudio.MacOS is now compiled with nullable reference types enabled (e.g. AudioSystemObject.DefaultInputDevice/DefaultOutputDevice, the ConvertUIDToDevice-style lookups, AudioObject.Owner, AudioDevice.Icon, ExtendedAudioFileReaderSettings.OutputFormat, ExtendedAudioFileWriterSettings.FileType/ProvidingFormat and the player, recorder and property-listener events are nullable). Source-level change only; projects with nullable enabled may see new warnings. Object-list properties such as AudioSystemObject.Devices now skip unknown object IDs instead of returning null entries, the parameterless CoreAudioPlayer/CoreAudioRecorder constructors throw InvalidOperationException instead of ArgumentNullException when there is no default device, and ExtendedAudioFileWriter captures ProvidingFormat when created rather than re-reading the settings object on every write (#825)
  • Fixed several buffer and handle lifetime bugs in the winmm MIDI backend: MidiOut.SendBuffer no longer frees a sysex buffer while the driver may still own it, MidiIn now stops input before resetting it, and neither class calls into winmm with a handle it never opened. MidiOut.SendBuffer now blocks until the driver releases the buffer and throws MmException if the send fails.
  • Fixed MediaFoundationReader reporting a Position that was not a whole number of frames after seeking a compressed file (e.g. MP3 or AAC), up to a frame before the requested position, and a Length that could include a partial frame. Seeks now round down to a frame boundary and land exactly on it (#1488)

.NET 9.0

Version Downloads Last updated
3.3.0-preview.1 3 10/18/2026
3.2.0 2 10/15/2026
3.2.0-preview.1 5 10/13/2026
3.1.1-preview.2 12 09/22/2026
3.1.1-preview.1 12 09/10/2026
3.1.0 9 09/07/2026
3.1.0-preview.2 10 09/06/2026
3.1.0-preview.1 14 09/04/2026
3.0.2-preview.2 10 09/03/2026
3.0.2-preview.1 17 08/20/2026
3.0.1 15 08/18/2026
3.0.1-preview.1 15 08/18/2026
3.0.0 15 08/16/2026
3.0.0-preview.20 17 08/10/2026
3.0.0-preview.19 16 07/29/2026
3.0.0-preview.18 15 07/18/2026
3.0.0-preview.17 18 07/15/2026
3.0.0-preview.16 13 07/01/2026
3.0.0-preview.15 3 09/25/2026
3.0.0-preview.14 4 09/25/2026
3.0.0-preview.10 5 09/08/2026
3.0.0-preview.9 3 09/25/2026
3.0.0-preview.8 3 09/25/2026
3.0.0-preview.7 4 09/21/2026
3.0.0-preview.6 7 09/19/2026
3.0.0-preview.5 0 05/11/2026
3.0.0-preview.4 1 09/25/2026
3.0.0-preview.3 2 09/18/2026
3.0.0-preview.2 1 09/16/2026
2.4.0 12 08/28/2026
2.3.0 21 05/30/2026
2.2.1 20 05/30/2026
2.2.0 23 05/30/2026
2.1.0 16 05/30/2026
2.1.0-beta.1 17 05/30/2026
2.0.1 23 05/30/2026
2.0.0 21 05/30/2026
2.0.0-beta2 20 05/30/2026
2.0.0-beta1 18 05/30/2026
1.10.0 22 05/29/2026
1.9.0 18 05/30/2026
1.9.0-preview2 17 05/30/2026
1.9.0-preview1 19 05/30/2026
1.8.5 18 05/30/2026
1.8.4 20 05/30/2026
1.8.3 18 05/30/2026
1.8.2 17 05/30/2026
1.8.1 20 05/30/2026
1.8.0 3 09/21/2026
1.7.3 20 05/30/2026
1.7.2 19 05/30/2026
1.7.1 18 05/30/2026
1.7.0 17 05/30/2026
1.7.0-beta01 20 05/30/2026
1.7.0-alpha06 6 09/10/2026
1.7.0-alpha05 5 09/19/2026
1.7.0-alpha04 7 09/08/2026
1.7.0-alpha03 21 05/29/2026
1.7.0-alpha02 3 09/08/2026
1.7.0-alpha01 3 09/08/2026
1.6.0 21 05/30/2026
1.5.7-beta 6 09/20/2026
1.5.6-beta 2 09/24/2026
1.5.5-beta 3 09/24/2026
1.5.4-beta 4 09/18/2026
1.5.3-beta 2 09/24/2026
1.5.2-beta 2 09/24/2026
1.5.1-beta 2 09/24/2026
1.5.0 5 09/10/2026