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 06:43:17 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-02-05 06:43:17 (GMT)
commit8647d1d6964f2fb5c7c57c80984859292b1196f1 (patch)
treea5c05de7b26ecb93e13267b05f582e8d2cc42282
parente229ac4e514e5ab454d3008467c4220a8819e9dd (diff)
Say Aaa.
-rw-r--r--.gitignore14
-rw-r--r--INSTALL291
-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
-rwxr-xr-xtools/make_element80
9 files changed, 572 insertions, 498 deletions
diff --git a/.gitignore b/.gitignore
index 0e9b070..27f857a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,5 +5,19 @@ config.log
config.status
configure
libtool
+stamp-h1
+*.la
+config.h
+*.in
+Makefile
+config.guess
+config.sub
+depcomp
+ltmain.sh
+install-sh
+missing
+.deps
+.libs
+*.lo
gst-plugin-*.tar.*
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..8b82ade
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,291 @@
+Installation Instructions
+*************************
+
+Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
+2006, 2007, 2008 Free Software Foundation, Inc.
+
+ This file is free documentation; the Free Software Foundation gives
+unlimited permission to copy, distribute and modify it.
+
+Basic Installation
+==================
+
+ Briefly, the shell commands `./configure; make; make install' should
+configure, build, and install this package. The following
+more-detailed instructions are generic; see the `README' file for
+instructions specific to this package.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, and a
+file `config.log' containing compiler output (useful mainly for
+debugging `configure').
+
+ It can also use an optional file (typically called `config.cache'
+and enabled with `--cache-file=config.cache' or simply `-C') that saves
+the results of its tests to speed up reconfiguring. Caching is
+disabled by default to prevent problems with accidental use of stale
+cache files.
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If you are using the cache, and at
+some point `config.cache' contains results you don't want to keep, you
+may remove or edit it.
+
+ The file `configure.ac' (or `configure.in') is used to create
+`configure' by a program called `autoconf'. You need `configure.ac' if
+you want to change it or regenerate `configure' using a newer version
+of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system.
+
+ Running `configure' might take a while. While running, it prints
+ some messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Optionally, type `make check' to run any self-tests that come with
+ the package.
+
+ 4. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 5. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'. To also remove the
+ files that `configure' created (so you can compile the package for
+ a different kind of computer), type `make distclean'. There is
+ also a `make maintainer-clean' target, but that is intended mainly
+ for the package's developers. If you use it, you may have to get
+ all sorts of other programs in order to regenerate files that came
+ with the distribution.
+
+ 6. Often, you can also type `make uninstall' to remove the installed
+ files again.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. Run `./configure --help'
+for details on some of the pertinent environment variables.
+
+ You can give `configure' initial values for configuration parameters
+by setting variables in the command line or in the environment. Here
+is an example:
+
+ ./configure CC=c99 CFLAGS=-g LIBS=-lposix
+
+ *Note Defining Variables::, for more details.
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you can use GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ With a non-GNU `make', it is safer to compile the package for one
+architecture at a time in the source code directory. After you have
+installed the package for one architecture, use `make distclean' before
+reconfiguring for another architecture.
+
+ On MacOS X 10.5 and later systems, you can create libraries and
+executables that work on multiple system types--known as "fat" or
+"universal" binaries--by specifying multiple `-arch' options to the
+compiler but only a single `-arch' option to the preprocessor. Like
+this:
+
+ ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
+ CPP="gcc -E" CXXCPP="g++ -E"
+
+ This is not guaranteed to produce working output in all cases, you
+may have to build one architecture at a time and combine the results
+using the `lipo' tool if you have problems.
+
+Installation Names
+==================
+
+ By default, `make install' installs the package's commands under
+`/usr/local/bin', include files under `/usr/local/include', etc. You
+can specify an installation prefix other than `/usr/local' by giving
+`configure' the option `--prefix=PREFIX'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+pass the option `--exec-prefix=PREFIX' to `configure', the package uses
+PREFIX as the prefix for installing programs and libraries.
+Documentation and other data files still use the regular prefix.
+
+ In addition, if you use an unusual directory layout you can give
+options like `--bindir=DIR' to specify different values for particular
+kinds of files. Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Particular systems
+==================
+
+ On HP-UX, the default C compiler is not ANSI C compatible. If GNU
+CC is not installed, it is recommended to use the following options in
+order to use an ANSI C compiler:
+
+ ./configure CC="cc -Ae"
+
+and if that doesn't work, install pre-built binaries of GCC for HP-UX.
+
+ On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
+parse its `<wchar.h>' header file. The option `-nodtk' can be used as
+a workaround. If GNU CC is not installed, it is therefore recommended
+to try
+
+ ./configure CC="cc"
+
+and if that doesn't work, try
+
+ ./configure CC="cc -nodtk"
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' cannot figure out
+automatically, but needs to determine by the type of machine the package
+will run on. Usually, assuming the package is built to be run on the
+_same_ architectures, `configure' can figure that out, but if it prints
+a message saying it cannot guess the machine type, give it the
+`--build=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name which has the form:
+
+ CPU-COMPANY-SYSTEM
+
+where SYSTEM can have one of these forms:
+
+ OS KERNEL-OS
+
+ See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the machine type.
+
+ If you are _building_ compiler tools for cross-compiling, you should
+use the option `--target=TYPE' to select the type of system they will
+produce code for.
+
+ If you want to _use_ a cross compiler, that generates code for a
+platform different from the build platform, you should specify the
+"host" platform (i.e., that on which the generated programs will
+eventually be run) with `--host=TYPE'.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Defining Variables
+==================
+
+ Variables not defined in a site shell script can be set in the
+environment passed to `configure'. However, some packages may run
+configure again during the build, and the customized values of these
+variables may be lost. In order to avoid this problem, you should set
+them in the `configure' command line, using `VAR=value'. For example:
+
+ ./configure CC=/usr/local2/bin/gcc
+
+causes the specified `gcc' to be used as the C compiler (unless it is
+overridden in the site shell script).
+
+Unfortunately, this technique does not work for `CONFIG_SHELL' due to
+an Autoconf bug. Until the bug is fixed you can use this workaround:
+
+ CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
+
+`configure' Invocation
+======================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--help'
+`-h'
+ Print a summary of all of the options to `configure', and exit.
+
+`--help=short'
+`--help=recursive'
+ Print a summary of the options unique to this package's
+ `configure', and exit. The `short' variant lists options used
+ only in the top level, while the `recursive' variant lists options
+ also present in any nested packages.
+
+`--version'
+`-V'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`--cache-file=FILE'
+ Enable the cache: use and save the results of the tests in FILE,
+ traditionally `config.cache'. FILE defaults to `/dev/null' to
+ disable caching.
+
+`--config-cache'
+`-C'
+ Alias for `--cache-file=config.cache'.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made. To
+ suppress all normal output, redirect it to `/dev/null' (any error
+ messages will still be shown).
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--prefix=DIR'
+ Use DIR as the installation prefix. *Note Installation Names::
+ for more details, including other options available for fine-tuning
+ the installation locations.
+
+`--no-create'
+`-n'
+ Run the configure checks, but stop before creating any output
+ files.
+
+`configure' also accepts some other, not widely useful, options. Run
+`configure --help' for more details.
+
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/"
-)
diff --git a/tools/make_element b/tools/make_element
deleted file mode 100755
index af59cb4..0000000
--- a/tools/make_element
+++ /dev/null
@@ -1,80 +0,0 @@
-#!/bin/sh
-
-Template=$1;
-srcfile=$2.c;
-srcfile_h=$2.h;
-
-if test x"$1" = x ; then
- echo "$0 Objectname [srcfile]\n";
- echo " creates gstobjectname.{c,h} implementing GstObjectname\n";
- exit 1;
-fi
-
-if test x"$2" = x ; then
- srcfile="gstplugin.c"
- srcfile_h="gstplugin.h"
-fi
-
-id=$(echo '$Id: make_element,v 1.8 2008-10-30 08:42:21 ensonic Exp $' | sed \
- -e 's/\$I[d]: \([^$]*\)\$/\1/g' \
- )
-
-TEMPLATE=$(echo $Template | tr a-z A-Z)
-template=$(echo $Template | tr A-Z a-z)
-filename=$(echo $template | tr -d _)
-Template=$(echo $Template | tr -d _)
-template_=$(echo $Template | sed "s/\([a-z]\)\([A-Z]\)/\1_\2/g" | tr A-Z a-z)
-
-YEAR=`date "+%Y"`
-if [ -z "$REAL_NAME" ]; then
- user=`id -u`
- if [ `which 2>/dev/null getent` ]; then
- entry=`getent passwd $user`
- else
- entry=`grep $user /etc/passwd`
- fi
- REAL_NAME=`echo $entry | awk -F":" '{ print $5 }' | awk -F"," '{ print $1 }'`
-fi
-if [ -z "$EMAIL_ADDRESS" ]; then
- EMAIL_ADDRESS="<user@hostname.org>"
-fi
-
-# remember to break up the Id: in the line below
-sed \
- -e 's/gstplugin\.c/SOURCEFILE/g' \
- -e "s/gstplugin\.h/gst$filename.h/g" \
- -e "s/GstPluginTemplate/Gst$Template/g" \
- -e "s/gst_plugin_template/gst_$template_/g" \
- -e "s/gst_type_plugin_template/gst_$template_/g" \
- -e "s/GST_PLUGIN_TEMPLATE/GST_$TEMPLATE/g" \
- -e "s/GST_TYPE_PLUGIN_TEMPLATE/GST_TYPE_$TEMPLATE/g" \
- -e 's/\$I[d]: \([^$]*\)\$/\1/g' \
- -e 's/SOURCEFILE/gstobject\.c/g' \
- -e "s%MAKEFILTERVERSION%$id%g" \
- -e "s/plugin/$template/g" \
- -e "s/\([^G][^s][^t]\)Plugin/\1$Template/g" \
- -e "s/YEAR/$YEAR/g" \
- -e "s/AUTHOR_NAME/$REAL_NAME/g" \
- -e "s/AUTHOR_EMAIL/<$EMAIL_ADDRESS>/g" \
- $srcfile >gst$filename.c.tmp && mv gst$filename.c.tmp gst$filename.c
-
-if [ -e $srcfile_h ]; then
- sed \
- -e 's/gstplugin\.c/SOURCEFILE/g' \
- -e "s/GstPluginTemplate/Gst$Template/g" \
- -e "s/gst_plugin_template/gst_$template_/g" \
- -e "s/gst_type_plugin_template/gst_$template_/g" \
- -e "s/GST_PLUGIN_TEMPLATE/GST_$TEMPLATE/g" \
- -e "s/GST_TYPE_PLUGIN_TEMPLATE/GST_TYPE_$TEMPLATE/g" \
- -e "s/GST_IS_PLUGIN_TEMPLATE/GST_IS_$TEMPLATE/g" \
- -e 's/\$I[d]: \([^$]*\)\$/\1/g' \
- -e 's/SOURCEFILE/gstobject\.c/g' \
- -e "s%MAKEFILTERVERSION%$id%g" \
- -e "s/plugin/$template/g" \
- -e "s/\([^G][^s][^t]\)Plugin/\1$Template/g" \
- -e "s/YEAR/$YEAR/g" \
- -e "s/AUTHOR_NAME/$REAL_NAME/g" \
- -e "s/AUTHOR_EMAIL/<$EMAIL_ADDRESS>/g" \
- $srcfile_h >gst$filename.h.tmp && mv gst$filename.h.tmp gst$filename.h
-fi
-