Naudio AsioOut转换为浮动(VST.NET)

时间:2014-05-28 16:12:30

标签: c# arrays audio naudio vst

我正在开发一个项目,我正在尝试从asio音频驱动程序获取音频,将音频转换为VST.Net浮点数组(2通道浮点数组,值范围从-1到+1)。 我正在为此做的是:

   void asio_DataAvailable(object sender, AsioAudioAvailableEventArgs e)
    {     
        float[] farr = new float[e.SamplesPerBuffer*2];
        e.GetAsInterleavedSamples(farr);

        for (int p = 0; p < e.SamplesPerBuffer; p++)
        {
            vstBufIn[0][p] = farr[p];
            vstBufIn[1][p] = farr[p];
        }

        cont2.PluginCommandStub.ProcessReplacing(vstBufIn, vstBufOut);
        byte[] bytebuf = new byte[vstBufOut[0].SampleCount * 4];
        int j = 0;
        for (int p = 0; p < vstBufOut[0].SampleCount; p++)
        {
            float f = vstBufOut[0][p];
            byte[] temparr = new byte[4];
            temparr = BitConverter.GetBytes((Int32)(f * (float)Int32.MaxValue));
            bytebuf[j] = temparr[0];
            bytebuf[j + 1] = temparr[1];
            bytebuf[j + 2] = temparr[2];
            bytebuf[j + 3] = temparr[3];
            j += 4;
        }
        Marshal.Copy(bytebuf, 0, e.OutputBuffers[0], bytebuf.Length);
        Marshal.Copy(bytebuf, 0, e.OutputBuffers[1], bytebuf.Length);

        e.WrittenToOutputBuffers = true;
     }

当asioOut的缓冲区已满并需要处理时,将调用asio_DataAvailable函数。此代码主要用于测试工作,因此忽略了vstBufOut中的第二个通道。

当我只使用Marschal.Copy将其转换为字节数组时,来自AsioOut的输入是:

0
(some number)
251 (and sometimes 250, 252 or 253)
255
0
(some number)
251 (and sometimes 250, 252 or 253)
255
.... (and so on)

所以看起来它可能是24位的小尾数???

这段代码的结果是:我得到的音频大致听起来就像是声音传入但虽然它被打乱了。当我使用WaveIn尝试它时,我遇到了类似的问题,我没有正确地将waveIn中的16位单声道数组转换为vstBufIn,将vstBufOut转换回WaveOut。 所以我尝试了我当时所做的事情,但它们似乎都没有效果:

  1. 我试过了:vstBufIn [0] [p] = farr [p]; vstBufIn [1] [p] = farr [p + 1];的p ++;交替......
  2. 我尝试将Int32.MaxValue更改为2 ^ 23以获得24位整数的最大值,但这使得它更加难以忍受
  3. 我也搞乱了数组的大小和for循环的最大值,但这似乎至少对我来说是最合乎逻辑的版本......
  4. 有人知道我在这里做错了吗?

    感谢任何帮助。

0 个答案:

没有答案