From e4dad88de9b18d7a2cb966aa554fa872b7b29184 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Mon, 09 Mar 2009 05:40:58 +0000 Subject: Reset espeak queues on GST_STATE_NULL --- diff --git a/src/espeak.c b/src/espeak.c index 504f52e..1639638 100644 --- a/src/espeak.c +++ b/src/espeak.c @@ -177,7 +177,7 @@ espeak_unref(Econtext *self) { GST_DEBUG("[%p]", self); - process_pop(self); + espeak_reset(self); gint i; @@ -212,6 +212,8 @@ in_spinning(Econtext *self, Espin **spin, Text *text) while (!text_eot(text)) { + text_unref(&(*spin)->text); + text_chunk(text, &(*spin)->text, SPIN_FRAME_SIZE); g_atomic_int_set(&(*spin)->state, PROCESS); spinning(self->queue, spin); @@ -438,8 +440,6 @@ espeak_out(Econtext *self, gsize size_to_play) if (g_atomic_int_get(&spin->state) == PLAY && spin->sound_offset >= spin_size) { - text_unref(&spin->text); - GSList *text_link = slist_pop_link(&self->in_queue); if (text_link) @@ -470,6 +470,21 @@ espeak_out(Econtext *self, gsize size_to_play) return NULL; } +void +espeak_reset(Econtext *self) +{ + slist_clean(&self->in_queue); + process_pop(self); + + GstBuffer *buf; + while ((buf = espeak_out(self, SYNC_BUFFER_SIZE)) != NULL) + gst_buffer_unref(buf); + + int i; + for (i = SPIN_QUEUE_SIZE; i--;) + g_atomic_int_set(&self->queue[i].state, IN); +} + // espeak ---------------------------------------------------------------------- static gint @@ -670,6 +685,7 @@ process_pop(Econtext *context) g_mutex_lock(process_lock); process_queue = g_slist_remove_link(process_queue, context->process_chunk); + context->state &= ~INPROCESS; g_cond_broadcast(process_cond); g_mutex_unlock(process_lock); diff --git a/src/espeak.h b/src/espeak.h index 70df9d1..a9082dd 100644 --- a/src/espeak.h +++ b/src/espeak.h @@ -40,5 +40,6 @@ void espeak_set_track(Econtext*, guint); void espeak_in(Econtext*, const gchar *str); GstBuffer* espeak_out(Econtext*, gsize size_to_play); +void espeak_reset(Econtext*); #endif diff --git a/src/gstespeak.c b/src/gstespeak.c index 9e3f627..b460d19 100644 --- a/src/gstespeak.c +++ b/src/gstespeak.c @@ -267,10 +267,7 @@ gst_espeak_create(GstBaseSrc * self_, guint64 offset, guint size, if (*buf) return GST_FLOW_OK; else - { - //gst_element_set_state(GST_ELEMENT(self), GST_STATE_NULL); return GST_FLOW_UNEXPECTED; - } } static gboolean @@ -280,8 +277,10 @@ gst_espeak_start(GstBaseSrc * self_) } static gboolean -gst_espeak_stop(GstBaseSrc * self) +gst_espeak_stop(GstBaseSrc * self_) { + GstEspeak *self = GST_ESPEAK(self_); + espeak_reset(self->speak); return TRUE; } diff --git a/src/slist.h b/src/slist.h index f7c7ae9..8c80fa8 100644 --- a/src/slist.h +++ b/src/slist.h @@ -32,13 +32,19 @@ slist_new(SList *self) } inline void -slist_free(SList *self) +slist_clean(SList *self) { GSList *i; - + g_mutex_lock(self->lock); for (i = self->list; i; i = g_slist_next(i)) text_unref(i->data); + g_mutex_unlock(self->lock); +} +inline void +slist_free(SList *self) +{ + slist_clean(self); g_slist_free(self->list); g_mutex_free(self->lock); } -- cgit v0.9.1