gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:49:32 24 4
gpt4 key购买 nike

我正在为用 C++ 编写的小型音频库创建 Python 扩展。打开音频流时,回调函数作为参数传递(当然还有其他参数)。一个稍微简化的用例:

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

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

thingy = AudioThingy()
thingy.openStream(..., pythonCallbackFunction)
thingy.startStream()

现在,扩展有一个作为 C 函数的回调,它传递给 C++ 库。对于每个流滴答,回调都会收到有关流的一些信息以及指向回调根据流格式参数转换为正确数据类型的音频缓冲区的空指针。我的意图当然是让这个用 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;
}

TL;DR:如何在线程中将正确类型的可变数组从 C 传递到 Python 函数,然后该函数可用于填充音频缓冲区?也许可以用与我上面描述的不同的方式来完成?欢迎所有意见。

最佳答案

我认为您可以做几件事。如果您使用的是 Python 2.7,则可以使用新的缓冲协议(protocol)创建一个 memoryview 对象:

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

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

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

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

更简单的是,您可以只使用字节数组对象:

关于python - 使用可变 C 数组从 C 线程调用 Python 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15033683/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com