Это связано с моим другим вопросом, но мне казалось, что я должен задать ему новый вопрос.
В основном, FLAC использует указатели на функции для обратных вызовов и для выполнения обратных вызовов с помощью ctypes, вы используете CFUNCTYPE
для их прототипирования, а затем используете функцию prototype()
для их создания.
Проблема с этим заключается в том, что я решил, что я создам функцию обратного вызова как таковой (я не показываю созданные мной структуры, FLAC__Frame - это структура):
write_callback_prototype = CFUNCTYPE(c_int, c_void_p,
POINTER(FLAC__Frame),
POINTER(c_int32), v_void_p)
Проблема, которая у меня есть, - это реализация. FLAC__Frame никогда не создается экземпляром программиста, он вызван только из функции инициализации и функций обработки. Мне нужно написать функцию обратного вызова, но проблема в том, что я не знаю, как бы это сделать, поэтому, если кто-либо знает, как я должен это делать, тогда нам будет очень полезно помочь.
В соответствии с ctypes callback docs вы можете определить функцию python
def my_callback(a, p, frame, p1, p2)
pass
а затем создайте указатель на функцию C, вызываемую следующим образом:
callback = write_callback_prototype(my_callback)
Этот указатель функции затем может быть передан в FLAC
Проблема, которая у меня есть, - это реализация. FLAC__Frame никогда не создается экземпляром программиста, он вызван только из функции инициализации и функций обработки. Мне нужно написать функцию обратного вызова, но проблема в том, что я не знаю, как бы это сделать, поэтому, если кто-либо знает, как я должен это делать, тогда нам будет очень полезно помочь.
В этом случае просто используйте:
import ctypes
class FLAC__Frame(ctypes.Structure):
pass
и притвориться, что он уже определен, и не волнует, потому что вам нужен только указатель на него, который в основном является позицией в памяти.