У меня есть звуковая плата usb, которая поддерживает драйвер asio с 4 входами и 4 выходами. Я хочу отправлять и получать данные одновременно. Но в настоящее время я могу получать и отправлять данные только по одному каналу за раз. Я не могу понять, как установить его в классе asioOut из библиотеки Naudio C#.Naudio Asio Запись и воспроизведение одновременно на нескольких каналах
Можно иметь один 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);
}
}
Есть ли способ получить доступ входных буферов для каждый канал?
Для выходов Я проверил исходный код naudio, и я увидел, что могу установить количество выходных каналов на waveProvider.WaveFormat.Channels. Поэтому я предполагаю, что при вызове метода InitRecordAndPlayback буфер IWaveProvider должен иметь 4 канала.
Ничего из stackoverflow сообщения об этом предмете не помогло мне. Я пробовал их все.
NAudio Asio Record and Playback
How to record and playback with NAudio using AsioOut
Спасибо!
UPDATE:
Я проверил демонстрационный проект NAudio, Asio панель записи и кажется, что я могу слушать только один канал в то время:
NAudio класс драйвер создает 4 входных и 4 выходных буферов, как ожидалось, но я не могу получить к ним доступ.
В файле AsioRecordingPanel, если объект asioOut прослушивает 1 канал, и пользователь хочет изменить канал, в котором находится объект.
библиотека ограничение или ограничение драйвер?
Когда я добавляю образцы в буфер asio, можно отправлять данные непосредственно на выходной канал?
if (Main.buffWaveProvider != null)
Main.buffWaveProvider.AddSamples(data, 0, dataLen);
Спасибо!
HI, Mark. Спасибо за ваш пример. Можно добавить образцы к выходному каналу? Например, я хочу отправить track1 на output1 и track2 на output2 один раз за раз. А в файле buffWaveProvider.AddSamples (data, 0, dataLen) я могу добавить образцы для всех выходов. Я попытался установить asioOut.ChannelOffset на нужный канал, а затем добавить образцы в буфер, но, похоже, не работает этот хак. Возможно? –
Да, вот что делает образец. Считывает с входов, записывает на выходы –
Хорошо, спасибо. Итак, если речевой поток не поступает с входов, а из сети, как я могу управлять им? Позвольте мне уточнить: у меня есть голосовое приложение, в котором диспетчер отправляет голос по сети, и он указывает канал отправки потока. В приложении шлюза драйвера asio у меня есть событие udp4VoiceRecv_OnNewDataRecv (byte [] data, int dataLen). Поэтому, когда это увольняется, мне приходится направлять поток на определенный вывод. Спасибо! –