Hola Al, muchas gracias por tu aportación, sin duda está siendo muy valiosa para mí.
He aplicado las cosas como me dijiste y efectivamente, ya compila y ejecuta, pero hay alguna cosa que no tengo clara.
La función de retrollamada tienes razón, es opcional, y le puedo pasar un nil a la función principal en el parámetro de la función de retrollamada, pero finalmente la he incluido.
Mi código ha quedado como sigue de forma resumida:
Cita:
type
FLAC__StreamEncoderProgressCallback = procedure
(encoder:PFLAC__StreamEncoder; bytes_written:FLAC__uint64; samples_written:FLAC__uint64;total_frames_estimate:LongWord; client_data:Pointer);StdCall;
|
Yo me declaro una variable para meterla como parámetro a la función principal:
Cita:
var
funcCallback : FLAC__StreamEncoderProgressCallback;
|
Usando en mi función ppal:
Cita:
begin
...
init_status := FLAC__stream_encoder_init_file(pencoder, pfileDestino, funcCallback, nil);
|
Aunque entiendo que está incompleto porque funcCallback debe inicializarse de alguna forma, pero no entiendo como hacer exactamente lo que me comentas de:
"debes* crear un procedimiento con la misma cabecera que define TFLAC__StreamEncoderProgressCallback, para poder darle ese procedimiento a la función que lo espera como parámetro".
¿Tendría que crear un procedimiento con otro nombre?¿Cómo lo usaría para poder "alimentar" mi función principal correctamente?
En VisualC lo hace así:
Cita:
static void progress_callback(const FLAC__StreamEncoder *encoder, FLAC__uint64 bytes_written, FLAC__uint64 samples_written, unsigned frames_written, unsigned total_frames_estimate, void *client_data);
...
int main(int argc, char *argv[])
...
init_status = FLAC__stream_encoder_init_file(encoder, argv[2], progress_callback, NULL);
|
El parámetro NULL (parámetro formal void client_data) se supone que es como dice textualmente:
\param client_data. This value will be supplied to callbacks in their \a client_data argument. O sea, que serviría para las retrollamadas??
Un saludo.