Запись и воспроизведение NAudio Asio одновременно - PullRequest
0 голосов
/ 07 мая 2018

tl; dr Я хочу поместить данные из события asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e) в BufferedWaveProvider и воспроизвести их.

Здравствуйте,

Я пытаюсь создать приложение, которое будет записывать аудио в файл, а также воспроизводить его пользователю во время записи. Мне удалось сделать это с помощью WaveInEvent и WaveOutEvent и BufferedWaveProvider. Но я думал, что у ASIO будет лучшая задержка, поэтому я хотел сделать то же самое, используя ее.

Я нашел здесь вопросы по этой теме, но ни один из них не содержал полного ответа, и я не мог решить их, основываясь на них. Не могли бы вы опубликовать полный рабочий пример кода?

NAudio Asio Запись и воспроизведение

Как записывать и воспроизводить с помощью NAudio с помощью AsioOut

Я попробовал версию с Marshal.Copy, но получил IndexOutOfRangeException. Похоже, что в буферах (e.InputBuffers[i]) недостаточно сэмплов. Я также хочу продолжить работу со звуком (сохранить его в файл) и одновременно воспроизвести другой звук (используя MixingSampleProvider), поэтому простое копирование буферов, вероятно, не сработает для меня.

1 Ответ

0 голосов
/ 08 мая 2018

Модель драйвера ASIO основана на одном обратном вызове, где вы можете получить доступ к записанным буферам и записать их в буферы воспроизведения. Это отлично подходит для воспроизведения со сверхнизкой задержкой, но InputBuffers - это просто IntPtrs для блока неуправляемой памяти для каждого канала. Таким образом, размер этого массива - это количество входных каналов, а не количество выборок. Чтобы успешно использовать их, вам нужно знать немало о разыменовании указателя и манипулировании битами, поскольку ASIO поддерживает несколько различных битовых глубин и форматов сэмплов, и вам нужно использовать правильный, если вы хотите получить доступ к низкоуровневому аудио, как это.

...