如何使用 NAudio 和 ASIO 直接读取输入缓冲区和播放?
Posted
技术标签:
【中文标题】如何使用 NAudio 和 ASIO 直接读取输入缓冲区和播放?【英文标题】:How to read input buffer and playback directly using NAudio and ASIO? 【发布时间】:2015-04-06 12:35:07 【问题描述】:我对以下使用 ASIO 和 NAudio 库的 C# 代码有一点问题。
我尝试从吉他中获取声音,然后直接在扬声器中播放它的声音。到目前为止它有效,但声音非常失真。我读过here,这是一种解决问题的方法:
Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer * 4);
但是,如果我这样做,缓冲区的大小会大 4 倍,因此代码将无法编译。
我已经用 asio4all 和 MAUDIO 卡试过了;这两个都是同样的问题。
public partial class MainWindow : Window
AsioOut ASIODriver;
BufferedWaveProvider buffer;
public MainWindow()
String[] drivernames = AsioOut.GetDriverNames();
ASIODriver = new AsioOut(drivernames[0]);
buffer = new BufferedWaveProvider(new WaveFormat ());
ASIODriver.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(ASIODriver_AudioAvailable);
ASIODriver.InitRecordAndPlayback(buffer,2,44100);
//ASIODriver.InputChannelOffset = 1;
ASIODriver.Play();
private void ASIODriver_AudioAvailable(object sender, AsioAudioAvailableEventArgs e)
byte[] buf = new byte[e.SamplesPerBuffer];
for (int i = 0; i < e.InputBuffers.Length; i++)
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer);
Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer);
e.WrittenToOutputBuffers = true;
【问题讨论】:
【参考方案1】:OP 的解决方案。
解决方案是增加缓冲区的大小。有关更改,请参阅注释行及其以下行。
public partial class MainWindow : Window
AsioOut ASIODriver;
BufferedWaveProvider buffer;
public MainWindow()
String[] drivernames = AsioOut.GetDriverNames();
ASIODriver = new AsioOut(drivernames[0]);
buffer = new BufferedWaveProvider(new WaveFormat ());
ASIODriver.AudioAvailable += new EventHandler<AsioAudioAvailableEventArgs>(ASIODriver_AudioAvailable);
ASIODriver.InitRecordAndPlayback(buffer,2,44100);
ASIODriver.Play();
private void ASIODriver_AudioAvailable(object sender, AsioAudioAvailableEventArgs e)
//byte[] buf = new byte[e.SamplesPerBuffer];
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);
//Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer);
Marshal.Copy(e.InputBuffers[i], buf, 0, e.SamplesPerBuffer*4);
Marshal.Copy(buf, 0, e.OutputBuffers[i], e.SamplesPerBuffer*4);
e.WrittenToOutputBuffers = true;
【讨论】:
以上是关于如何使用 NAudio 和 ASIO 直接读取输入缓冲区和播放?的主要内容,如果未能解决你的问题,请参考以下文章