Вопрос

Это связано с мой другой вопрос, но я чувствовал, что должен задать это в новом вопросе.

По сути, 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 вы можете определить функцию 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

и притворитесь, что он уже определен, и не беспокойтесь, потому что вам нужен только указатель на него, который по сути является позицией в памяти.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top