Pergunta

Isto está relacionado com minha outra pergunta , mas Eu senti como se deve perguntar-lo em uma nova pergunta.

Basicamente FLAC utiliza ponteiros de função para retornos de chamada, e implementar retornos de chamada com ctypes, você usa CFUNCTYPE ao protótipo eles, e então você usa a função prototype() para criá-los.

O problema que tenho com isso é que eu percebi que eu iria criar minha função de retorno de chamada como tal (não estou mostrando as estruturas que tenho recriado, FLAC__Frame é uma estrutura):

write_callback_prototype = CFUNCTYPE(c_int, c_void_p, 
                                     POINTER(FLAC__Frame), 
                                     POINTER(c_int32), v_void_p)

O problema que eu tenho é a implementação. FLAC__Frame nunca é instanciado pelo programador, ele só é chamado a partir da função de inicialização, e os functions.I processamento tem que escrever a função de retorno de mim mesmo, mas ele problema é que eu não sei como eu iria fazer isso, então se alguém sabe como eu deveria fazer isso, então alguma ajuda seria muito apreciada.

Foi útil?

Solução

De acordo com a ctypes callback docs você pode definir a função python

def my_callback(a, p, frame, p1, p2)
    pass

e, em seguida, criar um ponteiro para uma função que pode ser chamado C como este:

callback = write_callback_prototype(my_callback)

Esta ponteiro de função pode então ser passado em FLAC

Outras dicas

O problema que eu tenho é a implementação. FLAC__Frame nunca é instanciado pelo programador, ele só é chamado a partir da função de inicialização, e os functions.I processamento tem que escrever a função de retorno de mim mesmo, mas ele problema é que eu não sei como eu iria fazer isso, então se alguém sabe como eu deveria fazer isso, então alguma ajuda seria muito apreciada.

Nesse caso, basta usar:

import ctypes

class FLAC__Frame(ctypes.Structure):
    pass

e fingir que já está definido, e não se importam porque você só precisa ponteiro para ele, que é basicamente posição na memória.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top