【问题标题】:How to read input buffer and playback directly using NAudio and ASIO?如何使用 NAudio 和 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;
    }
}

【问题讨论】:

    标签: c# .net audio naudio asio


    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多