使用NAudio在运行时更改波形格式

时间:2011-07-21 10:01:57

标签: c# naudio directsound

我已使用以下方式初始化设备:

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

感谢。

1 个答案:

答案 0 :(得分:2)

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

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