Estructura con unión en AutoIT

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Estructura con unión en AutoIT

Mensaje por Jonny »

Hola,

¡Cuanto tiempo!. Hace mucho que no escribo por aquí, pero de vez en cuando voy entrando a ver qué se cuece por el foro :P

Pero no participo, porque hace un tiempo, dejé de programar... Pero recientemente me ha picado el gusanillo, y he vuelto a las andadas.

La cuestión es que he de trabajar con una DLL, y estoy escribiendo una UDF para hacerlo más sencillo.

Pero la API es un poco complicada, y tiene cosas en las que he perdido la práctica.

He de escribir esto en AutoIT:

Código: Seleccionar todo

typedef struct {
	espeak_EVENT_TYPE type;
	unsigned int unique_identifier; // message identifier (or 0 for key or character)
	int text_position;    // the number of characters from the start of the text
	int length;           // word length, in characters (for espeakEVENT_WORD)
	int audio_position;   // the time in mS within the generated speech output data
	int sample;           // sample id (internal use)
	void* user_data;      // pointer supplied by the calling program
	union {
		int number;        // used for WORD and SENTENCE events.
		const char *name;  // used for MARK and PLAY events.  UTF8 string
		char string[8];    // used for phoneme names (UTF8). Terminated by a zero byte unless the name needs the full 8 bytes.
	} id;
} espeak_EVENT;
He perdido la práctica, hasta el punto que no sé muy bien, qué es el primer parámetro de la estructura... (me refiero al tipo de dato).

El problema en esta estructura está en la unión que contiene. Hablamos hace tiempo de uniones y AutoIT aquí:

[ul]
http://www.emesn.com/autoitforum/viewto ... ones#p9959
[/ul]

Releyéndolo, he hecho memoria sobre las uniones en C++; que no recordaba muy bien como funcionaban.
Así, que la idea de como implementarlas en AutoIT la tengo. Pero no he conseguido hacer nada bueno con esta estructura.
Por suerte es mucho más sencilla que la del post anterior ;)

¿A alguien se le ocurre como debería hacerla en AutoIT?.

Por cierto, esta estructura se encuentra en:

[ul]
http://espeak.sourceforge.net/speak_lib.h
[/ul]

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Hola Jonny Tiempo sin verte por el foro.

Tienes que hacerlo así.

Código: Seleccionar todo

Local $sTag_espeak_EVENT='int type;uint unique_identifier;int text_position;int length;int audio_position;int sample;ptr user_data;byte union[8]'


Local $tespeak_EVENT=DllStructCreate($sTag_espeak_EVENT)

;acceder al campo number
Local $tnumber= DllStructCreate("int", DllStructGetPtr($tespeak_EVENT))
$inumber = DllStructGetData($tnumber, 1)


;acceder al campo char *name
Local $tnameptr= DllStructCreate("ptr", DllStructGetPtr($tespeak_EVENT))
$nameptr = DllStructGetData($tnameptr, 1)


;acceder al campo string
Local $tstring= DllStructCreate("char[8]", DllStructGetPtr($tespeak_EVENT))
$sstring= DllStructGetData($tnameptr, 1)

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Sí, así lo hice yo, mientras respondía alguien:

Código: Seleccionar todo

   Global $espeak_EVENT_StructPTR=DLLStructGetPTR(DLLStructCreate("INT espeak_EVENT_TYPE[36];UINT unique_identifier;INT text_position;INT length;INT audio_position;PTR user_data;CHAR String_Union_Struct[8]")) ;Estructura "espeak_EVENT".
Lo hice así para obtener directamente el puntero a la estructura, y no tener que obtenerlo cada vez.

Por cierto, en el primer campo de la estructura, hice un array de 36 elementos (bytes) ya que el campo en la estructura es de tipo "Enum", y conté eso, 36 bytes en ése tipo. Así que entiendo que debe hacerse así ?.

Ahora, no entiendo muy bien el último parámetro de la primera función, que estoy pasando a AutoIT.

