Я пытаюсь получить ввод звука и отправить вывод напрямую с меньшей задержкой, возможной с C#.
Я использую библиотеку NAudio, которая поддерживает ASIO для уменьшения задержки.
В частности, я использую объект AsioOut для записи и другой объект для воспроизведения, инициализированный с помощью BufferedWaveProvider, который заполняется функцией обратного вызова: OnAudioAvailable, что позволяет мне использовать буферы ASIO.
Проблема в том, что я слышу звук с различными глюками и с небольшой задержкой. Я думаю, что проблема в функции OnAudioAvailable, где буфер заполняется данными, взятыми на вход со звуковой карты.
Декларации:
NAudio.Wave.AsioOut playAsio;
NAudio.Wave.AsioOut recAsio;
NAudio.Wave.BufferedWaveProvider buffer;
Процедура воспроизведения:
if (sourceList.SelectedItems.Count == 0) return;
int deviceNumber = sourceList.SelectedItems[0].Index;
recAsio = new NAudio.Wave.AsioOut(deviceNumber);
recAsio.InitRecordAndPlayback(null, 2, 44100); //rec channel = 1
NAudio.Wave.WaveFormat formato = new NAudio.Wave.WaveFormat();
buffer = new NAudio.Wave.BufferedWaveProvider(formato);
recAsio.AudioAvailable += new EventHandler<NAudio.Wave.AsioAudioAvailableEventArgs>(OnAudioAvailable);
//Collego l'output col buffer
playAsio = new NAudio.Wave.AsioOut(deviceNumber);
playAsio.Init(buffer);
//Registro
recAsio.Play();
//Playback
playAsio.Play();
OnAudioAvailable():
//Callback
private unsafe void OnAudioAvailable(object sender, NAudio.Wave.AsioAudioAvailableEventArgs e)
{
//Copio tutti gli elementi di InputBuffers in buf e li aggiungo in coda al buffer
byte[] buf = new byte[e.SamplesPerBuffer];
for (int i = 0; i < e.InputBuffers.Length; i++)
{
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
//Aggiungo in coda al buffer
buffer.AddSamples(buf, 0, buf.Length);
}
}
Определение AsioAudioAvailableEventArgs:
public AsioAudioAvailableEventArgs(IntPtr[] inputBuffers, int samplesPerBuffer, AsioSampleType asioSampleType);
public float[] GetAsInterleavedSamples();
Кто-нибудь знает, как это исправить? Спасибо вам всем.