NAudio多输入多输出

时间:2013-08-29 22:53:24

标签: c# io naudio

我有多个音频输入

  • 1来自文件的WaveProvider
  • 来自SpeechSynthesizer的1 WaveProvider

我想将这些WaveProvider转发到多个音频输出WaveOut(到多个DeviceNumber)。

但我有3个问题:

  1. 某些WaveOut似乎错了并永远挂起
  2. WaveOut.Play()似乎已同步
  3. 如果我把它们放在任务中,第一个任务开始在设备上播放,那么它被其他设备上的其他任务打断
  4. 有人有示例代码正常工作吗?

    以下是一个不适用于2个任务的示例:

    Buffer = new BufferedWaveProvider(new WaveFormat(44100, 16, 2));
    WaveOut = new WaveOut();
    WaveOut.DeviceNumber = device;
    WaveOut.Init(Buffer);
    
    ...
    
    Buffer.AddSamples(bytes, 0, bytes.Length);
    WaveOut.Play();
    

    我没有找到所有WaveOut的样本。根据NAudio作者的说法,我不应该使用Tasks,但我不知道如何在魔术混音器类中设置多个输出和输入?

    此致

1 个答案:

答案 0 :(得分:0)

WaveOut是同步和独家解决方法是使用FunctionCallback在后台线程中设置WaveOut

WaveOutSpeech = new WaveOut(WaveCallbackInfo.FunctionCallback());
WaveOutSpeech.DeviceNumber = device;

如果您仍需要同步代码,则必须:

  • 在N任务
  • 中运行此代码
  • 等待其中一人
  • 控制WaveOut流程

以下是一个示例:

private void RunSession(WaveOut WaveOut, WaveStream stream, string match) {

  played.Add(match);

  WaveOut.Init(stream);
  WaveOut.Play();
  while (stream.CurrentTime < stream.TotalTime && played.Contains(match)) {
    Thread.Sleep(100);
  }
  WaveOut.Stop();
  stream.Dispose();

  played.Remove(match);
}

第三个参数匹配是流项目的名称。这允许在结束前停止循环。