2011-07-21 2 views
2

Я инициализируется устройство с помощью:Изменение формата волна во время выполнения с NAudio

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

Я добавление ИКМ потока к нему с помощью:

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

Thanks Mark. Что касается производительности, что лучше, закрытие/открытие устройства или преобразование формата? –

+0

Закрытие/открытие устройства будет работать лучше, поскольку любой необходимый SRC будет выполнен самим драйвером (по крайней мере, с WaveOut/DirectSoundOut). –

+0

Да думал то же самое. Его работа теперь после закрытия и открытия устройства снова. Большое спасибо за вашу помощь :) –