如何正确地将浮点指针从C库传递给它的C#包装器

时间:2014-04-09 22:50:04

标签: c# c++ c unity3d marshalling

我在自定义C库中有一个函数,它返回一个指向float的指针。 (这实际上是一个包含音频值的浮点数组。)

我想在Unity3d中使用这个C库(并返回浮点数组),所以我正在为它编写一个C#包装器。如何在我的c#脚本中正确导入/声明我的C函数?

我的C声明如下:

float*  getAudioBuffer(mySynth_t synth);

在C#中,我的猜测是我应该将我的导入函数声明为像这样返回float []:

[DllImport (dll)]
private static extern float[]  getAudioBuffer(  IntPtr synth)

这是对的吗? 我应该使用ref关键字吗?我应该在某处使用out关键字吗? 我对C ++很熟悉,但是对于C#来说机器人很熟悉,所以我不太了解编组等。

浮点数组中的数据也是音频数据,用于填充OnFilterRead中的Unity3d音频缓冲区。所以这将被多次调用。 任何关于最佳实践的提示,示例代码或指针都将受到赞赏。

1 个答案:

答案 0 :(得分:0)

这是我的表现:

[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