NAudio C# resampling sizzle trouble

I have a problem using NAudio and WasapiLoopBackCapture... I'm beginner and I don't understand all what I do. I want to convert byte buffer to another with wave format 44100 rate and 16 bits. It work but I have some sizzle or strange noise after conversion.

Edit: I tryed to merge all buffer without convert. I convert and write only at the end and then, it work fine. I think the problem is in function Convert16 or readStream. If I merge converted buffer, the sizzle come beetween 2 buffer. It can be a length problem ? I need to Convert buffer without merging because I send them by udp

The functions Convert16 and Readstream are from this topic

    public byte[] Convert16(byte[] input, int length, WaveFormat format)
    {
        if (length == 0)
            return new byte[0];
        using (var memStream = new MemoryStream(input, 0, length))
        {
            using (var inputStream = new RawSourceWaveStream(memStream, format))
            {
                var sampleStream = new NAudio.Wave.SampleProviders.WaveToSampleProvider(inputStream);
                var resamplingProvider = new NAudio.Wave.SampleProviders.WdlResamplingSampleProvider(sampleStream, audioRate);
                var ieeeToPCM = new NAudio.Wave.SampleProviders.SampleToWaveProvider16(resamplingProvider);
                var sampleStreams = new NAudio.Wave.StereoToMonoProvider16(ieeeToPCM);
                sampleStreams.RightVolume = 0.5f;
                sampleStreams.LeftVolume = 0.5f;
                return readStream(sampleStreams, length);
            }
        }
    }

    private byte[] readStream(IWaveProvider waveStream, int length)
    {
        byte[] buffer = new byte[length];
        using (var stream = new MemoryStream())
        {
            int read;
            while ((read = waveStream.Read(buffer, 0, length)) > 0)
            {
                stream.Write(buffer, 0, read);
            }
            return stream.ToArray();
        }
    }


    public void InputBufferToFileCallback(object sender, WaveInEventArgs e)
    {
        // Used to see WaveViewer and to test
        baseWriter.Write(e.Buffer, 0, e.BytesRecorded);

        // byte[] convertedTo16 -- PROBLEM IS HERE
        convertedTo16 = Convert16(e.Buffer, e.BytesRecorded, waveFormatIn);

        // Used to see WaveViewer and to test
        convertedWriter.Write(convertedTo16, 0, convertedTo16.Length);

        // Send over udp real time
        SendSoundController(convertedTo16);
    }

We can see on this image the difference between the audacity resampling and my resampling. We can see the trouble.

https://i.sstatic.net/Zv7Ut.png

Thanks and have a good day.

Upvotes: 2

Views: 805

Answers (1)

Mark Heath
Mark Heath

Reputation: 49482

When you're resampling recorded audio, you need to maintain a single resampler that lives across multiple buffers. I've written a couple of articles on "input driven resampling" with NAudio that explain how to do this:

Upvotes: 1

Related Questions