Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-03-09 03:43:18 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-03-09 03:43:18 (GMT)
commit89625b3d7f6c598663af92ffdb223b21e87747f1 (patch)
treec50f5be96c6797d526c757d2abe64277e19202b9
parent3f01911940efbc8af2bacf2d54b0d06a2802f1c1 (diff)
Return voices list in speech-dispatcher's bindning format
-rw-r--r--src/espeak.c61
-rw-r--r--src/espeak.h26
-rw-r--r--src/gstespeak.c10
-rw-r--r--src/gstespeak.h2
4 files changed, 63 insertions, 36 deletions
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;
};