まず、大まかな問題です (質問は一般的な 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()
それだけで実際にコンパイルされます。(ここでa を使用する必要があると思いますcdef
が、 aでも同じエラーが発生しctypedef
ます。) の最後にその関数を呼び出すだけの行を追加するとpulse.pyx
:
pa_threaded_mainloop_new()
それはうまくいきます。しかし、戻り値で何かをしようとすると、次のようになります。
mainloop = pa_threaded_mainloop_new()
またはed変数を指定するcdef
(または別の行で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
では、PulseAudio 2.0 ライブラリについて cython に正しく知らせるにはどうすればよいでしょうか? cython 0.21 を直接インストールしたことに注意してください。標準 C ライブラリの呼び出しなど、より平凡なものは問題なく動作します。