This project has moved. For the latest updates, please go here.

Delay (approx 200 ms) in streamed audio playback

Dec 29, 2011 at 6:39 AM
Edited Dec 29, 2011 at 6:59 AM

I have posted it on stackoverflow at: http://stackoverflow.com/questions/8655313/delay-approx-200-ms-in-streamed-audio-playback-c-naudio

Here is the same question:

I have an application which plays the streamed audio data (like a chat client). The workflow involves three simple steps:

 1.   The file header info (sample rate, bits per sample and num of channels) is sent first.
 2.   Audio waveout device is initialized based on the above parameters.
 3.   Audio (pcm) data is sent and is played on the above device.

The data receiving code is native (C code). and it reads data on a socket. Then it calls the managed C# code, which uses Naudio library to initialize device and play audio.

Now the problem is that, I am seeing some delay in audio playback. I have already instrumented the rest of my code (specifically: transferring data on socket and passing it back to managed code) and that seems to be okay. The whole transfer process is taking around 600 micro seconds, but after I assign the buffer to Naudio, it seems to start playing it after some time (around 200-250 milliseconds).

Here is my C# class that handles the audio playing part:

class foo
{
    static  IWavePlayer     s_WaveOut;
    static  WaveFormat      s_WaveOutFormat;
    static  BufferedWaveProvider    s_WaveProvider;
    static  byte[]          s_Samples       = new byte[10000];

    // called from native code to init deivce with specified sample rate and num of channels
    private static void DeviceInit(int rate, int bits, int channels)
    {
        s_WaveOut   = new WaveOut(WaveCallbackInfo.FunctionCallback());
        s_WaveOutFormat = new WaveFormat(rate, bits, channels);
        s_WaveProvider  = new BufferedWaveProvider(s_WaveOutFormat);

        s_WaveProvider.DiscardOnBufferOverflow      = true;
        s_WaveProvider.BufferLength         = 5 * 1024 * 1024;

        s_WaveOut.Init(s_WaveProvider);
        s_WaveOut.Play();
    }

    // called from native 'C' code upon receiving audio packates
    private unsafe static void PlayDataCallback(
        IntPtr buff,
        Int32 size)
    {
        Marshal.Copy(buff, s_Samples, 0, size);
        s_WaveProvider.AddSamples(s_Samples, 0, size);
    }
}

any idea on what might be causing the delay or am I using it (Naudio) in some wrong way.

I tried the same Naudio library to play a wav file and that seems to work perfect,

the problem is coming only when I am adding samples after initialing the device myself.

Thank you,

Vikram