Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-02-05 06:43:17 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-05 06:43:17 (GMT)
commit8647d1d6964f2fb5c7c57c80984859292b1196f1 (patch)
treea5c05de7b26ecb93e13267b05f582e8d2cc42282 /src
parente229ac4e514e5ab454d3008467c4220a8819e9dd (diff)
Say Aaa.
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am30
-rw-r--r--src/espeak.c148
-rw-r--r--src/espeak.h (renamed from src/gstplugin.h)48
-rw-r--r--src/gstespeak.c176
-rw-r--r--src/gstespeak.h12
-rw-r--r--src/gstplugin.c271
6 files changed, 267 insertions, 418 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 8efd485..abf184d 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,27 +1,11 @@
-# plugindir is set in configure
+plugin_LTLIBRARIES = libgstespeak.la
-##############################################################################
-# change libgstplugin.la to something more suitable, e.g. libmysomething.la #
-##############################################################################
-plugin_LTLIBRARIES = libgstplugin.la
+libgstespeak_la_SOURCES = gstespeak.c espeak.c
-##############################################################################
-# for the next set of variables, rename the prefix if you renamed the .la, #
-# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES #
-# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS #
-# libgstplugin_la_LIBADD => libmysomething_la_LIBADD #
-# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS #
-##############################################################################
-
-# sources used to compile this plug-in
-libgstplugin_la_SOURCES = gstplugin.c
-
-# flags used to compile this plugin
-# add other _CFLAGS and _LIBS as needed
-libgstplugin_la_CFLAGS = $(GST_CFLAGS)
-libgstplugin_la_LIBADD = $(GST_LIBS)
-libgstplugin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstplugin_la_LIBTOOLFLAGS = --tag=disable-static
+libgstespeak_la_CFLAGS = $(GST_CFLAGS)
+libgstespeak_la_LIBADD = $(GST_LIBS) -lespeak -lgio-2.0 -lgobject-2.0 -lgmodule-2.0 -lglib-2.0 -lgstaudio-0.10 -lgstbase-0.10 -lgstinterfaces-0.10 -lgstreamer-0.10
+libgstespeak_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstespeak_la_LIBTOOLFLAGS = --tag=disable-static
# headers we need but don't want installed
-noinst_HEADERS = gstplugin.h
+noinst_HEADERS = gstespeak.h espeak.h
diff --git a/src/espeak.c b/src/espeak.c
new file mode 100644
index 0000000..7e7236d
--- /dev/null
+++ b/src/espeak.c
@@ -0,0 +1,148 @@
+/*
+ * GStreamer
+ * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright (C) 2009 Aleksey S. Lim <alsroot@member.fsf.org>
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+#include <gio/gio.h>
+#include <espeak/speak_lib.h>
+
+struct Espeak
+{
+ GOutputStream *buffer;
+};
+
+static unsigned char wave_hdr[44] = {
+ 'R','I','F','F',0x24,0xf0,0xff,0x7f,'W','A','V','E','f','m','t',' ',
+ 0x10,0,0,0,1,0,1,0, 9,0x3d,0,0,0x12,0x7a,0,0,
+ 2,0,0x10,0,'d','a','t','a', 0x00,0xf0,0xff,0x7f};
+
+static GMutex *mutex = NULL;
+static GOutputStream *buffer = NULL;
+static gint rate = 0;
+
+static gint
+read_cb(short * wav, int numsamples, espeak_EVENT * events)
+{
+ if (wav == NULL)
+ return 0;
+
+ if (numsamples > 0)
+ g_output_stream_write(buffer, wav, numsamples*2, NULL, NULL);
+
+ return 0;
+}
+
+struct Espeak*
+espeak_new()
+{
+ static gsize initialized = 0;
+
+ if (g_once_init_enter(&initialized))
+ {
+ rate = espeak_Initialize(AUDIO_OUTPUT_SYNCHRONOUS, 4096, NULL, 0);
+ espeak_SetSynthCallback(read_cb);
+ mutex = g_mutex_new();
+ }
+
+ if (rate == EE_INTERNAL_ERROR)
+ return NULL;
+
+ struct Espeak *es = g_new(struct Espeak, 1);
+ es->buffer = g_memory_output_stream_new(NULL, 0, realloc, free);
+
+ return es;
+}
+
+gboolean
+espeak_say(struct Espeak *es, const gchar *text)
+{
+ 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_output_stream_write(es->buffer, wave_hdr, 24, NULL, NULL);
+ write4bytes(es->buffer, rate);
+ write4bytes(es->buffer, rate * 2);
+ g_output_stream_write(es->buffer, wave_hdr+32, 12, NULL, NULL);
+
+ g_mutex_lock(mutex);
+ buffer = es->buffer;
+ gint status = espeak_Synth(text, strlen(text), 0, POS_CHARACTER, 0,
+ espeakCHARS_AUTO, NULL, NULL);
+ buffer = NULL;
+ g_mutex_unlock(mutex);
+
+ return status == EE_OK;
+}
+
+gpointer
+espeak_hear(struct Espeak *es, goffset offset, guint *size)
+{
+ GMemoryOutputStream *mb = (GMemoryOutputStream*)es->buffer;
+
+ gpointer out = g_memory_output_stream_get_data(mb) + offset;
+ *size = MIN(g_memory_output_stream_get_data_size(mb) - offset, *size);
+
+ return out;
+}
+
+void
+espeak_unref(struct Espeak *es)
+{
+ g_free(es->buffer);
+ es->buffer = 0;
+ g_free(es);
+}
diff --git a/src/gstplugin.h b/src/espeak.h
index f1fe4ed..612e496 100644
--- a/src/gstplugin.h
+++ b/src/espeak.h
@@ -2,7 +2,7 @@
* GStreamer
* Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
* Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
- * Copyright (C) YEAR AUTHOR_NAME AUTHOR_EMAIL
+ * Copyright (C) 2009 Aleksey S. Lim <alsroot@member.fsf.org>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -43,44 +43,14 @@
* Boston, MA 02111-1307, USA.
*/
-#ifndef __GST_PLUGIN_TEMPLATE_H__
-#define __GST_PLUGIN_TEMPLATE_H__
+#ifndef __ESPEAK_H__
+#define __ESPEAK_H__
-#include <gst/gst.h>
+struct Espeak;
-G_BEGIN_DECLS
+struct Espeak* espeak_new();
+gboolean espeak_say(struct Espeak*, const gchar *text);
+gpointer espeak_hear(struct Espeak*, goffset offset, guint *size);
+void espeak_unref(struct Espeak*);
-/* #defines don't like whitespacey bits */
-#define GST_TYPE_PLUGIN_TEMPLATE \
- (gst_plugin_template_get_type())
-#define GST_PLUGIN_TEMPLATE(obj) \
- (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLUGIN_TEMPLATE,GstPluginTemplate))
-#define GST_PLUGIN_TEMPLATE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLUGIN_TEMPLATE,GstPluginTemplateClass))
-#define GST_IS_PLUGIN_TEMPLATE(obj) \
- (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLUGIN_TEMPLATE))
-#define GST_IS_PLUGIN_TEMPLATE_CLASS(klass) \
- (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLUGIN_TEMPLATE))
-
-typedef struct _GstPluginTemplate GstPluginTemplate;
-typedef struct _GstPluginTemplateClass GstPluginTemplateClass;
-
-struct _GstPluginTemplate
-{
- GstElement element;
-
- GstPad *sinkpad, *srcpad;
-
- gboolean silent;
-};
-
-struct _GstPluginTemplateClass
-{
- GstElementClass parent_class;
-};
-
-GType gst_plugin_template_get_type (void);
-
-G_END_DECLS
-
-#endif /* __GST_PLUGIN_TEMPLATE_H__ */
+#endif
diff --git a/src/gstespeak.c b/src/gstespeak.c
index f3ee79d..811ad25 100644
--- a/src/gstespeak.c
+++ b/src/gstespeak.c
@@ -2,7 +2,7 @@
* GStreamer
* Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
* Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
- * Copyright (C) 2009 <<user@hostname.org>>
+ * Copyright (C) 2009 Aleksey S. Lim <alsroot@member.fsf.org>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -63,50 +63,42 @@
#include <gst/gst.h>
#include "gstespeak.h"
+#include "espeak.h"
GST_DEBUG_CATEGORY_STATIC (gst_espeak_debug);
#define GST_CAT_DEFAULT gst_espeak_debug
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
enum
{
PROP_0,
PROP_SILENT
};
-/* the capabilities of the inputs and outputs.
- *
- * describe the real formats here.
- */
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("ANY")
- );
-
-static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE (
+ "src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS ("ANY")
);
-GST_BOILERPLATE (GstEspeak, gst_espeak, GstElement,
- GST_TYPE_ELEMENT);
+GST_BOILERPLATE (GstEspeak, gst_espeak, GstBaseSrc, GST_TYPE_BASE_SRC);
+
+static GstFlowReturn gst_espeak_src_create (GstBaseSrc*,
+ guint64, guint, GstBuffer**);
+static gboolean gst_espeak_src_start (GstBaseSrc*);
+static gboolean gst_espeak_src_stop (GstBaseSrc*);
+static gboolean gst_espeak_src_is_seekable (GstBaseSrc*);
+static gboolean gst_espeak_src_unlock (GstBaseSrc*);
+static gboolean gst_espeak_src_unlock_stop (GstBaseSrc*);
+static gboolean gst_espeak_src_do_seek (GstBaseSrc*, GstSegment*);
+static gboolean gst_espeak_src_check_get_range (GstBaseSrc*);
+static gboolean gst_espeak_src_do_get_size (GstBaseSrc*, guint64*);
static void gst_espeak_set_property (GObject * object, guint prop_id,
const GValue * value, GParamSpec * pspec);
static void gst_espeak_get_property (GObject * object, guint prop_id,
GValue * value, GParamSpec * pspec);
-static gboolean gst_espeak_set_caps (GstPad * pad, GstCaps * caps);
-static GstFlowReturn gst_espeak_chain (GstPad * pad, GstBuffer * buf);
-
/* GObject vmethod implementations */
static void
@@ -122,19 +114,25 @@ gst_espeak_base_init (gpointer gclass)
gst_element_class_add_pad_template (element_class,
gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
}
/* initialize the espeak's class */
static void
gst_espeak_class_init (GstEspeakClass * klass)
{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
+ GObjectClass *gobject_class = (GObjectClass *) klass;
+ GstBaseSrcClass *basesrc_class = (GstBaseSrcClass *) klass;
+
+ basesrc_class->create = gst_espeak_src_create;
+ basesrc_class->start = gst_espeak_src_start;
+ basesrc_class->stop = gst_espeak_src_stop;
+ basesrc_class->stop = gst_espeak_src_stop;
+ basesrc_class->is_seekable = gst_espeak_src_is_seekable;
+ basesrc_class->unlock = gst_espeak_src_unlock;
+ basesrc_class->unlock_stop = gst_espeak_src_unlock_stop;
+ basesrc_class->do_seek = gst_espeak_src_do_seek;
+ basesrc_class->check_get_range = gst_espeak_src_check_get_range;
+ basesrc_class->get_size = gst_espeak_src_do_get_size;
gobject_class->set_property = gst_espeak_set_property;
gobject_class->get_property = gst_espeak_get_property;
@@ -150,24 +148,10 @@ gst_espeak_class_init (GstEspeakClass * klass)
* initialize instance structure
*/
static void
-gst_espeak_init (GstEspeak * filter,
+gst_espeak_init (GstEspeak * self,
GstEspeakClass * gclass)
{
- filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
- gst_pad_set_setcaps_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_espeak_set_caps));
- gst_pad_set_getcaps_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps));
- gst_pad_set_chain_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_espeak_chain));
-
- filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
- gst_pad_set_getcaps_function (filter->srcpad,
- GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps));
-
- gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
- gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
- filter->silent = FALSE;
+ self->speak = espeak_new();
}
static void
@@ -204,38 +188,6 @@ gst_espeak_get_property (GObject * object, guint prop_id,
/* GstElement vmethod implementations */
-/* this function handles the link with other elements */
-static gboolean
-gst_espeak_set_caps (GstPad * pad, GstCaps * caps)
-{
- GstEspeak *filter;
- GstPad *otherpad;
-
- filter = GST_ESPEAK (gst_pad_get_parent (pad));
- otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad;
- gst_object_unref (filter);
-
- return gst_pad_set_caps (otherpad, caps);
-}
-
-/* chain function
- * this function does the actual processing
- */
-static GstFlowReturn
-gst_espeak_chain (GstPad * pad, GstBuffer * buf)
-{
- GstEspeak *filter;
-
- filter = GST_ESPEAK (GST_OBJECT_PARENT (pad));
-
- if (filter->silent == FALSE)
- g_print ("I'm plugged, therefore I'm in.\n");
-
- /* just push out the incoming buffer without touching it */
- return gst_pad_push (filter->srcpad, buf);
-}
-
-
/* entry point to initialize the plug-in
* initialize the plug-in itself
* register the element factories and other features
@@ -254,6 +206,72 @@ espeak_init (GstPlugin * espeak)
GST_TYPE_ESPEAK);
}
+/******************************************************************************/
+
+static GstFlowReturn
+gst_espeak_src_create (GstBaseSrc * self_, guint64 offset, guint size,
+ GstBuffer ** buf)
+{
+ GstEspeak *self = (GstEspeak*)self_;
+ *buf = gst_buffer_new();
+ GST_BUFFER_DATA (*buf) = espeak_hear(self->speak, offset, &size);
+ GST_BUFFER_SIZE (*buf) = size;
+ return size == 0 ? GST_FLOW_UNEXPECTED : GST_FLOW_OK;
+}
+
+static gboolean
+gst_espeak_src_start (GstBaseSrc * self_)
+{
+ GstEspeak *self = (GstEspeak*)self_;
+ GstState status;
+ gst_element_get_state((GstElement*)self, NULL, &status, 0);
+
+ if (status == GST_STATE_PAUSED)
+ return espeak_say(self->speak, "Aa");
+
+ return TRUE;
+}
+
+static gboolean
+gst_espeak_src_stop (GstBaseSrc * self)
+{
+ return TRUE;
+}
+
+static gboolean
+gst_espeak_src_is_seekable (GstBaseSrc * src)
+{
+ return FALSE;
+}
+
+static gboolean gst_espeak_src_unlock (GstBaseSrc * bsrc)
+{
+ return TRUE;
+}
+
+static gboolean gst_espeak_src_unlock_stop (GstBaseSrc * bsrc)
+{
+ return TRUE;
+}
+
+static gboolean gst_espeak_src_do_seek (GstBaseSrc * src, GstSegment * segment)
+{
+ return TRUE;
+}
+
+static gboolean gst_espeak_src_check_get_range (GstBaseSrc * src)
+{
+ return FALSE;
+}
+
+static gboolean gst_espeak_src_do_get_size (GstBaseSrc * src, guint64 * size)
+{
+ *size = -1;
+ return TRUE;
+}
+
+/******************************************************************************/
+
/* gstreamer looks for this structure to register espeaks
*
* exchange the string 'Template espeak' with your espeak description
diff --git a/src/gstespeak.h b/src/gstespeak.h
index caa7ccc..90d3044 100644
--- a/src/gstespeak.h
+++ b/src/gstespeak.h
@@ -2,7 +2,7 @@
* GStreamer
* Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
* Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
- * Copyright (C) 2009 <<user@hostname.org>>
+ * Copyright (C) 2009 Aleksey S. Lim <alsroot@member.fsf.org>
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -47,6 +47,7 @@
#define __GST_ESPEAK_H__
#include <gst/gst.h>
+#include <gst/audio/gstaudiosrc.h>
G_BEGIN_DECLS
@@ -64,19 +65,18 @@ G_BEGIN_DECLS
typedef struct _GstEspeak GstEspeak;
typedef struct _GstEspeakClass GstEspeakClass;
+struct Espeak;
struct _GstEspeak
{
- GstElement element;
-
- GstPad *sinkpad, *srcpad;
-
+ GstAudioSrc parent;
+ struct Espeak *speak;
gboolean silent;
};
struct _GstEspeakClass
{
- GstElementClass parent_class;
+ GstAudioSrcClass parent_class;
};
GType gst_espeak_get_type (void);
diff --git a/src/gstplugin.c b/src/gstplugin.c
deleted file mode 100644
index 443890a..0000000
--- a/src/gstplugin.c
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
- * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
- * Copyright (C) YEAR AUTHOR_NAME AUTHOR_EMAIL
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included in
- * all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Alternatively, the contents of this file may be used under the
- * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
- * which case the following provisions apply instead of the ones
- * mentioned above:
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
- */
-
-/**
- * SECTION:element-plugin
- *
- * FIXME:Describe plugin here.
- *
- * <refsect2>
- * <title>Example launch line</title>
- * |[
- * gst-launch -v -m fakesrc ! plugin ! fakesink silent=TRUE
- * ]|
- * </refsect2>
- */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <gst/gst.h>
-
-#include "gstplugin.h"
-
-GST_DEBUG_CATEGORY_STATIC (gst_plugin_template_debug);
-#define GST_CAT_DEFAULT gst_plugin_template_debug
-
-/* Filter signals and args */
-enum
-{
- /* FILL ME */
- LAST_SIGNAL
-};
-
-enum
-{
- PROP_0,
- PROP_SILENT
-};
-
-/* the capabilities of the inputs and outputs.
- *
- * describe the real formats here.
- */
-static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
- GST_PAD_SINK,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("ANY")
- );
-
-static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
- GST_PAD_SRC,
- GST_PAD_ALWAYS,
- GST_STATIC_CAPS ("ANY")
- );
-
-GST_BOILERPLATE (GstPluginTemplate, gst_plugin_template, GstElement,
- GST_TYPE_ELEMENT);
-
-static void gst_plugin_template_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec);
-static void gst_plugin_template_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec);
-
-static gboolean gst_plugin_template_set_caps (GstPad * pad, GstCaps * caps);
-static GstFlowReturn gst_plugin_template_chain (GstPad * pad, GstBuffer * buf);
-
-/* GObject vmethod implementations */
-
-static void
-gst_plugin_template_base_init (gpointer gclass)
-{
- GstElementClass *element_class = GST_ELEMENT_CLASS (gclass);
-
- gst_element_class_set_details_simple(element_class,
- "Plugin",
- "FIXME:Generic",
- "FIXME:Generic Template Element",
- "AUTHOR_NAME AUTHOR_EMAIL");
-
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&src_factory));
- gst_element_class_add_pad_template (element_class,
- gst_static_pad_template_get (&sink_factory));
-}
-
-/* initialize the plugin's class */
-static void
-gst_plugin_template_class_init (GstPluginTemplateClass * klass)
-{
- GObjectClass *gobject_class;
- GstElementClass *gstelement_class;
-
- gobject_class = (GObjectClass *) klass;
- gstelement_class = (GstElementClass *) klass;
-
- gobject_class->set_property = gst_plugin_template_set_property;
- gobject_class->get_property = gst_plugin_template_get_property;
-
- g_object_class_install_property (gobject_class, PROP_SILENT,
- g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?",
- FALSE, G_PARAM_READWRITE));
-}
-
-/* initialize the new element
- * instantiate pads and add them to element
- * set pad calback functions
- * initialize instance structure
- */
-static void
-gst_plugin_template_init (GstPluginTemplate * filter,
- GstPluginTemplateClass * gclass)
-{
- filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
- gst_pad_set_setcaps_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_plugin_template_set_caps));
- gst_pad_set_getcaps_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps));
- gst_pad_set_chain_function (filter->sinkpad,
- GST_DEBUG_FUNCPTR(gst_plugin_template_chain));
-
- filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
- gst_pad_set_getcaps_function (filter->srcpad,
- GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps));
-
- gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
- gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
- filter->silent = FALSE;
-}
-
-static void
-gst_plugin_template_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstPluginTemplate *filter = GST_PLUGIN_TEMPLATE (object);
-
- switch (prop_id) {
- case PROP_SILENT:
- filter->silent = g_value_get_boolean (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_plugin_template_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstPluginTemplate *filter = GST_PLUGIN_TEMPLATE (object);
-
- switch (prop_id) {
- case PROP_SILENT:
- g_value_set_boolean (value, filter->silent);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-/* GstElement vmethod implementations */
-
-/* this function handles the link with other elements */
-static gboolean
-gst_plugin_template_set_caps (GstPad * pad, GstCaps * caps)
-{
- GstPluginTemplate *filter;
- GstPad *otherpad;
-
- filter = GST_PLUGIN_TEMPLATE (gst_pad_get_parent (pad));
- otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad;
- gst_object_unref (filter);
-
- return gst_pad_set_caps (otherpad, caps);
-}
-
-/* chain function
- * this function does the actual processing
- */
-static GstFlowReturn
-gst_plugin_template_chain (GstPad * pad, GstBuffer * buf)
-{
- GstPluginTemplate *filter;
-
- filter = GST_PLUGIN_TEMPLATE (GST_OBJECT_PARENT (pad));
-
- if (filter->silent == FALSE)
- g_print ("I'm plugged, therefore I'm in.\n");
-
- /* just push out the incoming buffer without touching it */
- return gst_pad_push (filter->srcpad, buf);
-}
-
-
-/* entry point to initialize the plug-in
- * initialize the plug-in itself
- * register the element factories and other features
- */
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
- /* debug category for fltering log messages
- *
- * exchange the string 'Template plugin' with your description
- */
- GST_DEBUG_CATEGORY_INIT (gst_plugin_template_debug, "plugin",
- 0, "Template plugin");
-
- return gst_element_register (plugin, "plugin", GST_RANK_NONE,
- GST_TYPE_PLUGIN_TEMPLATE);
-}
-
-/* gstreamer looks for this structure to register plugins
- *
- * exchange the string 'Template plugin' with your plugin description
- */
-GST_PLUGIN_DEFINE (
- GST_VERSION_MAJOR,
- GST_VERSION_MINOR,
- "plugin",
- "Template plugin",
- plugin_init,
- VERSION,
- "LGPL",
- "GStreamer",
- "http://gstreamer.net/"
-)