首先,高级问题(尽管问题是,我认为是一般的cython问题):
我正在使用树莓派通过 I2C 总线控制一些 LED。我想通过监听音频和做有趣的信号处理来控制这些,似乎最可靠的方法是使用 PulseAudio(例如,注册回调是我不能用 ALSA AFAICT 做的事情) . PulseAudio 的可用 python 绑定不适用于正确的版本,并且由于我打算使用一些相对繁重的信号处理库(可以与 numpy 数组一起使用),所以我不妨使用 cython。
我不确定它是否相关,但 Raspbian wheezy 附带 PulseAudio 2.0。如果您使用同步系统与 PulseAudio 交互,文档建议使用线程主循环。特别是,/usr/include/pulse/pulse/thread-mainloop.h
包括这些声明:
/** An opaque threaded main loop object */
typedef struct pa_threaded_mainloop pa_threaded_mainloop;
/** Allocate a new threaded main loop object. You have to call
* pa_threaded_mainloop_start() before the event loop thread starts
* running. */
pa_threaded_mainloop *pa_threaded_mainloop_new(void);
这似乎是一个合理的起点。特别是,我的理解是 cython 不需要 .pyx 文件中指定的完整类型信息 - 我没有计划深入研究该结构的内容,并简单地让 pulseaudio 函数对其进行操作。所以,这是我的pulse.pyx
文件:
cimport cython
cdef extern from "pulse/thread-mainloop.h":
cdef struct pa_threaded_mainloop:
pass
pa_threaded_mainloop pa_threaded_mainloop_new()
就这么多实际上会编译。(我想我应该在cdef
这里使用 a ,但我得到与 a 相同的错误ctypedef
。)如果我在末尾添加一行只调用该函数pulse.pyx
:
pa_threaded_mainloop_new()
这样可行。但是,如果我尝试对返回值做任何事情,例如:
mainloop = pa_threaded_mainloop_new()
或指定一个cdef
ed 变量(或在不同的行上执行 cdef):
cdef mainloop = pa_threaded_mainloop_new()
我在编译时收到错误:
pulse.c: In function ‘initpulse’:
pulse.c:659:3: error: type of formal parameter 1 is incomplete
pulse.c: At top level:
pulse.c:873:88: error: parameter 1 (‘s’) has incomplete type
我得到一个稍微不同的错误cdef pa_threaded_mainloop mainloop
:
pulse.c: In function ‘initpulse’:
pulse.c:656:3: error: ‘__pyx_v_5pulse_mainloop’ has an incomplete type
那么,我该如何正确地让 cython 了解 PulseAudio 2.0 库?请注意,我已经直接安装了 cython 0.21,而且更平淡无奇的东西,比如调用标准 C 库也可以正常工作。