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>2009-03-09 05:40:58 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-03-09 05:40:58 (GMT)
commite4dad88de9b18d7a2cb966aa554fa872b7b29184 (patch)
tree068f707d3396ad0c8c6db51dc657088f50431e30
parentdda63be39672ec8d32e0a9e9e6911b3d1d0590f6 (diff)
Reset espeak queues on GST_STATE_NULL
-rw-r--r--src/espeak.c22
-rw-r--r--src/espeak.h1
-rw-r--r--src/gstespeak.c7
-rw-r--r--src/slist.h10
4 files changed, 31 insertions, 9 deletions
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);
}