From 75bc6fa6f1a00b089773d729576243b9ea1fce03 Mon Sep 17 00:00:00 2001 From: Aleksey Lim Date: Thu, 05 Feb 2009 20:24:24 +0000 Subject: Update .wav header --- 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 -- cgit v0.9.1