首先,高级问题(虽然问题是,我认为一般的cython问题):
我使用树莓派通过I2C总线控制一些LED。我希望通过窥探音频和做有趣的信号处理来控制这些事情,看起来最强大的方法是使用PulseAudio(例如,注册回调是我无法做到的事情与ALSA AFAICT)。对于正确的版本,可用于PulseAudio的python绑定并不是正确的,因为我计划使用一些相对较重的信号处理库(可以使用numpy数组),我也可以使用cython。
我不确定它的相关性,但是Raspbian喘息机会使用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
,但是我得到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库的更多平凡的东西可以正常工作。