Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Coloboración Paypal con ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 01-04-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 20
Guillermo80 Va por buen camino
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.
Responder Con Cita
  #2  
Antiguo 02-04-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.610
Poder: 32
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

Cita:
Empezado por Guillermo80 Ver Mensaje
...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?...
Primero asegúrate de si la función de retrollamada es necesaria u opcional. En caso de ser necesaria o de querer darle una a la función Init_File, habrás de crear, efectivamente, un procedimiento con el nombre que quieras (mientras no tenga conflicto con otros identificadores, claro está), siendo ese procedimiento de cabecera equivalente al tipo de dato FLAC__StreamEncoderProgressCallback que ya declaraste.

Una vez escrito ese procedimiento, para hacer referencia a la dirección de memoria del mismo, puedes emplear el operador "at" (la arroba):

Código Delphi [-]
init_status := FLAC__stream_encoder_init_file(pencoder, pfileDestino, @MiProcedimiento, Nil);

Con esto le dices a FLAC__stream_encoder_init_file que la función de retrollamada que debe ejecutar es MiProcedimiento. Al parecer, el último parámetro (Nil) es algún valor que tu quieras darle a la función de retrollamada.

Es como decirle a la función Init_File: "Oye, te encargo que ejecutes a MiProcedimiento, y al hacerlo incluye en sus parámetros este valor".

También es importante que entiendas bien todos los conceptos que estás manejando. Para empezar sería bueno, si no te molesta, comentarnos qué propósito tiene esa API que estás usando y cuál es el objetivo.

Saludos.

Al.
Responder Con Cita
  #3  
Antiguo 02-04-2008
Avatar de Guillermo80
Guillermo80 Guillermo80 is offline
Miembro
 
Registrado: may 2007
Posts: 87
Poder: 20
Guillermo80 Va por buen camino
me he perdido

Hola Al, lo siento pero creo que no te he entendido lo último que me decías:

Cita:
...habrás de crear, efectivamente, un procedimiento con el nombre que quieras (mientras no tenga conflicto con otros identificadores, claro está), siendo ese procedimiento de cabecera equivalente al tipo de dato FLAC__StreamEncoderProgressCallback que ya declaraste
Si ahora resulta que a Init_File le voy a pasar @MiFuncion:

1. ¿Cómo se relaciona con el tipo que me he creado FLAC__StreamEncoderProgressCallback? Quiero decir, que ahora tendría un tipo FLAC__StreamEncoderProgressCallback, una función @Mifunción, y sólo un parámetro para pasarle a Init_File.
2. Si utilizo como me dices como parámetro para init_File @MiFuncion, eso falla en compilación, porque le estaría pasando una direccion de memoria en vez de una variable declarada del tipo precisado. ¿Qué es lo que falla?

Aparte de todo lo anterior te explico un poco el contexto:

- El programa general consiste en comprimir audio sin pérdidas siguiendo las especificaciones del formato de audio FLAC.
- Para ello uso las funciones de libFlac.dll
- El programa en realidad "no me lo invento", en un principio se trata de hacer algo simple, para ello tomo un ejemplo de VisualC++ que comprime una pista de audio.
- La función de retrollamada es opcional, y si la cosa se pone fea, pues le paso un nil y se acabó.
- El punto del programa en el que se hace la retrollamada es el siguiente:

Cita:
init_status = FLAC__stream_encoder_init_file(encoder, argv[2], progress_callback, NULL);
Pongo textualmente la descripción del sistema que nos ocupa:

Cita:
* For encoding directly to a file, use FLAC__stream_encoder_init_FILE()
* or FLAC__stream_encoder_init_file(). Then you must only supply a
* filename or open \c FILE*; the encoder will handle all the callbacks
* internally. You may also supply a progress callback for periodic
* notification of the encoding progress.Initialize the encoder instance to * * encode native FLAC files.
...
...
* \param encoder An uninitialized encoder instance.
* \param file An open file. The file should have been opened
* with mode \c "w+b" and rewound. The file
* becomes owned by the encoder and should not be
* manipulated by the client while encoding.
* Unless \a file is \c stdout, it will be closed
* when FLAC__stream_encoder_finish() is called.
* Note however that a proper SEEKTABLE cannot be
* created when encoding to \c stdout since it is
* not seekable.
* \param progress_callback See FLAC__StreamEncoderProgressCallback. This
* pointer may be \c NULL if the callback is not
* desired.
* \param client_data This value will be supplied to callbacks in their
* \a client_data argument.
De aquí hay una cosa que no entiendo exactamente, cuando dice:

Cita:
...The file should have been opened with mode \c "w+b" and rewound.
¿En Delphi a qué equivaldría? Yo el fichero lo abro en modo lectura, aunque ahora dudo si debería estar en lectura/escritura por si codifica en el mismo fichero y no en otro...

Espero haber provisto de información suficiente mi trabajo.

Un saludo.

Guillermo.
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
¿puntero a puntero? Guillermo80 Varios 3 09-03-2008 22:46:32
puntero gaston260 API de Windows 11 01-02-2008 22:39:20
uso de función de dll cuyo parametro es un puntero (dirección) a una estructura abracadabra Varios 1 12-10-2007 16:43:59
pasar un puntero a una funcion baby Varios 2 21-05-2007 13:10:22
puntero a imagen Abaddon Gráficos 9 16-06-2005 00:17:29


La franja horaria es GMT +2. Ahora son las 16:35:06.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi