Аудио повторитель с NAudio

Я реализую программу, которая считывает аудиопоток с устройства ввода и отправляет его на устройство вывода с помощью NAudio. Для этого я получаю данные из входного потока, используя WaveIn и его событие DataAvailable. Для записи данных я собираюсь использовать WaveOut, что также означает, что мне нужно использовать некоторую реализацию IWaveProvider. Реализация этого для моих нужд кажется довольно простой с использованием очереди. Кроме одного: что должно произойти, когда очередь пуста и вызывается метод Read()? Я не нашел ничего об этом в документации. Варианты, которые я думаю, что у меня есть:

  1. Метод должен блокироваться до тех пор, пока не будут доступны некоторые данные.
  2. Метод немедленно возвращает 0, указывая, что в настоящее время нет доступных данных.
  3. Заполните буфер нулями.

Я думал об использовании варианта 1 или 2, но потом обнаружил, что BufferedWaveProviderWaveInProvider, который использует BufferedWaveProvider внутри), который использует вариант 3. Из этого я сделал вывод, что вариант 3 предпочтительнее.

Вопрос в том, сделал ли я правильный вывод и должен ли я использовать вариант 3? Что произойдет, если я воспользуюсь вариантами 1 или 2? Это даже сработает?


person svick    schedule 20.07.2011    source источник


Ответы (1)


Метод Read вызывается, когда звуковой карте требуется больше данных для воспроизведения. Блокировка обычно не является хорошим вариантом, потому что вы можете быть в потоке из самого драйвера (как в ASIO или WaveOut с обратными вызовами функций) или вы можете быть в потоке графического интерфейса (как в WaveOut с обратными вызовами сообщений Windows).

Возврат 0 из метода Read означает, что «это конец аудиоданных», поэтому возврат 0 приведет к остановке воспроизведения.

Таким образом, третий вариант — лучший выбор, чтобы не блокировать потоки, которые вы не должны блокировать, и позволить продолжить воспроизведение.

Если потребителем вашего метода чтения был, например, WaveFileWriter, вариант 1 будет подходящим (а вариант 2 может зависеть от того, как вы определяете, когда прекратить запись в файл WAV).

person Mark Heath    schedule 20.07.2011