Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何为“指定”指定类型;不透明;用Cython进行结构声明?(PulseAudio中的空结构'pa_threaded_mainloop')_Python_Audio_Cython_Pulseaudio - Fatal编程技术网

Python 如何为“指定”指定类型;不透明;用Cython进行结构声明?(PulseAudio中的空结构'pa_threaded_mainloop')

Python 如何为“指定”指定类型;不透明;用Cython进行结构声明?(PulseAudio中的空结构'pa_threaded_mainloop'),python,audio,cython,pulseaudio,Python,Audio,Cython,Pulseaudio,首先,高层次的问题(虽然这个问题是,我认为是一个一般性的cython问题): 我用树莓pi通过I2C总线控制一些LED。我想通过监听音频和进行有趣的信号处理来控制这些功能,而实现这一功能的最可靠的方法似乎是使用PulseAudio(例如,注册回调是我无法使用ALSA AFAICT的)。PulseAudio可用的python绑定版本不合适,因为我计划使用一些相对较重的信号处理库(可以与numpy阵列一起使用),所以我也可以使用cython 我不确定这是否相关,但拉斯宾哮喘病船与PulseAudio

首先,高层次的问题(虽然这个问题是,我认为是一个一般性的cython问题):

我用树莓pi通过I2C总线控制一些LED。我想通过监听音频和进行有趣的信号处理来控制这些功能,而实现这一功能的最可靠的方法似乎是使用PulseAudio(例如,注册回调是我无法使用ALSA AFAICT的)。PulseAudio可用的python绑定版本不合适,因为我计划使用一些相对较重的信号处理库(可以与numpy阵列一起使用),所以我也可以使用cython

我不确定这是否相关,但拉斯宾哮喘病船与PulseAudio 2.0。如果您使用同步系统与PulseAudio交互,文档建议使用线程化mainloop。特别是,
/usr/include/pulse/pulse/thread mainloop.h
包含以下声明:

/**不透明的线程化主循环对象*/
typedef struct pa_threaded_mainloop pa_threaded_mainloop;
/**分配一个新的线程化主循环对象。你必须打电话
*在事件循环线程启动之前,执行pa_threaded_mainloop_start()
*跑步*/
pa_螺纹_主回路*pa_螺纹_主回路_新(无效);
这似乎是一个合理的起点。特别是,我的理解是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
,但是如果我在
pulse.pyx
的末尾添加一行只调用该函数,我会得到与
ctypedef
相同的错误):

pa_threaded_mainloop_new()
这很有效。但如果我尝试对返回值执行任何操作,例如:

mainloop = pa_threaded_mainloop_new()
或指定
cdef
ed变量(或在另一行上执行cdef):

我在编译时遇到一个错误:

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库,效果很好。

在C中使用不透明类型的原因只有一个:隐藏所有细节。你不应该处理不透明类型本身,只应该处理指针。好吧,现在我很尴尬。我太不习惯阅读C代码了,以至于错过了函数定义中的
*
。谢谢你的评论,我马上就明白了。
pulse.c: In function ‘initpulse’:
pulse.c:656:3: error: ‘__pyx_v_5pulse_mainloop’ has an incomplete type