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>2010-08-22 13:31:28 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2010-08-22 13:31:28 (GMT)
commita2ee0f981c34d40765d7b7a8af6de0fda0766977 (patch)
tree55f2d33818c096a842807407f02ef40ee0e2a67a
parent6bd028b86e5c24e342345bae8f7131465d00a619 (diff)
gst-plugins-espeak: audio output skips about every second word in track=1 (word) mode (Tal Shalif) #2165
-rw-r--r--AUTHORS1
-rw-r--r--src/espeak.c113
2 files changed, 39 insertions, 75 deletions
diff --git a/AUTHORS b/AUTHORS
index 2246308..f6e1b20 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -1,6 +1,7 @@
Contributors
~~~~~~~~~~~~
Aleksey Lim <alsroot@member.fsf.org>
+Tal Shalif <tal+sugarlabs.org@shalif.com>
Yaakov Selkowitz <yselkowitz@users.sourceforge.net>
Maintainers
diff --git a/src/espeak.c b/src/espeak.c
index 58ffc28..cfb7fa7 100644
--- a/src/espeak.c
+++ b/src/espeak.c
@@ -84,11 +84,7 @@ static inline void spinning (Espin * base, Espin ** i) {
*i = base;
}
-static void emit_word (Econtext * self, guint offset, guint len) {
- GstStructure *data = gst_structure_new ("espeak-word",
- "offset", G_TYPE_UINT, offset,
- "len", G_TYPE_UINT, len,
- NULL);
+static void post_message (Econtext * self, GstStructure * data) {
if (!self->bus)
self->bus = gst_element_get_bus (self->emitter);
GstMessage *msg =
@@ -96,16 +92,22 @@ static void emit_word (Econtext * self, guint offset, guint len) {
gst_bus_post (self->bus, msg);
}
+static void emit_word (Econtext * self, guint offset, guint len, guint id) {
+ post_message (self, gst_structure_new ("espeak-word",
+ "offset", G_TYPE_UINT, offset,
+ "len", G_TYPE_UINT, len, "id", G_TYPE_UINT, id, NULL));
+}
+
+static void emit_sentence (Econtext * self, guint offset, guint len, guint id) {
+ post_message (self, gst_structure_new ("espeak-sentence",
+ "offset", G_TYPE_UINT, offset,
+ "len", G_TYPE_UINT, len, "id", G_TYPE_UINT, id, NULL));
+}
+
static void emit_mark (Econtext * self, guint offset, const gchar * mark) {
- GstStructure *data = gst_structure_new ("espeak-mark",
- "offset", G_TYPE_UINT, offset,
- "mark", G_TYPE_STRING, mark,
- NULL);
- if (!self->bus)
- self->bus = gst_element_get_bus (self->emitter);
- GstMessage *msg =
- gst_message_new_element (GST_OBJECT (self->emitter), data);
- gst_bus_post (self->bus, msg);
+ post_message (self, gst_structure_new ("espeak-mark",
+ "offset", G_TYPE_UINT, offset,
+ "mark", G_TYPE_STRING, mark, NULL));
}
static inline gsize
@@ -214,73 +216,35 @@ GstBuffer *play (Econtext * self, Espin * spin, gsize size_to_play) {
}
}
- inline gsize word (Econtext * self, Espin * spin, gsize size_to_play) {
+ inline gsize events (Econtext * self, Espin * spin, gsize size_to_play) {
gsize spin_size = spin->sound->len;
gsize event;
gsize sample_offset = 0;
-
- for (event = spin->events_pos; TRUE; ++event) {
- espeak_EVENT *i =
- &g_array_index (spin->events, espeak_EVENT, event);
-
- GST_DEBUG ("event=%zd i->type=%d i->text_position=%d",
- event, i->type, i->text_position);
-
- if (i->type == espeakEVENT_LIST_TERMINATED) {
- sample_offset = spin_size;
+ espeak_EVENT *i =
+ &g_array_index (spin->events, espeak_EVENT, spin->events_pos);
+
+ GST_DEBUG ("event=%zd i->type=%d i->text_position=%d",
+ event, i->type, i->text_position);
+
+ if (i->type == espeakEVENT_LIST_TERMINATED) {
+ sample_offset = spin_size;
+ } else {
+ switch (i->type) {
+ case espeakEVENT_MARK:
+ emit_mark (self, i->text_position, i->id.name);
break;
- } else if (i->type == espeakEVENT_WORD) {
- if (i->text_position != spin->last_word) {
- emit_word (self, i->text_position, i->length);
- spin->last_word = i->text_position;
- }
- sample_offset = i[1].sample * 2;
+ case espeakEVENT_WORD:
+ emit_word (self, i->text_position, i->length, i->id.number);
break;
- }
- }
-
- return sample_offset - spin->sound_offset;
- }
-
- inline gsize mark (Econtext * self, Espin * spin, gsize size_to_play) {
- if (spin->mark_name) {
- emit_mark (self, spin->mark_offset, spin->mark_name);
- spin->mark_offset = 0;
- spin->mark_name = NULL;
- }
-
- gsize spin_size = spin->sound->len;
- gsize event;
- gsize sample_offset = 0;
- guint mark_offset = 0;
- const gchar *mark_name = NULL;
-
- for (event = spin->events_pos; TRUE; ++event) {
- espeak_EVENT *i =
- &g_array_index (spin->events, espeak_EVENT, event);
-
- GST_DEBUG ("event=%zd i->type=%d i->text_position=%d",
- event, i->type, i->text_position);
-
- if (i->type == espeakEVENT_LIST_TERMINATED) {
- sample_offset = spin_size;
- break;
- } else if (i->type == espeakEVENT_MARK) {
- if (i->sample == 0) {
- if (spin->sound_offset == 0)
- emit_mark (self, i->text_position, i->id.name);
- continue;
- }
-
- mark_offset = i->text_position;
- mark_name = i->id.name;
- sample_offset = i->sample * 2;
+ case espeakEVENT_SENTENCE:
+ emit_sentence (self, i->text_position, i->length, i->id.number);
break;
}
}
- spin->mark_offset = mark_offset;
- spin->mark_name = mark_name;
+ if (!sample_offset) {
+ sample_offset = i->sample * 2;
+ }
return sample_offset - spin->sound_offset;
}
@@ -289,13 +253,12 @@ GstBuffer *play (Econtext * self, Espin * spin, gsize size_to_play) {
switch (g_atomic_int_get (&self->track)) {
case ESPEAK_TRACK_WORD:
- size_to_play = word (self, spin, size_to_play);
- break;
case ESPEAK_TRACK_MARK:
- size_to_play = mark (self, spin, size_to_play);
+ size_to_play = events (self, spin, size_to_play);
break;
default:
size_to_play = whole (spin, size_to_play);
+ break;
}
espeak_EVENT *event = &g_array_index (spin->events, espeak_EVENT,