Search code examples
c#naudio

Easiest way to read 2-channel samples into array from WaveStream


I've been struggling with this for quite some time now and I couldn't find a working solution.

I have a wav file (16 bit PCM: 44kHz 2 channels) and I want to extract samples into two arrays for each of the two channels. As far as I know the direct method for this does not exist in NAudio library, so I tried to run the following code to read a few of interlaced samples but the buffer array stays empty (just a bunch of zeros):

using (WaveFileReader pcm = new WaveFileReader(@"file.wav"))
{
    byte[] buffer = new byte[10000];
    using (WaveStream aligned = new BlockAlignReductionStream(pcm))
    {
        aligned.Read(buffer, 0, 10000);
    }
}

Any help on this will be much appreciated.


Solution

  • BlockAlignReductionStream is unnecessary. Here's one simple way to read out of your buffer and into separate 16 bit left and right sample buffers.

    using (WaveFileReader pcm = new WaveFileReader(@"file.wav"))
    {
        int samplesDesired = 5000;
        byte[] buffer = new byte[samplesDesired * 4];
        short[] left = new short[samplesDesired];
        short[] right = new short[samplesDesired];
        int bytesRead = pcm.Read(buffer, 0, 10000);
        int index = 0;
        for(int sample = 0; sample < bytesRead/4; sample++)
        { 
            left[sample] = BitConverter.ToInt16(buffer, index);
            index += 2;
            right[sample] = BitConverter.ToInt16(buffer, index);
            index += 2;
        }
    }