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

Wavein vs WaveinEvent?

Jul 24, 2013 at 2:45 AM
Edited Jul 24, 2013 at 2:52 AM
From what i understand, Wavein will run on the main thread, and WaveinEvent will run on a separate thread.

But i noticed, that if i use Waveinevent, i need to increase the buffer from 4-5ms to 11-12ms.
Which increases the latency alot in the total buffer (got a waveprovider also).

And i don´t see the reason for it, if Waveinevent is run on a separate thread, shouldn´t it be able to do the same as Wavein, or perhaps even better as it´s not limited by the GUI thread?

Thanks
  void Sending(object sender, NAudio.Wave.WaveInEventArgs e)
       {
           if (connect == true && MuteMic.Checked == false)
           {
               udpClient.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);
              // waveWriterRam.Write(e.Buffer, 0, e.BytesRecorded);
           }
       }

                SendStream = new WaveInEvent();
                SendStream.BufferMilliseconds = 4;
                SendStream.WaveFormat = new WaveFormat(48000, 16, 2);
                SendStream.DeviceNumber = waveInDevice;
                SendStream.StartRecording();
                SendStream.DataAvailable += Sending;
Runs vey bad (need to set 11ms).
                sourceStream.DataAvailable -= new EventHandler<NAudio.Wave.WaveInEventArgs>(sourceStream_DataAvailable);
                sourceStream.StopRecording();
                sourceStream = new WaveIn();
                sourceStream.BufferMilliseconds = 4;
                sourceStream.WaveFormat = new NAudio.Wave.WaveFormat(48000, 16, 2);
                sourceStream.DeviceNumber = waveInDevice;
SendStream.StartRecording();


         void sourceStream_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
        {


              if (connect == true && MuteMic.Checked == false)
            {
                udpClient.Send(e.Buffer, e.BytesRecorded, otherPartyIP.Address.ToString(), 1500);
                 
            }
        }
This runs much much better.

Only thing is that if i move the GUI(Windows Form) it will stop for a while, then continue, as it runs on the GUI Thrad.
Coordinator
Jul 24, 2013 at 8:29 AM
I'm surprised you managed to get the latency that low at all with either type of WaveIn. It's not really a low latency audio API. The issue might be that when the event is set, perhaps the thread context switch isn't happening in time. I suppose you could always try your own WaveInEvent with a thread set to high priority.
Jul 24, 2013 at 8:37 AM
Oh, well whatt am i supposed to use then, i only know, Wavein, Wasapi and ASIO, and ASIO is of course the fastest, but i can´t use it.?

Though, i wonder, is it possible to use 2 ASIO drivers at the same time?
My built in for audio playback, and ASIO4ALL for my microphone?

i guess it could be possible, but not really sure. Would be awesome if it is.

Sady i am not that good at programming, so i have no idea how to change that event to high priority.

But is the GUI stop thing, caused by wavein being run on the main Thread?
Coordinator
Jul 24, 2013 at 12:54 PM
Not sure. It might be that the message queue is not getting serviced, or it might be that the garbage collector is running
Jul 24, 2013 at 12:58 PM
What can be done about that?
As it goes away with WaveinEvent, but that causes a big latency change weird enough.

My program is probably very unoptimized though, but i really have not clue here.

Is it possible to just put Wavein on a separate thread?
Coordinator
Jul 26, 2013 at 12:23 PM
that's what WaveInEvent is.
Jul 26, 2013 at 3:54 PM
Edited Jul 26, 2013 at 4:10 PM
well i know, but, is it possible to set the priority to high or something, as you mentioned earlier?
as perhaps that will solve the problem i am having.

Also what does number of buffer do?
how does it affect latency?

Thanks