使用可变的C数组从C线程调用Python函数

2024-10-01 13:40:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个Python扩展,用于用C++编写的小型音频库。作为一个参数传递给另一个函数的时候,作为一个回调函数。略显简化的用例:

AudioThingy *a = new AudioThingy();
a->openStream(..., callbackFunction);
a->startStream();

我的Python扩展将其封装在Python类中。在

^{pr2}$

现在,扩展名作为C函数返回,它传递给C++库。对于每个流tick,回调接收流的一些信息以及指向音频缓冲区的void指针,回调根据stream format参数将其转换为正确的数据类型。当然,我的目的是让这个用C实现的回调函数调用用户指定的Python函数,并使用某种数组作为参数,然后用音频数据填充这些函数,例如,用Python打开的wav文件。在

这就是我想做的,代码:

static int __audiothingy_callback(void *buffer, ...) {
  PyGILState_STATE state = PyGILState_Ensure();
  /*
      cast the void pointer to the correct data type (short, int, long, etc.)
      wrap it for Python somehow
  */
  PyEval_CallObject(the_python_function, arglist);
  PyGILState_Release(state);
  //proceed to fill the buffer with stuff passed back from python
  for (...)
    *casted_buffer++ = ????
  Py_DECREF(arglist);
  return 0;
}

DR:如何在线程中将正确类型的可变数组从C传递给Python函数,然后该函数可用于填充音频缓冲区?也许我可以用一种不同的方式来做?欢迎所有意见。在


Tags: theto函数for参数buffer数组音频
1条回答
网友
1楼 · 发布于 2024-10-01 13:40:13

我想你可以做几件事。如果使用的是Python 2.7,则可以使用新的缓冲区协议创建memoryview对象:

然后,需要从缓冲区创建一个memoryview对象:

另一种策略是导入数组模块,并使用它创建所需类型的数组。您可以使用:

然后,根据type needed构造数组:

PyObject *array = PyObject_CallFunction(array_type, "c", 'd');   

更简单的是,您可以使用bytearray对象:

相关问题 更多 >