我正在创建一个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函数,然后该函数可用于填充音频缓冲区?也许我可以用一种不同的方式来做?欢迎所有意见。在
我想你可以做几件事。如果使用的是Python 2.7,则可以使用新的缓冲区协议创建memoryview对象:
然后,需要从缓冲区创建一个memoryview对象:
另一种策略是导入数组模块,并使用它创建所需类型的数组。您可以使用:
然后,根据type needed构造数组:
更简单的是,您可以使用bytearray对象:
相关问题 更多 >
编程相关推荐