Esto es lo que he hecho (que no es más que declarar la función y traducir la documentación):

Código: Seleccionar todo

   Func eSpeak_Initialize($Output, $BufLength=0, $Path=NULL, $Options) ;Función "espeak_Initialize".

    #CS

    --------------------


     Descripción:
     - Inicializa eSpeak.
     Parámetro(s):
     - $Output: El audio puede ser reproducido por eSpeak, o pasado de nuevo a la función "eSpeak_SynthCallback()".
     - $BufLength: La duración en MS del buffer de sonido, pasado a la función "eSpeak_SynthCallback()".
     *Este parámetro solo es usado en los modos "AUDIO_OUTPUT_RETRIEVAL" y "AUDIO_OUTPUT_SYNCHRONOUS".
      - 0=VALOR POR DEFECTO: 200mS.
     - $Path: Directorio que contiene el directorio de datos de espeak.
      - NULL=VALOR POR DEFECTO: Ubicación predeterminada.
     - $Options:
      - BIT 0: 1=Permite eventos "espeakEVENT_PHONEME".
      - BIT 1: 1=El evento "espeakEVENT_PHONEME" proporciona nombres de fonemas IPA, no nombres de fonemas de eSpeak.
      - BIT 15: 1=No salir si "eSpeak_data" no se encuentra (usado para --ayuda).
     Valor(es) de retorno:
     - Con éxito: Velocidad de muestreo en Hz.
     - Con errores: "$EE_INTERNAL_ERROR".
     Nota(s):
     - Esta función debe ser llamada antes que cualquier función de síntesis.


    --------------------

    #CE


   EndFunc ;END -> Función "espeak_Initialize".
El primer parámetro... no he visto qué valores admite ?.
Pero "$Options" no lo entiendo: O no está muy bien explicado, o la traducción no es muy buena... o es un parámetro de esos raros, que ha de ser binario (con lo que no me llevo bien). Pero creo que será más fácil de lo que parece:
- BIT 0: 1=Permite eventos "espeakEVENT_PHONEME".
- BIT 1: 1=El evento "espeakEVENT_PHONEME" proporciona nombres de fonemas IPA, no nombres de fonemas de eSpeak.
- BIT 15: 1=No salir si "eSpeak_data" no se encuentra (usado para --ayuda).
¿Alguien entiende esto? xD.

Yo diría que no es más, que pasarle "0", "1" o "15". Pero me despista lo de "bit x 1=..."...

Por si acaso esto también está en la página del API que puse en el primer post.


Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Tu estructura esta mal. el primer campo debe ser un entero nada mas, no 36 enteros.

La estructura debe tener solo 36 bytes en total.

Tampoco es correcto usar la estructura como lo haces ya que no te dejaría acceder a los campos de manera fácil y tampoco liberarla.


En cuanto lo otro que preguntas déjame revisar la documentación primero. luego te respondo...


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

En cuanto a lo del parametro option solo tienes que pasar uno de los siguientes parámetros como entero.

#define espeakINITIALIZE_PHONEME_EVENTS 0x0001
#define espeakINITIALIZE_PHONEME_IPA 0x0002
#define espeakINITIALIZE_DONT_EXIT 0x8000



Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Hola:

Mmmmmmmm. ¿Te refieres al puntero, que puede ser más difícil así de acceder a la estructura?. ¡Cierto!. Pero ... La verdad es que no sé, si las funciones que yo haga en AutoIT tendrán que acceder directamente a la estructura... Voy escribiendo código según voy viendo la documentación del API, así que no sé qué habrá más adelante...

Si he de acceder directamente con AutoIT a la estructura sí: sería más difícil, pero si sólo la va a usar la DLL creo que así es más sencillo. En cualquier caso, puedo quitar el DLLGetPTR() y si veo que sería mejor, luego ponerlo.

sobre la estructura:

Código: Seleccionar todo

