From 89625b3d7f6c598663af92ffdb223b21e87747f1 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Mon, 09 Mar 2009 03:43:18 +0000 Subject: Return voices list in speech-dispatcher's bindning format --- diff --git a/src/espeak.c b/src/espeak.c index 5ea1a4b..267e5eb 100644 --- a/src/espeak.c +++ b/src/espeak.c @@ -126,7 +126,7 @@ static GCond *process_cond = NULL; static GSList *process_queue = NULL; static gint espeak_sample_rate = 0; -static const espeak_VOICE **espeak_voices = NULL; +static GValueArray *espeak_voices = NULL; static GOutputStream *espeak_buffer = NULL; static GArray *espeak_events = NULL; @@ -551,21 +551,11 @@ espeak_get_sample_rate() return espeak_sample_rate; } -gchar** +GValueArray* espeak_get_voices() { - gsize count = 0; - const espeak_VOICE **i; - char **j, **out; - init(); - - for (i = espeak_voices; *i; ++i) ++count; - out = j = g_new0(gchar*, count); - for (i = espeak_voices; *i; ++i) - *j++ = g_strconcat((*i)->name, ":", (*i)->languages+1, NULL); - - return out; + return g_value_array_copy(espeak_voices); } void @@ -683,13 +673,50 @@ init() if (initialized == 0) { ++initialized; - espeak_sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, - SYNC_BUFFER_SIZE, NULL, 0); - espeak_SetSynthCallback(synth_cb); - espeak_voices = espeak_ListVoices(NULL); process_lock = g_mutex_new(); process_cond = g_cond_new(); process_tid = g_thread_create(process, NULL, FALSE, NULL); + + espeak_sample_rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, + SYNC_BUFFER_SIZE, NULL, 0); + espeak_SetSynthCallback(synth_cb); + + gsize count = 0; + const espeak_VOICE **i; + const espeak_VOICE **voices = espeak_ListVoices(NULL); + + for (i = voices; *i; ++i) + ++count; + espeak_voices = g_value_array_new(count); + + for (i = voices; *i; ++i) + { + GValueArray *voice = g_value_array_new(2); + + GValue name = { 0 }; + g_value_init(&name, G_TYPE_STRING); + g_value_set_static_string(&name, (*i)->name); + g_value_array_append(voice, &name); + + char *dialect_str = strchr((*i)->languages + 1, '-'); + if (dialect_str) *dialect_str++ = 0; + + GValue lang = { 0 }; + g_value_init(&lang, G_TYPE_STRING); + g_value_set_static_string(&lang, (*i)->languages + 1); + g_value_array_append(voice, &lang); + + GValue dialect = { 0 }; + g_value_init(&dialect, G_TYPE_STRING); + g_value_set_static_string(&dialect, dialect_str ? dialect_str : "none"); + g_value_array_append(voice, &dialect); + + GValue voice_value = { 0 }; + g_value_init(&voice_value, G_TYPE_VALUE_ARRAY); + g_value_set_boxed_take_ownership(&voice_value, voice); + g_value_array_append(espeak_voices, &voice_value); + g_value_unset(&voice_value); + } } } diff --git a/src/espeak.h b/src/espeak.h index b0e44c2..688b477 100644 --- a/src/espeak.h +++ b/src/espeak.h @@ -30,18 +30,18 @@ struct _Econtext; typedef struct _Econtext Econtext; -Econtext* espeak_new(GstElement*); -void espeak_unref(Econtext*); - -gint espeak_get_sample_rate(); -gchar** espeak_get_voices(); -void espeak_set_pitch(Econtext*, guint); -void espeak_set_rate(Econtext*, guint); -void espeak_set_voice(Econtext*, const gchar*); -void espeak_set_gap(Econtext*, guint); -void espeak_set_track(Econtext*, guint); - -void espeak_in(Econtext*, const gchar *str); -GstBuffer* espeak_out(Econtext*, gsize size_to_play); +Econtext* espeak_new(GstElement*); +void espeak_unref(Econtext*); + +gint espeak_get_sample_rate(); +GValueArray* espeak_get_voices(); +void espeak_set_pitch(Econtext*, guint); +void espeak_set_rate(Econtext*, guint); +void espeak_set_voice(Econtext*, const gchar*); +void espeak_set_gap(Econtext*, guint); +void espeak_set_track(Econtext*, guint); + +void espeak_in(Econtext*, const gchar *str); +GstBuffer* espeak_out(Econtext*, gsize size_to_play); #endif diff --git a/src/gstespeak.c b/src/gstespeak.c index 7a50e7f..6f28f57 100644 --- a/src/gstespeak.c +++ b/src/gstespeak.c @@ -136,7 +136,7 @@ gst_espeak_class_init(GstEspeakClass * klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, PROP_VOICES, g_param_spec_boxed("voices", "List of voices", - "List of voices", G_TYPE_STRV, + "List of voices", G_TYPE_VALUE_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(gobject_class, PROP_CAPS, g_param_spec_boxed("caps", "Caps", @@ -175,10 +175,10 @@ gst_espeak_finalize(GObject * self_) fprintf(stderr, "0!!!!!!\n"); GstEspeak *self = GST_ESPEAK(self_); - gst_caps_unref(self->caps); self->caps = NULL; - espeak_unref(self->speak); self->speak = NULL; - g_free(self->voice); self->voice = NULL; - g_strfreev(self->voices); self->voices = NULL; + gst_caps_unref(self->caps); self->caps = NULL; + espeak_unref(self->speak); self->speak = NULL; + g_free(self->voice); self->voice = NULL; + g_value_array_free(self->voices); self->voices = NULL; G_OBJECT_CLASS(parent_class)->dispose(self_); } diff --git a/src/gstespeak.h b/src/gstespeak.h index 593ddb2..9b4778b 100644 --- a/src/gstespeak.h +++ b/src/gstespeak.h @@ -48,7 +48,7 @@ struct _GstEspeak gchar *voice; guint gap; guint track; - gchar **voices; + GValueArray *voices; GstCaps *caps; gboolean poll; }; -- cgit v0.9.1