2011-07-21 34 views
2

我已初始化使用该设备:在运行时改变波格式与n音讯

static IWavePlayer  waveOut; 
static WaveFormat  waveFormat; 
static BufferedWaveProvider waveProvider; 

private static int AudioDeviceInit() 
{ 
      waveOut = new DirectSoundOut(); 
      waveFormat = new WaveFormat(44100, 2); 
      waveProvider = new BufferedWaveProvider(waveFormat); 

      waveOut.Init(waveProvider); 
      waveOut.Play(); 

      return 0; 
} 

我使用添加PCM流到它:

waveProvider.AddSamples(samples, 0, size);

以上是只要工作细流数据具有相同的配置。

我有另一个接收采样率和通道数的函数,我想重新配置waveprovider以使用新提供的配置。以下是我正在使用的代码:

private static void AudioConfigCallback(int rate, int channel) 
{ 
    waveFormat = new WaveFormat(rate, channel); 
    waveProvider = new BufferedWaveProvider(waveFormat); 
    waveOut.Init(waveProvider); 
    return; 
} 

这不起作用,我相信这不是正确的做法。任何想法如何我可以重新配置设备使用新的sample_rate和num_channels

谢谢。

回答

2

这是不可能的。当您打开输出设备时,无论是WaveOut,Direct Sound,WASAPI还是ASIO,此时您都必须指定您将工作的格式。您必须关闭输出设备并使用新的WaveFormat重新打开它。

另一种方法是始终将其转换为固定的WaveFormat,并在输入格式发生变化时使用WaveFormatConversionStream转换为正确的格式。这样可以避免打开和关闭输出设备。

+0

谢谢马克。在性能方面,哪个更好,关闭/打开设备还是格式转换? –

+0

关闭/打开设备将表现更好,因为任何必要的SRC将由驱动程序自己完成(至少使用WaveOut/DirectSoundOut)。 –

+0

是的想法一样。它在关闭并再次打开设备后立即工作。非常感谢你的帮助 :) –