typedef struct {
	espeak_EVENT_TYPE type;
	unsigned int unique_identifier; // message identifier (or 0 for key or character)
	int text_position;    // the number of characters from the start of the text
	int length;           // word length, in characters (for espeakEVENT_WORD)
	int audio_position;   // the time in mS within the generated speech output data
	int sample;           // sample id (internal use)
	void* user_data;      // pointer supplied by the calling program
	union {
		int number;        // used for WORD and SENTENCE events.
		const char *name;  // used for MARK and PLAY events.  UTF8 string
		char string[8];    // used for phoneme names (UTF8). Terminated by a zero byte unless the name needs the full 8 bytes.
	} id;
} espeak_EVENT;
Fíjate, que "espeak_EVENT_TYPE" es una enumeración:

Código: Seleccionar todo

typedef enum {
  espeakEVENT_LIST_TERMINATED = 0, // Retrieval mode: terminates the event list.
  espeakEVENT_WORD = 1,            // Start of word
  espeakEVENT_SENTENCE = 2,        // Start of sentence
  espeakEVENT_MARK = 3,            // Mark
  espeakEVENT_PLAY = 4,            // Audio element
  espeakEVENT_END = 5,             // End of sentence or clause
  espeakEVENT_MSG_TERMINATED = 6,  // End of message
  espeakEVENT_PHONEME = 7,         // Phoneme, if enabled in espeak_Initialize()
  espeakEVENT_SAMPLERATE = 8       // internal use, set sample rate
} espeak_EVENT_TYPE;
Y esta enumeración tiene 9 elementos, que entiendo son enteros (4 bytes). Se supone, que en la estructura, siendo el campo "type" de tipo "espeak_EVENT_TYPE" (la enumeración anterior) es de tipo entero y ocupa el tamaño de la enumeración (9 enteros=9*4 bytes) ¿no?.
Vaya, digo yo ... Como decía hace ya tiempo que no toco todo esto e igual me he hecho un lío.

Sobre el parámetro de la función... No me di cuenta que eran esas constantes ¿donde lo viste? :P

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Si exacto. si tienes que acceder a algún campo de la estructura luego entonces seria un poco complicado.



En cuanto a la enumeración (no estructura) espeak_EVENT_TYPE.

Recuerda que espeak_EVENT_TYPE es una enumeración y no una estructura. (si fuese una estructura fuese correcto hacerlo como explicas)

Osea la api te dice pasa un valor tipo espeak_EVENT_TYPE entonces solo deber pasar uno de los enteros de esa enumeración.

el parámetro option de la función lo vi arriba de la definición de espeak_Initialize.


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Jummmm. Vale: Pensé que había que pasar el tipo de dato, pero con el tamaño de la enumeración, para que pudiera acceder a cada elemento. Porque ... Con sólo un INT ¿Cómo se accedería a cada elemento?. No sé, yo lo veo como un array, con nueve elementos. Si sólo defino espacio para un elemento ...

pero ya te digo que es más que me lío, que otra cosa.

C++ nunca lo he dominado al cien por cien: Tuve un tiempo, en que se me daba más o menos bien, porque me estudié gran parte de un buen manual de C con clase. Pero hace ya mucho y recuerdo bien poco.

Así que, las voy a pasar canutas para pasar esta API a AutoIT: Me he quedado en el siguiente prototipo de función xD
¡Así que ya ves tú!

Código: Seleccionar todo

typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);
Sí, es la declaración de una función, que diría que es el callback al que llama la DLL. Pero no recuerdo eso de los asteriscos en los parámetros de funciones :P
¿esos parámetros se pasan por referencia, o son punteros...

Recuerdo haber tocado esta API hace tiempo con AutoIT pero no tengo ya el código, que fue bastante ... Eso sí, no funcionaba bien.

Tengo una librería que hice con ayuda de algunos del foro, pero es para otro sintetizador: Eloquence, pero este es de pago, mientras que eSpeak es gratuito.
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Es que no necesitas acceder a cada elemento de la enumeracion. solo a uno y ver a que corresponde.


en cuanto a
t_espeak_callback

