如何为" opaque"指定类型?使用Cython进行struct声明? (PulseAudio中的空结构`pa_threaded_mainloop`)

时间:2014-10-13 00:02:57

标签: python audio cython pulseaudio

首先,高级问题(虽然问题是,我认为一般的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库的更多平凡的东西可以正常工作。

0 个答案:

没有答案