C# 使用任务还是其他什么?

C# 使用任务还是其他什么?,c#,real-time,voip,naudio,C#,Real Time,Voip,Naudio,我在用C#写 我有一个实时音频播放器,可以播放来自IP电话的传入语音。我有一个byte[]数组,当它进入时,它获取所有语音字节,当用户按下播放按钮时,我开始播放它。我也有停止和暂停按钮。我将NAudio用于BufferedWaveProvider和Waveout类 播放器类中的代码: public void PlayCall(Call call) { byte[] mixedBuffer = new byte[320]; while (call.PlayerI

我在用C#写

我有一个实时音频播放器,可以播放来自IP电话的传入语音。我有一个
byte[]数组
,当它进入时,它获取所有语音字节,当用户按下播放按钮时,我开始播放它。我也有停止和暂停按钮。我将NAudio用于BufferedWaveProvider和Waveout类

播放器类中的代码:

public void PlayCall(Call call)
{
         byte[] mixedBuffer = new byte[320];
         while (call.PlayerIndex < call.AudioArray.Length) // The AudioArray keeps getting bigger
         {
             if (_state == PlayerState.PAUSED || _state == PlayerState.STOPPED)
             // either STOP or PAUSE button is clicked
                  break;
             for (int i = 0; i < 320; i++)
             {
                  mixedBuffer[i] = (byte)(call.AudioArray[call.PlayerIndex + i];
             }
             call.PlayerIndex += 320;
             Thread.Sleep(20); // This is in order to synchronize the receiving and playing of the packets. 
             try
             {
                  AddSamples(mixedBuffer);
                  Waveout.Play();
             }
             catch (InvalidOperationException ex)
             {
                  _bufferedWaveProvider.ClearBuffer();

             }
             finally
             {
                  ClearByteArray(ref mixedBuffer);
             }
         }
}

public void StopCall(Call call)
{        
    _state = PalyerState.STOPPED;
    call.PlayerIndex=0;
    Waveout.Stop();
}

public void PauseCall(Call call)
{
    _state = PlayerState.PAUSED;
    Waveout.Pause();
}
请帮忙?我已经为此挣扎了很长时间


提前谢谢

我怀疑多次调用Waveout.Play()就是问题所在。您只需要调用一次
Play()
,然后将样本馈送到源wave提供程序(您的
BufferedWaveProvider
实例)中,库就会处理其余的。当wave provider为空时,
WaveOut
对象将继续播放静音,直到您提供更多样本

顺便说一句,这一切都可以在一个线程中实现。创建
WaveOut
实例,创建一个
BufferedWaveProvider
作为示例缓冲区,并将其设置为运行。然后,当音频数据可用时,您只需将数据添加到
BufferedWaveProvider
即可播放


BufferedWaveProvider
使用线程安全的内部缓冲区,因此,如果您觉得确实需要添加缓冲区,可以安全地从其他线程添加。

谢谢!它似乎是工作后,我改变了它,我只是采取了Waveout。发挥了WHILE循环。还有一个问题-Waveout.Stop和Waveout.Pause之间有什么区别?我在某个地方读到,其中一个清除了缓冲区,而另一个没有?
private void ExecutePlayCallMethod(Call call)
{
    call.Player.State = PlayerState.PLAYING;
    Task.Run(() => call.Player.PlayCall(call)); // 
}

private void ExecutePauseCallMethod(CAll call)
{
    Task.Run(() => call.Player.PauseCall(call));
    call.Player.State = PlayerState.PAUSED;
}

private void ExecuteStopCallMethod(Call call)
{
    call.Player.State = PlayerState.STOPPED;
    Task.Run(() => call.Player.StopCall(call));
}