Basicamente tienes que hacer algo asi


;~ typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);
Local $hHandle = DllCallbackRegister("_TuFuncionCallback", "int", "ptr;int;ptr")
Local $pCallBack=DllCallbackGetPtr($hHandle)

Y pasar ese puntero a tu funcion espeak_SetSynthCallback

Saludos


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Ya te digo, que me lié con la enumeración: Pensé que si estaba declarada con nueve elementos, en la estructura tenía que haber sitio para todos ellos. Pero pensándolo, sí: declarando un INT en la estructura, supongo que se almacenará el valor.... Pero se supone, que esa enumeración tiene nueve dígitos realmente. Imagino, que quieres decir, que en la estructura se almacenará sólo uno de ellos ?

Seguro que la cuestión es que no entiendo muy bien la documentación.

Sobre el callback: Tenía claro que eso es un callback, y que he de crear una función callback en AutoIt, que será llamada por la DLL (imagino que "espeak_SetSynthCallback").

Me liaba, porque aunque alguna vez definí en C++ un tipo con TypeDef de esta forma: "typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);" no recordaba esta sintaxis, y no sabía si "t_espeak_callback" era un puntero; que se devolvía en la función... o qué.
ahora ya he visto que la función devuelve un entero, y que los argumentos que tiene son de tipo puntero, entero y puntero.
Sigo sin saber bien qué es "(t_espeak_callback)". ¿El identificador de la función?.
Es que repasando esto en C++ he visto cosas con sintaxis parecida (...)(argumentos); pero en (...) se referían a punteros; porque así se definen punteros a funciones. Con "*" claro.

En fin: Con el código AutoIt que has puesto, ahora lo entiendo mejor.

¡Thanks!

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Exacto en la estructura se almacenara solo uno de ellos.


t_espeak_callback viene siendo el tipo de dato. en este caso un callback. que es un puntero a una función.

En AutoIt los punteros a funciones se hace con dllcallbackregister.

Un gusto ayudarte. cualquier duda que tengáis no dudes en preguntar.


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Sobre API de eSpeak, era: Estructura con unión en AutoIT

Mensaje por Jonny »

Entiendo. Entonces, digamos que cuando la DLL quiera llamar al callback de AutoIT, lo hará usando el puntero definido en

Código: Seleccionar todo

typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);
Es decir, que cuando vea en la API "t_espeak_callback", será un puntero al callback.

Así, yo en AutoIt, tendré que hacerlo como pusiste en otro post:

Código: Seleccionar todo

;~ typedef int (t_espeak_callback)(short*, int, espeak_EVENT*);
Local $hHandle = DllCallbackRegister("_TuFuncionCallback", "int", "ptr;int;ptr")
Local $pCallBack=DllCallbackGetPtr($hHandle)
Pensándolo, no entiendo muy bien lo de
Y pasar ese puntero a tu funcion espeak_SetSynthCallback
Se supone que este, es un puntero que usará la DLL para llamar a mi función "espeak_SetSynthCallback" de AutoIT ¿no?. ¿para qué pasárselo yo?.

¡Gracias!.

De todas formas, cambio el asunto, porque ya la cosa va del API en general, no de la estructura que hablábamos al principio xD

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Sobre API de eSpeak, era: Estructura con unión en AutoIT

Mensaje por Jonny »

Por cierto, una cosilla:

Si no me equivoco, esta DLL funciona con el tipo de llamada ":cdecl" ¿verdad?.
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

El callback es para que verifiques lo que pasa dentro de la dll (al menos la parte expuesta) dese el codigo de AutoIt.

Si cuando t_espeak_callback es un puntero a la funcion callback.


espeak_SetSynthCallback es la funcion que usa el callback (a la que le pasas el puntero)


Si si es cdecl.

Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Entonces, el puntero al callback sería mejor así:

