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-02-05 20:24:24 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-05 20:24:24 (GMT)
commit75bc6fa6f1a00b089773d729576243b9ea1fce03 (patch)
tree37918e24140bd518aa38ca08ca00a85ad1920ba3
parent5d1edf3fd47abdd8a1016d9ef757ed41083b754b (diff)
Update .wav header
-rw-r--r--src/espeak.c45
-rw-r--r--src/gstespeak.c49
2 files changed, 37 insertions, 57 deletions
diff --git a/src/espeak.c b/src/espeak.c
index a6ca0f2..c92c047 100644
--- a/src/espeak.c
+++ b/src/espeak.c
@@ -127,23 +127,9 @@ gboolean
espeak_say(struct Espeak *es, const gchar *text, const gchar *lang,
guint pitch, guint rate)
{
- void write4bytes(GOutputStream *buffer, gint value)
- {
- gint i, byte;
-
- for(i = 4; i--;)
- {
- byte = value & 0xff;
- g_output_stream_write(buffer, &byte, 1, NULL, NULL);
- value >>= 8;
- }
- }
-
- g_seekable_seek((GSeekable*)es->buffer, 0, G_SEEK_SET, NULL, NULL);
-
+ g_seekable_seek(G_SEEKABLE(es->buffer), 0, G_SEEK_SET, NULL, NULL);
g_output_stream_write(es->buffer, wave_hdr, 24, NULL, NULL);
- write4bytes(es->buffer, sample_rate);
- write4bytes(es->buffer, sample_rate * 2);
+ g_seekable_seek(G_SEEKABLE(es->buffer), 8, G_SEEK_CUR, NULL, NULL);
g_output_stream_write(es->buffer, wave_hdr+32, 12, NULL, NULL);
pthread_mutex_lock(&mutex);
@@ -151,12 +137,35 @@ espeak_say(struct Espeak *es, const gchar *text, const gchar *lang,
espeak_SetParameter(espeakPITCH, pitch, 0);
espeak_SetParameter(espeakRATE, rate, 0);
espeak_SetVoiceByName(lang);
- gint status = espeak_Synth(text, strlen(text), 0, POS_CHARACTER, 0,
+ gint status = espeak_Synth(text, strlen(text)+1, 0, POS_WORD, 0,
espeakCHARS_AUTO, NULL, NULL);
buffer = NULL;
pthread_mutex_unlock(&mutex);
- return status == EE_OK;
+ if (status != EE_OK)
+ return FALSE;
+
+ void write4bytes(unsigned char *ptr, int value)
+ {
+ int ix;
+
+ for(ix=0; ix<4; ix++)
+ {
+ *ptr++ = value & 0xff;
+ value = value >> 8;
+ }
+ }
+
+ GMemoryOutputStream *mb = G_MEMORY_OUTPUT_STREAM(es->buffer);
+ unsigned char *ptr = g_memory_output_stream_get_data(mb);
+ guint size = g_memory_output_stream_get_data_size(mb);
+
+ write4bytes(ptr+24, sample_rate);
+ write4bytes(ptr+28, sample_rate*2);
+ write4bytes(ptr+4, size-8);
+ write4bytes(ptr+40, size-44);
+
+ return TRUE;
}
gpointer
diff --git a/src/gstespeak.c b/src/gstespeak.c
index 61b5b4d..383e2fa 100644
--- a/src/gstespeak.c
+++ b/src/gstespeak.c
@@ -91,11 +91,6 @@ static GstFlowReturn gst_espeak_create (GstBaseSrc*,
static gboolean gst_espeak_start (GstBaseSrc*);
static gboolean gst_espeak_stop (GstBaseSrc*);
static gboolean gst_espeak_is_seekable (GstBaseSrc*);
-static gboolean gst_espeak_unlock (GstBaseSrc*);
-static gboolean gst_espeak_unlock_stop (GstBaseSrc*);
-static gboolean gst_espeak_do_seek (GstBaseSrc*, GstSegment*);
-static gboolean gst_espeak_check_get_range (GstBaseSrc*);
-static gboolean gst_espeak_do_get_size (GstBaseSrc*, guint64*);
static void gst_espeak_init_uri(GType);
static void gst_espeak_finalize(GObject * gobject);
static void gst_espeak_set_property (GObject * object, guint prop_id,
@@ -135,11 +130,6 @@ gst_espeak_class_init (GstEspeakClass * klass)
basesrc_class->stop = gst_espeak_stop;
basesrc_class->stop = gst_espeak_stop;
basesrc_class->is_seekable = gst_espeak_is_seekable;
- basesrc_class->unlock = gst_espeak_unlock;
- basesrc_class->unlock_stop = gst_espeak_unlock_stop;
- basesrc_class->do_seek = gst_espeak_do_seek;
- basesrc_class->check_get_range = gst_espeak_check_get_range;
- basesrc_class->get_size = gst_espeak_do_get_size;
gobject_class->finalize = gst_espeak_finalize;
gobject_class->set_property = gst_espeak_set_property;
@@ -293,11 +283,18 @@ static GstFlowReturn
gst_espeak_create (GstBaseSrc * self_, guint64 offset, guint size,
GstBuffer ** buf)
{
- GstEspeak *self = (GstEspeak*)self_;
+ GstEspeak *self = GST_ESPEAK(self_);
+
+ gpointer ptr = espeak_hear(self->speak, offset, &size);
+
+ if (size == 0)
+ return GST_FLOW_UNEXPECTED;
+
*buf = gst_buffer_new();
- GST_BUFFER_DATA (*buf) = espeak_hear(self->speak, offset, &size);
+ GST_BUFFER_DATA (*buf) = ptr;
GST_BUFFER_SIZE (*buf) = size;
- return size == 0 ? GST_FLOW_UNEXPECTED : GST_FLOW_OK;
+
+ return GST_FLOW_OK;
}
static gboolean
@@ -324,32 +321,6 @@ gst_espeak_is_seekable (GstBaseSrc * src)
return FALSE;
}
-static gboolean gst_espeak_unlock (GstBaseSrc * bsrc)
-{
- return TRUE;
-}
-
-static gboolean gst_espeak_unlock_stop (GstBaseSrc * bsrc)
-{
- return TRUE;
-}
-
-static gboolean gst_espeak_do_seek (GstBaseSrc * src, GstSegment * segment)
-{
- return TRUE;
-}
-
-static gboolean gst_espeak_check_get_range (GstBaseSrc * src)
-{
- return FALSE;
-}
-
-static gboolean gst_espeak_do_get_size (GstBaseSrc * src, guint64 * size)
-{
- *size = -1;
- return TRUE;
-}
-
/******************************************************************************/
static GstURIType