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

1

Я пытаюсь написать свой собственный VST Host, и для этого мне нужно записывать и воспроизводить аудио с помощью драйвера Asio (в моем случае для аудиоинтерфейса). Вот почему я пытаюсь использовать NAudio AsioOut.

В целях тестирования я сейчас просто пытаюсь записать вход, скопировать и воспроизвести его на выходе.

Мой код выглядит так:

var asioout = new AsioOut();
BufferedWaveProvider wavprov = new BufferedWaveProvider(new WaveFormat(44100, 2));
asioout.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(asio_DataAvailable);
asioout.InitRecordAndPlayback(wavprov, 2, 25);
asioout.Play();

...

void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
{
    Array.Copy(e.InputBuffers, e.OutputBuffers, e.InputBuffers.Length);
    e.WrittenToOutputBuffers = true;
}

Таким образом, я не слышу никакого выхода. Я также пробовал это так:

void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
{
    byte[] buf = new byte[e.SamplesPerBuffer];
    for (int i = 0; i < e.InputBuffers.Length; i++)
    {
        //Marshal.Copy(e.InputBuffers[i], e.OutputBuffers, 0, e.InputBuffers.Length);
        //also tried to upper one but this way i also couldn't hear anything
        Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
        Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer);
    }
    e.WrittenToOutputBuffers = true;
}

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

Что я здесь делаю неправильно?

PS: Я знаю, как записывать и воспроизводить.... существует, но я не мог получить полный ответ из этой темы, просто идея попробовать его с Marshall.Copy....

Теги:
audio
asio
naudio

1 ответ

0
Лучший ответ

Ваша вторая попытка более правильная, чем первая: каждый входной буфер необходимо копировать отдельно. Однако конечным параметром метода копирования должно быть количество байтов, а не количество выборок в буфере. Обычно это будет 3 или 4 байта на выборку, в зависимости от вашей битовой глубины ASIO.

  • 0
    Большое спасибо за ваш ответ. Использование e.SamplesPerBuffer * 4 вместо количества сэмплов решило проблему.
  • 0
    Небольшой вопрос: в каком формате находятся байты внутри массива bite. Я знаю, что однажды из WaveIn были 16-битные моно, так что это происходит: AABBCCDDEEFF позиционирование внутри массива, но asioout немного отличается от этого ...
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню