© 2026 Hedgehog Software, LLC

TwitterGitHubDiscord
More
CommunitiesDocsAboutTermsPrivacy
Search
Star
Setup for Free
C#C
C#•17mo ago
nullptr

artifacted playback using `NAudio` with multiple raw pcm streams

hello there! i'm trying to implement voice chat into a custom discord library i'm writing. everything works great but the sound quality dips heavily if 2 or more users are speaking at once. you can see my player class below:

public class NAudioPlayer : IPlayer
{
    private readonly ConcurrentDictionary<uint, BufferedWaveProvider> _waveProviders = new();
    private readonly MixingSampleProvider _mixer;
    private readonly WaveOutEvent _waveOut;
    private readonly WaveFormat _format = new(48000, 16, 2);

    public NAudioPlayer()
    {
        _mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(48000, 2));
        _mixer.ReadFully = true;
        _waveOut = new WaveOutEvent();
        _waveOut.Init(_mixer);
        _waveOut.Play();
    }

    public void AddSamples(byte[] pcmData, int pcmLength, uint ssrc)
    {
        if (!_waveProviders.TryGetValue(ssrc, out var waveProvider))
        {
            waveProvider = new BufferedWaveProvider(_format)
            {
                DiscardOnBufferOverflow = true
            };
            var sampleProvider = waveProvider.ToSampleProvider();
            _waveProviders.TryAdd(ssrc, waveProvider);
            _mixer.AddMixerInput(sampleProvider);
        }

        _waveProviders[ssrc].AddSamples(pcmData, 0, pcmLength);
    }
}
public class NAudioPlayer : IPlayer
{
    private readonly ConcurrentDictionary<uint, BufferedWaveProvider> _waveProviders = new();
    private readonly MixingSampleProvider _mixer;
    private readonly WaveOutEvent _waveOut;
    private readonly WaveFormat _format = new(48000, 16, 2);

    public NAudioPlayer()
    {
        _mixer = new MixingSampleProvider(WaveFormat.CreateIeeeFloatWaveFormat(48000, 2));
        _mixer.ReadFully = true;
        _waveOut = new WaveOutEvent();
        _waveOut.Init(_mixer);
        _waveOut.Play();
    }

    public void AddSamples(byte[] pcmData, int pcmLength, uint ssrc)
    {
        if (!_waveProviders.TryGetValue(ssrc, out var waveProvider))
        {
            waveProvider = new BufferedWaveProvider(_format)
            {
                DiscardOnBufferOverflow = true
            };
            var sampleProvider = waveProvider.ToSampleProvider();
            _waveProviders.TryAdd(ssrc, waveProvider);
            _mixer.AddMixerInput(sampleProvider);
        }

        _waveProviders[ssrc].AddSamples(pcmData, 0, pcmLength);
    }
}


there is only one
NAudioPlayer
NAudioPlayer
initialized for the entire voice session, but it uses ssrcs sent by discord's voice gateway and udp servers to split them into different streams and mix them together. however, this mixing seems to do absolutely nothing; it sounds exactly the same if i just add samples to the same wave provider for every user. what am i doing wrong?
C# banner
C#Join
We are a programming server aimed at coders discussing everything related to C# (CSharp) and .NET.
61,871Members
Resources
Was this page helpful?

Similar Threads

Recent Announcements

Similar Threads

❔ Error with Naudio
C#CC# / help
3y ago
Converting PCM Byte Data to WAV stream with proper RIFF header - NAudio
C#CC# / help
3y ago
Help: Using an Event handler. (NAudio)
C#CC# / help
3y ago