Código: Seleccionar todo

   Global $eSpeak_SynthCallback_HWND=DLLCallbackRegister("eSpeak_SynthCallback", "INT:CDECL", "PTR;INT;PTR") ;Handle de la función callback "eSpeak_SynthCallback".
   Global $eSpeak_SynthCallback_PTR=DLLCallbackGetPTR($eSpeak_SynthCallback_HWND) ;Puntero de la función callback "eSpeak_SynthCallback".
¿verdad?
Porque según la ayuda de AutoIT hay que indicar en la función "DLLCallbackRegister" el tipo de llamada de la función (entiendo que la función de la DLL, no de AutoIT, que siempre usa STDCALL por defecto.
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Estas en lo correcto. :smt003


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Bueno. O con el calor estoy medio tonto, o ¡lo estaré con esta documentación! ;)

En la función "espeak_Initialize" que hemos tratado ya, y que tengo clara, hay un parámetro ("output") que no sé que posibles valores admite... No los veo en la documentación de la función:
/* Must be called before any synthesis functions are called.
output: the audio data can either be played by eSpeak or passed back by the SynthCallback function.

buflength: The length in mS of sound buffers passed to the SynthCallback function.
Value=0 gives a default of 200mS.
This paramater is only used for AUDIO_OUTPUT_RETRIEVAL and AUDIO_OUTPUT_SYNCHRONOUS modes.

path: The directory which contains the espeak-data directory, or NULL for the default location.

options: bit 0: 1=allow espeakEVENT_PHONEME events.
bit 1: 1= espeakEVENT_PHONEME events give IPA phoneme names, not eSpeak phoneme names
bit 15: 1=don't exit if espeak_data is not found (used for --help)

Returns: sample rate in Hz, or -1 (EE_INTERNAL_ERROR).
*/
Si mi inglés no falla más de la cuenta, en el primer parámetro se indica si el sonido debe ser reproducido por eSpeak, o devuelto al callback "SynthCallback".
¿pero como se indica una u otra cosa?.

La función "espeak_SetSynthCallback" que es para fijar el puntero al callback "SynthCallback" tiene esta sintaxis:

Código: Seleccionar todo

ESPEAK_API void espeak_SetSynthCallback(t_espeak_callback* SynthCallback);
Imagino, que admite un parámetro y que ha de ser el puntero al callback (el que creamos en post's anteriores); luego pone:
The callback function is of the form:

int SynthCallback(short *wav, int numsamples, espeak_EVENT *events);

wav: is the speech sound data which has been produced.
NULL indicates that the synthesis has been completed.

numsamples: is the number of entries in wav. This number may vary, may be less than
the value implied by the buflength parameter given in espeak_Initialize, and may
sometimes be zero (which does NOT indicate end of synthesis).

events: an array of espeak_EVENT items which indicate word and sentence events, and
also the occurance if <mark> and <audio> elements within the text. The list of
events is terminated by an event of type = 0.


Callback returns: 0=continue synthesis, 1=abort synthesis.
Supongo que "SynthCallback" es la función que he de hacer en AutoIT para que actúe como callback y que ha de tener la sintaxis que pone arriba... Y que según el valor que retorne, la síntesis continuará o no.


Y realmente la duda:

Código: Seleccionar todo

ESPEAK_API void espeak_SetUriCallback(int (*UriCallback)(int, const char*, const char*));
Esta función parece igual que "espeak_SetSynthCallback": No sé qué será eso de "URI", pero parece que hay que pasarle un puntero a otro callback.

Imagino que será tanto de lo mismo: Crear la función en AutoIT, y obtener un puntero a esta, con DLLCallbackRegister() y DLLcallbackGetPTR() y pasarle a esta función ése puntero.

Pero no entiendo muy bien la sintaxis de la declaración anterior: el parámetro que admite es un puntero a función... Pero ¿por qué no está igual escrito que en la función "espeak_SetSynthCallback"?

Código: Seleccionar todo

t_espeak_callback* SynthCallback
La verdad es que al fin y al cabo es lo mismo, porque "t_espeak_callback" es un tipo de dato, que se ha definido igual que "int (*UriCallback)(int, const char*, const char*))". Pero me despista un poco que en una función lo hayan hecho de una manera y en la otra, de otra. Pero ¿es lo mismo, verdad?.

Y bueno... ¿qué diferencias hay entre estas dos funciones callback?...

en ambas pone lo mismo:
This specifies a function in the calling program which is called when a buffer of
speech sound data has been produced.
Y por cierto: Aquí solo veo declaraciones de funciones... Supongo, que esto al ser el header de la librería, lo que he de hacer es llamar a las funciones de la DLL, que se llamarán exactamente igual que pone aquí, y pasarle estos parámetros como se indica en esta documentación ¿no?.
Es que en principio yo esperaba encontrar llamadas a funciones, código ... más complejo xD.
Pero haciendo memoria he recordado otra API de otro sintetizador que hice hace tiempo (Eloquence) y era algo parecido a esto :)

