2011-07-21 61 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

是的想法一樣。它在關閉並再次打開設備後立即工作。非常感謝你的幫助 :) –