私はC++で書かれた小さなオーディオライブラリ用のPython拡張機能を作成中です。オーディオストリームを開くと、コールバック関数がパラメーターとして渡されます(もちろん他のパラメーターの中でも)。わずかに簡略化されたユースケース:
AudioThingy *a = new AudioThingy();
a->openStream(..., callbackFunction);
a->startStream();
私のPython拡張機能は、これをPythonクラス内にラップします。
thingy = AudioThingy()
thingy.openStream(..., pythonCallbackFunction)
thingy.startStream()
現在、拡張機能には、C++ライブラリに渡すC関数としてのコールバックがあります。ストリームティックごとに、コールバックは、ストリーム形式パラメーターに従って正しいデータ型にキャストするオーディオバッファーへのvoidポインターとともに、ストリームに関する情報を受け取ります。もちろん、私の意図は、Cで実装されたこのコールバック関数が、引数としてある種の配列を使用してユーザー指定のPython関数を呼び出すことです。この関数は、たとえばPythonで開かれたwavファイルからのオーディオデータで埋められます。
これは私がコードでやりたいことです:
static int __audiothingy_callback(void *buffer, ...) {
PyGILState_STATE state = PyGILState_Ensure();
/*
cast the void pointer to the correct data type (short, int, long, etc.)
wrap it for Python somehow
*/
PyEval_CallObject(the_python_function, arglist);
PyGILState_Release(state);
//proceed to fill the buffer with stuff passed back from python
for (...)
*casted_buffer++ = ????
Py_DECREF(arglist);
return 0;
}
TL; DR:正しいタイプの可変配列をスレッド内のCからPython関数に渡すにはどうすればよいですか?Python関数を使用してオーディオバッファーにデータを入力できますか?多分それは私が上で説明したのとは異なる方法で行うことができますか?すべての入力を歓迎します。