P.D.: Aunque no lo parezca, voy avanzando con esto... Lo que pasa es, que voy un poco lento porque por un lado, me cuesta entender el código C++ de la API, y por otro, voy traduciendo toda la documentación.

Cuando haya algo más o menos importante, lo subiré para que lo veáis ;)

Salu2!
Avatar de Usuario
Dany
Profesional del Autoit
Mensajes: 651
Registrado: 28 Mar 2012, 22:49

Re: Estructura con unión en AutoIT

Mensaje por Dany »

Hola.

El parametro output es de tipo espeak_AUDIO_OUTPUT que es una enumeracion
en el cual puedes pasar uno de las siguientes constantes

/* PLAYBACK mode: plays the audio data, supplies events to the calling program*/
AUDIO_OUTPUT_PLAYBACK,

/* RETRIEVAL mode: supplies audio data and events to the calling program */
AUDIO_OUTPUT_RETRIEVAL,

/* SYNCHRONOUS mode: as RETRIEVAL but doesn't return until synthesis is completed */
AUDIO_OUTPUT_SYNCHRONOUS,

/* Synchronous playback */
AUDIO_OUTPUT_SYNCH_PLAYBACK



lo de espeak_SetSynthCallback. Sí.


espeak_SetUriCallback

Es para definir otro callback a la final tienes que hacer lo mismo que antes.
Crear una funcion callback y pasarselo a esta funcion.

Porque al parecer la define inplicitamente. Pero no deja de ser lo mismo que ya hablamos anteriormente.


Diferencia.
En si diferencias no existe como tal ya que no dejan de ser callback.

La diferencia viene dada en que te permite hacer cada una. (tienes que ver la documentacion y ver que ofreece cada una)




Pues si ya que es una libreria lo importante es tener idea clara de los parametros que necesitas
para cada funcion ya despues las llamadas se hacen facil.

Espero ver pronto el avance que llevas.


Saludos :smt027
  • ............................................Imagen
    ......................................Imagen
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Hum, vale.

La verdad es que he mirado varias veces ... Pero no he visto que "output" se refiera a esa enumeración... Al menos en la función, igual lo pasé por alto en la propia enumeración.

Sí: entiendo que deben haber diferencias entre ambos callback's, que debe explicar en la documentación. Pero me lió que un callback estuviese definido de una forma, y el otro de otra.

Cuando haya algo más de código interesante lo subo. Porque ahora casi todo es traducción de la documentación, constantes, estructuras, enumeraciones...

Salu2!
Jonny
Profesional del Autoit
Mensajes: 1042
Registrado: 30 Jun 2008, 20:08

Re: Estructura con unión en AutoIT

Mensaje por Jonny »

Hola:

Viendo la documentación del API de eSpeak veo esto:

Código: Seleccionar todo

ESPEAK_API const char *espeak_TextToPhonemes(const void **textptr, int textmode, int phonememode);
¿cómo funciona esta función?. ¿qué significa

Código: Seleccionar todo

const void **textptr,
¿por qué dos asteriscos juntos?. No recuerdo qué significaba eso en C++.

Salu2!
Responder