Изменение формата волны во время выполнения с помощью NAudio - PullRequest
2 голосов
/ 21 июля 2011

Я инициализировал устройство, используя:

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 Ответ

2 голосов
/ 21 июля 2011

Это невозможно. Когда вы открываете устройство вывода, будь то WaveOut, Direct Sound, WASAPI или ASIO, в этот момент вы должны указать формат, в котором вы будете работать. Вы должны закрыть устройство вывода и снова открыть его с новым WaveFormat.

Альтернативный подход состоит в том, чтобы всегда преобразовывать в фиксированный WaveFormat и использовать WaveFormatConversionStream для преобразования в правильный формат всякий раз, когда изменяется входящий формат. Это позволит вам избежать открытия и закрытия устройства вывода.

...