如何正确地将浮点指针从C库传递到它的C#包装器
how to properly pass a float pointer from a C library to its C# wrapper
我的自定义C库中有一个函数,它返回一个指向浮点值的指针。(这实际上是一个包含音频值的浮点数组)。
我想在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#一无所知,所以我并不真正理解mashalling等。
此外,浮点数组中的数据是音频数据,用于填充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]; }
}
}
任何关于如何更有效地做到这一点的提示都是受欢迎的。
一些好的读物:这里,这里,还有这里。
相关文章:
- 如何正确地将分支添加到已存在的树中
- 如何正确地将带有指针的数组传递给函数
- 如何正确地推回然后遍历堆中对象的向量?
- 我是否不正确地集中了这些字符数组?
- 如何通过另一个对象中的命令正确地从一个对象返回数据
- 我怎样才能通过友谊正确地履行我的职能?
- C++:如何正确地将 deque::front() 返回的变量从函数中传递出去?
- 我应该如何正确地将packaged_task移动到 lambda?
- 如何正确地将SHA1CryptoServiceProvider转换为c ++?
- 如何正确地对 constexpr 函数进行单元测试
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何正确地将boost::asio::buffers_iterator转换为InputIterator
- 如何正确地检查变量char中包含的字母
- 当试图交换可变模板类时,如何正确地重载operator=
- 如何正确地将 boost::optional<std::chrono::d uration> 作为函数参数?
- 如何在C++中正确地将我的语言字符输出到HTML文件中
- 如果我的类正确地管理了一个资源,那么拥有智能的poointer有什么意义
- 如何正确地编写这些条件,以便它们在控制台中工作
- 正确地编写一个类,并将pthread与vlc库和c++一起使用
- 如何正确地将浮点指针从C库传递到它的C#包装器