我正在开发一个项目,我正在尝试从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。 所以我尝试了我当时所做的事情,但它们似乎都没有效果:
有人知道我在这里做错了吗?
感谢任何帮助。