NAudio.Vst3
3.1.0
Prefix Reserved
See the version list below for details.
dotnet add package NAudio.Vst3 --version 3.1.0
NuGet\Install-Package NAudio.Vst3 -Version 3.1.0
<PackageReference Include="NAudio.Vst3" Version="3.1.0" />
<PackageVersion Include="NAudio.Vst3" Version="3.1.0" />
<PackageReference Include="NAudio.Vst3" />
paket add NAudio.Vst3 --version 3.1.0
#r "nuget: NAudio.Vst3, 3.1.0"
#:package NAudio.Vst3@3.1.0
#addin nuget:?package=NAudio.Vst3&version=3.1.0
#tool nuget:?package=NAudio.Vst3&version=3.1.0
NAudio.Vst3
VST 3® plug-in hosting for NAudio. Discover, load, and host VST 3 audio effects and instruments. Windows-only (net9.0-windows).
What's included
- Plug-in discovery —
Vst3PluginScannerenumerates the VST 3 modules installed in the standard search paths (EnumerateInstalled()) or in a folder you choose (EnumerateIn) - Plug-in hosting —
Vst3Pluginloads a.vst3module, processes audio, exposes latency/tail info, parameters, units and program lists, and saves/loads state and.vstpresetfiles - Audio integration —
Vst3EffectSampleProviderruns an effect plug-in inside an NAudioISampleProviderchain;Vst3InstrumentSampleProviderandVst3MidiInstrumentdrive an instrument plug-in from MIDI - Parameters & presets —
Vst3ParameterCollection,Vst3Parameter,Vst3Unit,Vst3ProgramListandVst3PresetContentsfor automation and preset management - Editor UI —
Vst3PluginViewfor hosting a plug-in's native editor window
When to use it
Reach for this package when you want to load third-party VST 3 effects (EQ, reverb, compression, …) or instruments (synths, samplers) and run them inside an NAudio signal chain. It is not pulled in by the NAudio meta-package — reference it explicitly:
dotnet add package NAudio.Vst3
See the NAudio documentation site for tutorials and the full API reference, or the GitHub repository for full documentation and tutorials.
License
MIT. VST is a registered trademark of Steinberg Media Technologies GmbH; this package is an independent host and is not affiliated with or endorsed by Steinberg.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0-windows7.0 is compatible. net10.0-windows was computed. |
-
net9.0-windows7.0
- NAudio.Core (>= 3.1.0)
- NAudio.Midi (>= 3.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 3.1.1-preview.1 | 74 | 9/8/2026 |
| 3.1.0 | 119 | 9/7/2026 |
| 3.1.0-preview.2 | 64 | 9/5/2026 |
| 3.1.0-preview.1 | 65 | 9/4/2026 |
| 3.0.2-preview.2 | 68 | 8/27/2026 |
| 3.0.2-preview.1 | 64 | 8/20/2026 |
| 3.0.1 | 147 | 8/18/2026 |
| 3.0.1-preview.1 | 79 | 8/17/2026 |
| 3.0.0 | 132 | 8/15/2026 |
| 3.0.0-preview.20 | 87 | 8/8/2026 |
| 3.0.0-preview.19 | 89 | 7/25/2026 |
| 3.0.0-preview.18 | 72 | 7/16/2026 |
| 3.0.0-preview.17 | 77 | 7/11/2026 |
| 3.0.0-preview.16 | 97 | 7/1/2026 |
| 3.0.0-preview.15 | 76 | 6/28/2026 |
| 3.0.0-preview.14 | 79 | 6/25/2026 |
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)