我的自定义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]; }
           }
    }

任何关于如何更有效地做这件事的提示都是受欢迎的。
一些好的读物:herehere还有here

关于c# - 如何正确地将浮点指针从C库传递到其C#包装器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22975425/

10-14 07:11