Attachments you submit will be routed for moderation. If you have an account, please log in first.

Ticket #2165: gst-plugins-espeak.diff

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

    diff --git a/src/espeak.c b/src/espeak.c
    index 138d595..3d9de13 100644
    a b  
    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); 
     
    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 
     
    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    } 
     
    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,