From a2ee0f981c34d40765d7b7a8af6de0fda0766977 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Sun, 22 Aug 2010 13:31:28 +0000 Subject: gst-plugins-espeak: audio output skips about every second word in track=1 (word) mode (Tal Shalif) #2165 --- diff --git a/AUTHORS b/AUTHORS index 2246308..f6e1b20 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,6 +1,7 @@ Contributors ~~~~~~~~~~~~ Aleksey Lim +Tal Shalif Yaakov Selkowitz 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, -- cgit v0.9.1