0

我有多个音频输入

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

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

但我有3个问题:

  1. 有些 WaveOut 似乎是错误的并且永远挂起
  2. WaveOut.Play() 似乎是同步的
  3. 如果我把它们放在任务中,第一个任务开始在设备上播放,那么它会被另一个设备上的另一个任务打断

有人有正常工作的示例代码吗?

这是一个不适用于 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 作者的说法,我不应该使用任务,但我不知道如何在魔术混音器类中设置多个输出和输入?

问候

4

1 回答 1

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);
}

第三个参数 match 是流式传输项目的名称。这允许在结束之前停止循环。

于 2013-08-30T23:09:46.790 回答