diff options
Diffstat (limited to 'aoview/aoview_flite.c')
| -rw-r--r-- | aoview/aoview_flite.c | 58 |
1 files changed, 47 insertions, 11 deletions
diff --git a/aoview/aoview_flite.c b/aoview/aoview_flite.c index daa3ed36..bca19043 100644 --- a/aoview/aoview_flite.c +++ b/aoview/aoview_flite.c @@ -17,23 +17,59 @@ #include <stdio.h> #include <flite/flite.h> +#include "aoview.h" cst_voice *register_cmu_us_kal(); +static cst_voice *voice; -int -main(int argc, char **argv) +static FILE *pipe_write; +static GThread *aoview_flite_thread; + +gpointer +aoview_flite_task(gpointer data) { + FILE *input = data; char line[1024]; - cst_voice *v; - flite_init(); - v = register_cmu_us_kal(); - if (!v) { - perror("register voice"); - exit(1); + while (fgets(line, sizeof (line) - 1, input) != NULL) + flite_text_to_speech(line, voice, "play"); + return NULL; +} + +void +aoview_flite_stop(void) +{ + int status; + if (pipe_write) { + fclose(pipe_write); + pipe_write = NULL; + } + if (aoview_flite_thread) { + g_thread_join(aoview_flite_thread); + aoview_flite_thread = NULL; } - while (fgets(line, sizeof (line) - 1, stdin) != NULL) { - flite_text_to_speech(line, v, "play"); +} + +FILE * +aoview_flite_start(void) +{ + static once; + int p[2]; + GError *error; + FILE *pipe_read; + + if (!once) { + flite_init(); + voice = register_cmu_us_kal(); + if (!voice) { + perror("register voice"); + exit(1); + } } - exit (0); + aoview_flite_stop(); + pipe(p); + pipe_read = fdopen(p[0], "r"); + pipe_write = fdopen(p[1], "w"); + g_thread_create(aoview_flite_task, pipe_read, TRUE, &error); + return pipe_write; } |
