2016-11-14 6 views
0

У меня есть звуковая плата usb, которая поддерживает драйвер asio с 4 входами и 4 выходами. Я хочу отправлять и получать данные одновременно. Но в настоящее время я могу получать и отправлять данные только по одному каналу за раз. Я не могу понять, как установить его в классе asioOut из библиотеки Naudio C#.Naudio Asio Запись и воспроизведение одновременно на нескольких каналах

I have to threads

Можно иметь один AudioAvailable событие для каждого канала? Подобно классам waveIn/waveOut. Как я могу добиться этого?

Вот мой код:

int sampleRate = 44100; 
int channels = 4; 

buffWaveProvider = new BufferedWaveProvider(new NAudio.Wave.WaveFormat(sampleRate, 32, channels)); 
asioOut = new AsioOut(radioForm.driverName); 
asioOut.ChannelOffset = OUTdevID; 
asioOut.InputChannelOffset = INdevId; 
asioOut.AudioAvailable += OnAsioOutAudioAvailable; 
asioOut.InitRecordAndPlayback(buffWaveProvider, channels, sampleRate); 
asioOut.Play(); 

для AudioAvailable случае я должен отправить для каждого входного канала в InputStream по различным групповому адресу:

public void OnAsioOutAudioAvailable(object sender, AsioAudioAvailableEventArgs e) 
{ 
    if (speakersOn && e.InputBuffers.Length != 0 && !monitorRequest) 
    { 
     byte[] buf = new byte[e.SamplesPerBuffer*4]; 
     for (int i = 0; i < e.InputBuffers.Length; i++) 
     { 
      Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer*4); 
     } 
     e.WrittenToOutputBuffers = true; 
     udp4VoiceSend.Send(buf, buf.Length); 
    } 
} 

Есть ли способ получить доступ входных буферов для каждый канал? enter image description here

Для выходов Я проверил исходный код naudio, и я увидел, что могу установить количество выходных каналов на waveProvider.WaveFormat.Channels. Поэтому я предполагаю, что при вызове метода InitRecordAndPlayback буфер IWaveProvider должен иметь 4 канала.

Ничего из stackoverflow сообщения об этом предмете не помогло мне. Я пробовал их все.

https://stackoverflow.com/questions/22543513/naudio-using-asio-to-record-audio-and-output-with-a-guitar

NAudio Asio Record and Playback

How to record and playback with NAudio using AsioOut

NAudio AsioOut + Sockets

Спасибо!

UPDATE:

Я проверил демонстрационный проект NAudio, Asio панель записи и кажется, что я могу слушать только один канал в то время: enter image description here

NAudio класс драйвер создает 4 входных и 4 выходных буферов, как ожидалось, но я не могу получить к ним доступ. enter image description here

В файле AsioRecordingPanel, если объект asioOut прослушивает 1 канал, и пользователь хочет изменить канал, в котором находится объект.

enter image description here

библиотека ограничение или ограничение драйвер?

Когда я добавляю образцы в буфер asio, можно отправлять данные непосредственно на выходной канал?

if (Main.buffWaveProvider != null) 
Main.buffWaveProvider.AddSamples(data, 0, dataLen); 

Спасибо!

ответ

1

Вот simple example Я создал, который обращается к входным и выходным буферам ASIO и выполняет низкоуровневую манипуляцию с образцами.

+0

HI, Mark. Спасибо за ваш пример. Можно добавить образцы к выходному каналу? Например, я хочу отправить track1 на output1 и track2 на output2 один раз за раз. А в файле buffWaveProvider.AddSamples (data, 0, dataLen) я могу добавить образцы для всех выходов. Я попытался установить asioOut.ChannelOffset на нужный канал, а затем добавить образцы в буфер, но, похоже, не работает этот хак. Возможно? –

+0

Да, вот что делает образец. Считывает с входов, записывает на выходы –

+0

Хорошо, спасибо. Итак, если речевой поток не поступает с входов, а из сети, как я могу управлять им? Позвольте мне уточнить: у меня есть голосовое приложение, в котором диспетчер отправляет голос по сети, и он указывает канал отправки потока. В приложении шлюза драйвера asio у меня есть событие udp4VoiceRecv_OnNewDataRecv (byte [] data, int dataLen). Поэтому, когда это увольняется, мне приходится направлять поток на определенный вывод. Спасибо! –