summaryrefslogtreecommitdiffstats
path: root/gst/festival/gstfestival.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst/festival/gstfestival.c')
-rw-r--r--gst/festival/gstfestival.c275
1 files changed, 133 insertions, 142 deletions
diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c
index d59a8518..977455bd 100644
--- a/gst/festival/gstfestival.c
+++ b/gst/festival/gstfestival.c
@@ -77,88 +77,86 @@
#include "gstfestival.h"
#include <gst/audio/audio.h>
-static void gst_festival_base_init (gpointer g_class);
-static void gst_festival_class_init (GstFestivalClass *klass);
-static void gst_festival_init (GstFestival *festival);
+static void gst_festival_base_init (gpointer g_class);
+static void gst_festival_class_init (GstFestivalClass * klass);
+static void gst_festival_init (GstFestival * festival);
-static void gst_festival_chain (GstPad *pad, GstData *_data);
-static GstElementStateReturn
- gst_festival_change_state (GstElement *element);
+static void gst_festival_chain (GstPad * pad, GstData * _data);
+static GstElementStateReturn gst_festival_change_state (GstElement * element);
-static FT_Info* festival_default_info (void);
-static char* socket_receive_file_to_buff (int fd,int *size);
-static char* client_accept_s_expr (int fd);
+static FT_Info *festival_default_info (void);
+static char *socket_receive_file_to_buff (int fd, int *size);
+static char *client_accept_s_expr (int fd);
/* elementfactory information */
-static GstElementDetails gst_festival_details = GST_ELEMENT_DETAILS (
- "Festival synthesizer",
- "Filter/Effect/Audio",
- "Synthesizes plain text into audio",
- "Wim Taymans <wim.taymans@chello.be>"
-);
+static GstElementDetails gst_festival_details =
+GST_ELEMENT_DETAILS ("Festival synthesizer",
+ "Filter/Effect/Audio",
+ "Synthesizes plain text into audio",
+ "Wim Taymans <wim.taymans@chello.be>");
static GstStaticPadTemplate sink_template_factory =
-GST_STATIC_PAD_TEMPLATE (
- "festival_sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ( "text/plain" )
-);
+GST_STATIC_PAD_TEMPLATE ("festival_sink",
+ GST_PAD_SINK,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("text/plain")
+ );
static GstStaticPadTemplate src_template_factory =
-GST_STATIC_PAD_TEMPLATE (
- "festival_src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ( "audio/x-raw-int, "
- "endianness = (int) BYTE_ORDER, "
- "signed = (boolean) TRUE, "
- "width = (int) 16, "
- "depth = (int) 16, "
- "rate = (int) 16000, "
- "channels = (int) 1"
- )
-);
+GST_STATIC_PAD_TEMPLATE ("festival_src",
+ GST_PAD_SRC,
+ GST_PAD_ALWAYS,
+ GST_STATIC_CAPS ("audio/x-raw-int, "
+ "endianness = (int) BYTE_ORDER, "
+ "signed = (boolean) TRUE, "
+ "width = (int) 16, "
+ "depth = (int) 16, " "rate = (int) 16000, " "channels = (int) 1")
+ );
/* Festival signals and args */
-enum {
+enum
+{
/* FILL ME */
LAST_SIGNAL
};
-enum {
+enum
+{
ARG_0,
/* FILL ME */
};
static GstElementClass *parent_class = NULL;
+
/*static guint gst_festival_signals[LAST_SIGNAL] = { 0 }; */
GType
-gst_festival_get_type (void)
+gst_festival_get_type (void)
{
static GType festival_type = 0;
if (!festival_type) {
static const GTypeInfo festival_info = {
- sizeof(GstFestivalClass),
+ sizeof (GstFestivalClass),
gst_festival_base_init,
NULL,
(GClassInitFunc) gst_festival_class_init,
NULL,
NULL,
- sizeof(GstFestival),
+ sizeof (GstFestival),
0,
(GInstanceInitFunc) gst_festival_init,
};
- festival_type = g_type_register_static (GST_TYPE_ELEMENT, "GstFestival", &festival_info, 0);
+ festival_type =
+ g_type_register_static (GST_TYPE_ELEMENT, "GstFestival", &festival_info,
+ 0);
}
return festival_type;
}
static void
gst_festival_base_init (gpointer g_class)
-{
+{
GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
/* register src pads */
@@ -167,38 +165,40 @@ gst_festival_base_init (gpointer g_class)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_template_factory));
- gst_element_class_set_details (element_class, &gst_festival_details);
+ gst_element_class_set_details (element_class, &gst_festival_details);
}
static void
-gst_festival_class_init (GstFestivalClass *klass)
+gst_festival_class_init (GstFestivalClass * klass)
{
GstElementClass *gstelement_class;
- gstelement_class = (GstElementClass*) klass;
+ gstelement_class = (GstElementClass *) klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
gstelement_class->change_state = gst_festival_change_state;
}
-static void
-gst_festival_init (GstFestival *festival)
+static void
+gst_festival_init (GstFestival * festival)
{
- festival->sinkpad = gst_pad_new_from_template (
- gst_static_pad_template_get (&sink_template_factory), "sink");
+ festival->sinkpad =
+ gst_pad_new_from_template (gst_static_pad_template_get
+ (&sink_template_factory), "sink");
gst_pad_set_chain_function (festival->sinkpad, gst_festival_chain);
gst_element_add_pad (GST_ELEMENT (festival), festival->sinkpad);
- festival->srcpad = gst_pad_new_from_template (
- gst_static_pad_template_get (&src_template_factory), "src");
+ festival->srcpad =
+ gst_pad_new_from_template (gst_static_pad_template_get
+ (&src_template_factory), "src");
gst_element_add_pad (GST_ELEMENT (festival), festival->srcpad);
- festival->info = festival_default_info();
+ festival->info = festival_default_info ();
}
static void
-gst_festival_chain (GstPad *pad, GstData *_data)
+gst_festival_chain (GstPad * pad, GstData * _data)
{
GstBuffer *buf = GST_BUFFER (_data);
gchar *wavefile;
@@ -218,102 +218,98 @@ gst_festival_chain (GstPad *pad, GstData *_data)
festival = GST_FESTIVAL (gst_pad_get_parent (pad));
GST_DEBUG ("gst_festival_chain: got buffer in '%s'",
- gst_object_get_name (GST_OBJECT (festival)));
+ gst_object_get_name (GST_OBJECT (festival)));
+
+ fd = fdopen (dup (festival->info->server_fd), "wb");
- fd = fdopen(dup(festival->info->server_fd),"wb");
-
size = GST_BUFFER_SIZE (buf);
/* Copy text over to server, escaping any quotes */
- fprintf(fd,"(tts_textall \"\n");
- for (p=GST_BUFFER_DATA(buf); p && (*p != '\0') && size; p++, size--)
- {
+ fprintf (fd, "(tts_textall \"\n");
+ for (p = GST_BUFFER_DATA (buf); p && (*p != '\0') && size; p++, size--) {
if ((*p == '"') || (*p == '\\'))
- putc('\\',fd);
- putc(*p,fd);
+ putc ('\\', fd);
+ putc (*p, fd);
}
- fprintf(fd,"\" \"%s\")\n",festival->info->text_mode);
- fclose(fd);
+ fprintf (fd, "\" \"%s\")\n", festival->info->text_mode);
+ fclose (fd);
/* Read back info from server */
/* This assumes only one waveform will come back, also LP is unlikely */
wavefile = NULL;
do {
- for (n=0; n < 3; )
- n += read(festival->info->server_fd,ack+n,3-n);
+ for (n = 0; n < 3;)
+ n += read (festival->info->server_fd, ack + n, 3 - n);
ack[3] = '\0';
- if (strcmp(ack,"WV\n") == 0) /* receive a waveform */
- wavefile = socket_receive_file_to_buff (festival->info->server_fd, &filesize);
- else if (strcmp(ack,"LP\n") == 0) /* receive an s-expr */
- client_accept_s_expr(festival->info->server_fd);
- else if (strcmp(ack,"ER\n") == 0) /* server got an error */
- {
- fprintf(stderr,"festival_client: server returned error\n");
- break;
+ if (strcmp (ack, "WV\n") == 0) /* receive a waveform */
+ wavefile =
+ socket_receive_file_to_buff (festival->info->server_fd, &filesize);
+ else if (strcmp (ack, "LP\n") == 0) /* receive an s-expr */
+ client_accept_s_expr (festival->info->server_fd);
+ else if (strcmp (ack, "ER\n") == 0) { /* server got an error */
+ fprintf (stderr, "festival_client: server returned error\n");
+ break;
}
if (wavefile) {
outbuf = gst_buffer_new ();
GST_BUFFER_DATA (outbuf) = wavefile;
GST_BUFFER_SIZE (outbuf) = filesize;
-
+
gst_pad_push (festival->srcpad, GST_DATA (outbuf));
wavefile = NULL;
}
- } while (strcmp(ack,"OK\n") != 0);
-
+ } while (strcmp (ack, "OK\n") != 0);
+
gst_buffer_unref (buf);
}
-static FT_Info*
+static FT_Info *
festival_default_info (void)
{
FT_Info *info;
- info = (FT_Info *)malloc(1 * sizeof(FT_Info));
-
+
+ info = (FT_Info *) malloc (1 * sizeof (FT_Info));
+
info->server_host = FESTIVAL_DEFAULT_SERVER_HOST;
info->server_port = FESTIVAL_DEFAULT_SERVER_PORT;
info->text_mode = FESTIVAL_DEFAULT_TEXT_MODE;
info->server_fd = -1;
-
+
return info;
}
static int
festival_socket_open (const char *host, int port)
-{
- /* Return an FD to a remote server */
+{
+ /* Return an FD to a remote server */
struct sockaddr_in serv_addr;
struct hostent *serverhost;
int fd;
- fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
+ fd = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
- if (fd < 0)
- {
- fprintf(stderr,"festival_client: can't get socket\n");
+ if (fd < 0) {
+ fprintf (stderr, "festival_client: can't get socket\n");
return -1;
}
- memset(&serv_addr, 0, sizeof(serv_addr));
- if ((serv_addr.sin_addr.s_addr = inet_addr(host)) == -1)
- {
+ memset (&serv_addr, 0, sizeof (serv_addr));
+ if ((serv_addr.sin_addr.s_addr = inet_addr (host)) == -1) {
/* its a name rather than an ipnum */
- serverhost = gethostbyname(host);
- if (serverhost == (struct hostent *)0)
- {
- fprintf(stderr,"festival_client: gethostbyname failed\n");
+ serverhost = gethostbyname (host);
+ if (serverhost == (struct hostent *) 0) {
+ fprintf (stderr, "festival_client: gethostbyname failed\n");
return -1;
}
- memmove(&serv_addr.sin_addr,serverhost->h_addr, serverhost->h_length);
+ memmove (&serv_addr.sin_addr, serverhost->h_addr, serverhost->h_length);
}
serv_addr.sin_family = AF_INET;
- serv_addr.sin_port = htons(port);
+ serv_addr.sin_port = htons (port);
- if (connect(fd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) != 0)
- {
- fprintf(stderr,"festival_client: connect to server failed\n");
+ if (connect (fd, (struct sockaddr *) &serv_addr, sizeof (serv_addr)) != 0) {
+ fprintf (stderr, "festival_client: connect to server failed\n");
return -1;
}
@@ -321,58 +317,57 @@ festival_socket_open (const char *host, int port)
}
-static char*
+static char *
client_accept_s_expr (int fd)
{
/* Read s-expression from server, as a char * */
char *expr;
int filesize;
- expr = socket_receive_file_to_buff(fd,&filesize);
+ expr = socket_receive_file_to_buff (fd, &filesize);
expr[filesize] = '\0';
return expr;
}
-static char*
+static char *
socket_receive_file_to_buff (int fd, int *size)
{
/* Receive file (probably a waveform file) from socket using */
/* Festival key stuff technique, but long winded I know, sorry */
/* but will receive any file without closeing the stream or */
/* using OOB data */
- static const char *file_stuff_key = "ft_StUfF_key"; /* must == Festival's key */
+ static const char *file_stuff_key = "ft_StUfF_key"; /* must == Festival's key */
char *buff;
int bufflen;
- int n,k,i;
+ int n, k, i;
char c;
bufflen = 1024;
- buff = (char *)malloc(bufflen);
- *size=0;
-
- for (k=0; file_stuff_key[k] != '\0';)
- {
- n = read(fd,&c,1);
- if (n==0) break; /* hit stream eof before end of file */
- if ((*size)+k+1 >= bufflen) {
+ buff = (char *) malloc (bufflen);
+ *size = 0;
+
+ for (k = 0; file_stuff_key[k] != '\0';) {
+ n = read (fd, &c, 1);
+ if (n == 0)
+ break; /* hit stream eof before end of file */
+ if ((*size) + k + 1 >= bufflen) {
/* +1 so you can add a NULL if you want */
- bufflen += bufflen/4;
- buff = (char *)realloc(buff,bufflen);
+ bufflen += bufflen / 4;
+ buff = (char *) realloc (buff, bufflen);
}
if (file_stuff_key[k] == c)
k++;
- else if ((c == 'X') && (file_stuff_key[k+1] == '\0')) {
+ else if ((c == 'X') && (file_stuff_key[k + 1] == '\0')) {
/* It looked like the key but wasn't */
- for (i=0; i < k; i++,(*size)++)
- buff[*size] = file_stuff_key[i];
- k=0;
+ for (i = 0; i < k; i++, (*size)++)
+ buff[*size] = file_stuff_key[i];
+ k = 0;
/* omit the stuffed 'X' */
- }
- else {
- for (i=0; i < k; i++,(*size)++)
- buff[*size] = file_stuff_key[i];
- k=0;
+ } else {
+ for (i = 0; i < k; i++, (*size)++)
+ buff[*size] = file_stuff_key[i];
+ k = 0;
buff[*size] = c;
(*size)++;
}
@@ -386,14 +381,15 @@ socket_receive_file_to_buff (int fd, int *size)
/***********************************************************************/
static gboolean
-gst_festival_open (GstFestival *festival)
+gst_festival_open (GstFestival * festival)
{
/* Open socket to server */
if (festival->info == NULL)
- festival->info = festival_default_info();
+ festival->info = festival_default_info ();
- festival->info->server_fd =
- festival_socket_open(festival->info->server_host, festival->info->server_port);
+ festival->info->server_fd =
+ festival_socket_open (festival->info->server_host,
+ festival->info->server_port);
if (festival->info->server_fd == -1)
return FALSE;
@@ -401,19 +397,19 @@ gst_festival_open (GstFestival *festival)
}
static void
-gst_festival_close (GstFestival *festival)
+gst_festival_close (GstFestival * festival)
{
if (festival->info == NULL)
return;
if (festival->info->server_fd != -1)
- close(festival->info->server_fd);
+ close (festival->info->server_fd);
return;
}
static GstElementStateReturn
-gst_festival_change_state (GstElement *element)
+gst_festival_change_state (GstElement * element)
{
g_return_val_if_fail (GST_IS_FESTIVAL (element), GST_STATE_FAILURE);
@@ -423,7 +419,7 @@ gst_festival_change_state (GstElement *element)
} else {
if (!GST_FLAG_IS_SET (element, GST_FESTIVAL_OPEN)) {
if (!gst_festival_open (GST_FESTIVAL (element)))
- return GST_STATE_FAILURE;
+ return GST_STATE_FAILURE;
}
}
@@ -434,22 +430,17 @@ gst_festival_change_state (GstElement *element)
}
static gboolean
-plugin_init (GstPlugin *plugin)
+plugin_init (GstPlugin * plugin)
{
- if (!gst_element_register (plugin, "festival", GST_RANK_NONE, GST_TYPE_FESTIVAL))
+ if (!gst_element_register (plugin, "festival", GST_RANK_NONE,
+ GST_TYPE_FESTIVAL))
return FALSE;
return TRUE;
}
-GST_PLUGIN_DEFINE (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "festival",
- "Synthesizes plain text into audio",
- plugin_init,
- VERSION,
- "LGPL",
- GST_PACKAGE,
- GST_ORIGIN
-);
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+ GST_VERSION_MINOR,
+ "festival",
+ "Synthesizes plain text into audio",
+ plugin_init, VERSION, "LGPL", GST_PACKAGE, GST_ORIGIN);