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"?
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!