Ticket #2165: gst-plugins-espeak.diff

File gst-plugins-espeak.diff, 5.9 KB (added by tshalif, 14 years ago)
  • src/espeak.c

    diff --git a/src/espeak.c b/src/espeak.c
    index 138d595..3d9de13 100644
    a b spinning(Espin *base, Espin **i) 
    9090        *i = base;
    9191}
    9292
    93 static void
    94 emit_word(Econtext *self, guint offset, guint len)
     93static void post_message(Econtext *self, GstStructure *data)
    9594{
    96     GstStructure *data = gst_structure_new("espeak-word",
    97             "offset", G_TYPE_UINT, offset,
    98             "len", G_TYPE_UINT, len,
    99             NULL);
    10095    if (!self->bus)
    10196        self->bus = gst_element_get_bus(self->emitter);
    10297    GstMessage *msg = gst_message_new_element(GST_OBJECT(self->emitter), data);
    emit_word(Econtext *self, guint offset, guint len) 
    10499}
    105100
    106101static void
     102emit_word(Econtext *self, guint offset, guint len, guint id)
     103{
     104  post_message(self, gst_structure_new("espeak-word",
     105                                       "offset", G_TYPE_UINT, offset,
     106                                       "len", G_TYPE_UINT, len,
     107                                       "id", G_TYPE_UINT, id,
     108                                       NULL));
     109}
     110
     111static void
     112emit_sentence(Econtext *self, guint offset, guint len, guint id)
     113{
     114  post_message(self, gst_structure_new("espeak-sentence",
     115                                       "offset", G_TYPE_UINT, offset,
     116                                       "len", G_TYPE_UINT, len,
     117                                       "id", G_TYPE_UINT, id,
     118                                       NULL));
     119}
     120
     121static void
    107122emit_mark(Econtext *self, guint offset, const gchar *mark)
    108123{
    109     GstStructure *data = gst_structure_new("espeak-mark",
    110             "offset", G_TYPE_UINT, offset,
    111             "mark", G_TYPE_STRING, mark,
    112             NULL);
    113     if (!self->bus)
    114         self->bus = gst_element_get_bus(self->emitter);
    115     GstMessage *msg = gst_message_new_element(GST_OBJECT(self->emitter), data);
    116     gst_bus_post(self->bus, msg);
     124  post_message(self, gst_structure_new("espeak-mark",
     125                                       "offset", G_TYPE_UINT, offset,
     126                                       "mark", G_TYPE_STRING, mark,
     127                                       NULL));
    117128}
    118129
    119130static inline gsize
    play(Econtext *self, Espin *spin, gsize size_to_play) 
    235246        }
    236247    }
    237248
    238     inline gsize word(Econtext *self, Espin *spin, gsize size_to_play)
    239     {
    240         gsize spin_size = spin->sound->len;
    241         gsize event;
    242         gsize sample_offset = 0;
    243 
    244         for (event = spin->events_pos; TRUE; ++event)
    245         {
    246             espeak_EVENT *i = &g_array_index(spin->events, espeak_EVENT, event);
    247 
    248             GST_DEBUG("event=%zd i->type=%d i->text_position=%d",
    249                       event, i->type, i->text_position);
    250 
    251             if (i->type == espeakEVENT_LIST_TERMINATED)
    252             {
    253                 sample_offset = spin_size;
    254                 break;
    255             }
    256             else if (i->type == espeakEVENT_WORD)
    257             {
    258                 if (i->text_position != spin->last_word)
    259                 {
    260                     emit_word(self, i->text_position, i->length);
    261                     spin->last_word = i->text_position;
    262                 }
    263                 sample_offset = i[1].sample*2;
    264                 break;
    265             }
    266         }
    267 
    268         return sample_offset - spin->sound_offset;
    269     }
    270249
    271     inline gsize mark(Econtext *self, Espin *spin, gsize size_to_play)
     250    inline gsize events(Econtext *self, Espin *spin, gsize size_to_play)
    272251    {
    273         if (spin->mark_name)
    274         {
    275             emit_mark(self, spin->mark_offset, spin->mark_name);
    276             spin->mark_offset = 0;
    277             spin->mark_name = NULL;
    278         }
    279 
    280252        gsize spin_size = spin->sound->len;
    281253        gsize event;
    282254        gsize sample_offset = 0;
    283         guint mark_offset = 0;
    284         const gchar *mark_name = NULL;
    285 
    286         for (event = spin->events_pos; TRUE; ++event)
    287         {
    288             espeak_EVENT *i = &g_array_index(spin->events, espeak_EVENT, event);
    289 
    290             GST_DEBUG("event=%zd i->type=%d i->text_position=%d",
    291                       event, i->type, i->text_position);
    292 
    293             if (i->type == espeakEVENT_LIST_TERMINATED)
    294             {
    295                 sample_offset = spin_size;
    296                 break;
    297             }
    298             else if (i->type == espeakEVENT_MARK)
    299             {
    300                 if (i->sample == 0)
    301                 {
    302                     if (spin->sound_offset == 0)
    303                         emit_mark(self, i->text_position, i->id.name);
    304                     continue;
    305                 }
    306 
    307                 mark_offset = i->text_position;
    308                 mark_name = i->id.name;
    309                 sample_offset = i->sample*2;
    310                 break;
    311             }
    312         }
    313 
    314         spin->mark_offset = mark_offset;
    315         spin->mark_name = mark_name;
     255        espeak_EVENT *i = &g_array_index(spin->events, espeak_EVENT, spin->events_pos);
     256
     257        GST_DEBUG("event=%zd i->type=%d i->text_position=%d",
     258                  event, i->type, i->text_position);
     259
     260           
     261        if (i->type == espeakEVENT_LIST_TERMINATED) {
     262          sample_offset = spin_size;
     263        } else {
     264          switch (i->type) {
     265          case espeakEVENT_MARK:
     266            emit_mark(self, i->text_position, i->id.name);
     267            break;
     268          case espeakEVENT_WORD:
     269            emit_word(self, i->text_position, i->length, i->id.number);
     270            break;
     271          case espeakEVENT_SENTENCE:
     272            emit_sentence(self, i->text_position, i->length, i->id.number);
     273            break;
     274          }
     275        }
     276
     277        if (!sample_offset) {
     278          sample_offset = i->sample*2;
     279        }
    316280
    317281        return sample_offset - spin->sound_offset;
    318282    }
    play(Econtext *self, Espin *spin, gsize size_to_play) 
    320284    g_atomic_int_set(&spin->state, PLAY);
    321285
    322286    switch (g_atomic_int_get(&self->track))
    323     {
    324         case ESPEAK_TRACK_WORD:
    325             size_to_play = word(self, spin, size_to_play);
    326             break;
    327         case ESPEAK_TRACK_MARK:
    328             size_to_play = mark(self, spin, size_to_play);
    329             break;
    330         default:
    331             size_to_play = whole(spin, size_to_play);
     287      {
     288      case ESPEAK_TRACK_WORD:
     289      case ESPEAK_TRACK_MARK:
     290        size_to_play = events(self, spin, size_to_play);
     291        break;
     292      default:
     293        size_to_play = whole(spin, size_to_play);
     294        break; 
    332295    }
    333296
    334297    espeak_EVENT *event = &g_array_index(spin->events, espeak_EVENT,