我的自定义C库中有一个函数,它返回指向浮点的指针。(这实际上是一个包含音频值的浮点数组)。
我想在Unity3d中使用这个C库(并返回float数组),所以我正在为它编写一个C包装器。如何在C脚本中正确导入/声明C函数?
我的C声明如下:
float* getAudioBuffer(mySynth_t synth);
在C中,我的猜测是我应该声明我的导入函数为返回float[],如下所示:
[DllImport (dll)]
private static extern float[] getAudioBuffer( IntPtr synth)
是这样吗?
我应该使用
ref
关键字吗?我应该在某处使用out
关键字吗?我对C++和BOT都很熟悉,所以我不太懂MaskLink等。
浮动数组中的数据也是音频数据,用于在OnFilterRead中填充Unity3d的音频缓冲区。所以这将被称为多次。
任何关于最佳实践的提示、示例代码或指针都将不胜感激。
最佳答案
我是这样做的:
[DllImport (dll)]
private static extern IntPtr getAudioBuffer( IntPtr synth);
那么使用它:
private float[] buffer = new float[1024];
void OnAudioFilterRead (float[] data, int channels)
{
IntPtr buf = getAudioBuffer();
Marshal.Copy(buf, buffer, 0, buffer.Length);
int i, j;
for ( i = 0, j=0; j < buffer.Length; i = i + channels, j++)
{
data[i] = buffer[j];
if (channels ==2)
{ data [i + 1] = data [i]; }
}
}
任何关于如何更有效地做这件事的提示都是受欢迎的。
一些好的读物:here,here还有here。
关于c# - 如何正确地将浮点指针从C库传递到其C#包装器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22975425/