Аудио репитер с NAudio - PullRequest
       9

Аудио репитер с NAudio

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

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

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

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

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

1 Ответ

3 голосов
/ 20 июля 2011

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

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

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

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

...