summaryrefslogtreecommitdiffstats
path: root/kttsd/players/gstplayer
diff options
context:
space:
mode:
Diffstat (limited to 'kttsd/players/gstplayer')
-rw-r--r--kttsd/players/gstplayer/Makefile.am30
-rw-r--r--kttsd/players/gstplayer/gstplugin.cpp29
-rw-r--r--kttsd/players/gstplayer/gstreamerplayer.cpp258
-rw-r--r--kttsd/players/gstplayer/gstreamerplayer.h76
-rw-r--r--kttsd/players/gstplayer/kttsd_gstplugin.desktop92
5 files changed, 485 insertions, 0 deletions
diff --git a/kttsd/players/gstplayer/Makefile.am b/kttsd/players/gstplayer/Makefile.am
new file mode 100644
index 0000000..df00c55
--- /dev/null
+++ b/kttsd/players/gstplayer/Makefile.am
@@ -0,0 +1,30 @@
+# Include paths. INCLUDES is maintained by KDevelop, AM_CPPFLAGS is the preferred variable,
+# so keep them synchronized.
+INCLUDES = \
+ $(GST_CFLAGS) \
+ -I$(top_srcdir)/kttsd/libkttsd -I$(top_builddir)/kttsd/libkttsd \
+ $(all_includes)
+
+# Let automoc handle all of the metsource files (moc).
+METASOURCES = AUTO
+
+#########################################################################
+# LIBRARY SECTION
+#########################################################################
+# This is the library that gets installed. It's name is used for all
+# of the other Makefile.am variables.
+kde_module_LTLIBRARIES = libkttsd_gstplugin.la
+
+libkttsd_gstplugin_la_SOURCES = \
+ gstplugin.cpp \
+ gstreamerplayer.cpp
+libkttsd_gstplugin_la_LDFLAGS = $(KDE_PLUGIN) $(all_libraries) $(LDFLAGS_GST) -no-undefined
+libkttsd_gstplugin_la_LIBADD = $(top_builddir)/kttsd/libkttsd/libkttsd.la $(LDADD_GST)
+
+# Header files that should not be installed.
+noinst_HEADERS = \
+ gstreamerplayer.h
+
+# This library is installed as a plugin.
+services_DATA = kttsd_gstplugin.desktop
+servicesdir = $(kde_servicesdir)
diff --git a/kttsd/players/gstplayer/gstplugin.cpp b/kttsd/players/gstplayer/gstplugin.cpp
new file mode 100644
index 0000000..633bff9
--- /dev/null
+++ b/kttsd/players/gstplayer/gstplugin.cpp
@@ -0,0 +1,29 @@
+/***************************************************** vim:set ts=4 sw=4 sts=4:
+ Generating the factories so that GStreamer can be used as and audio plug in.
+ -------------------
+ Copyright:
+ (C) 2004 by Gary Cramblitt <garycramblitt@comcast.net>
+ -------------------
+ Original author: Gary Cramblitt <garycramblitt@comcast.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ ******************************************************************************/
+
+#include <kgenericfactory.h>
+
+#include "gstreamerplayer.h"
+
+K_EXPORT_COMPONENT_FACTORY( libkttsd_gstplugin, KGenericFactory<GStreamerPlayer>("kttsd_gst") );
+
diff --git a/kttsd/players/gstplayer/gstreamerplayer.cpp b/kttsd/players/gstplayer/gstreamerplayer.cpp
new file mode 100644
index 0000000..64aa1c4
--- /dev/null
+++ b/kttsd/players/gstplayer/gstreamerplayer.cpp
@@ -0,0 +1,258 @@
+/***************************************************************************
+ copyright : (C) 2004 Scott Wheeler
+ email : wheeler@kde.org
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+// Qt includes.
+#include <qfile.h>
+
+// KDE includes.
+#include <kapplication.h>
+#include <kconfig.h>
+#include <kglobal.h>
+#include <kdebug.h>
+
+// GStreamerPlayer includes.
+#include "gstreamerplayer.h"
+#include "gstreamerplayer.moc"
+
+////////////////////////////////////////////////////////////////////////////////
+// public methods
+////////////////////////////////////////////////////////////////////////////////
+
+GStreamerPlayer::GStreamerPlayer(QObject* parent, const char* name, const QStringList& args) :
+ Player(parent, name, args),
+ m_initialized(false),
+ m_pipeline(0),
+ m_source(0),
+ m_decoder(0),
+ m_volume(0),
+ m_sink(0)
+{
+ // readConfig();
+ setupPipeline();
+}
+
+GStreamerPlayer::~GStreamerPlayer()
+{
+ stop();
+ gst_object_unref(GST_OBJECT(m_pipeline));
+}
+
+//void GStreamerPlayer::play(const FileHandle &file)
+void GStreamerPlayer::startPlay(const QString &file)
+{
+ if(!file.isNull()) {
+ stop();
+ // g_object_set(G_OBJECT(m_source), "location", file.absFilePath().local8Bit().data(), 0);
+ g_object_set(G_OBJECT(m_source),"location",file.local8Bit().data(),NULL);
+ }
+
+ gst_element_set_state(m_pipeline, GST_STATE_PLAYING);
+}
+
+void GStreamerPlayer::pause()
+{
+ gst_element_set_state(m_pipeline, GST_STATE_PAUSED);
+}
+
+void GStreamerPlayer::stop()
+{
+ gst_element_set_state(m_pipeline, GST_STATE_NULL);
+}
+
+void GStreamerPlayer::setVolume(float volume)
+{
+ g_object_set(G_OBJECT(m_volume), "volume", volume, NULL);
+}
+
+float GStreamerPlayer::volume() const
+{
+ gfloat value;
+ g_object_get(G_OBJECT(m_volume), "volume", &value, NULL);
+ return value;
+}
+
+bool GStreamerPlayer::playing() const
+{
+ return gst_element_get_state(m_pipeline) == GST_STATE_PLAYING;
+}
+
+bool GStreamerPlayer::paused() const
+{
+ return gst_element_get_state(m_pipeline) == GST_STATE_PAUSED;
+}
+
+int GStreamerPlayer::totalTime() const
+{
+ return time(GST_QUERY_TOTAL) / GST_SECOND;
+}
+
+int GStreamerPlayer::currentTime() const
+{
+ return time(GST_QUERY_POSITION) / GST_SECOND;
+}
+
+int GStreamerPlayer::position() const
+{
+ long long total = time(GST_QUERY_TOTAL);
+ long long current = time(GST_QUERY_POSITION);
+ return total > 0 ? int((double(current) / double(total)) * double(1000) + 0.5) : 0;
+}
+
+void GStreamerPlayer::seek(int seekTime)
+{
+ int type = (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH);
+ gst_element_seek(m_sink, GstSeekType(type), seekTime * GST_SECOND);
+}
+
+void GStreamerPlayer::seekPosition(int position)
+{
+ long long total = time(GST_QUERY_TOTAL);
+ if(total > 0)
+ seek(int(double(position) / double(1000) * double(totalTime()) + 0.5));
+}
+
+/**
+ * Returns a list of GStreamer plugins of the specified class.
+ * @param classname Desired class. Use "Sink/Audio" for sinks.
+ * @return List of plugin names.
+ */
+QStringList GStreamerPlayer::getPluginList( const QCString& classname )
+{
+ GList * pool_registries = NULL;
+ GList* registries = NULL;
+ GList* plugins = NULL;
+ GList* features = NULL;
+ QString name;
+ QStringList results;
+
+ if(!m_initialized) {
+ int argc = kapp->argc();
+ char **argv = kapp->argv();
+ gst_init(&argc, &argv);
+ m_initialized = true;
+ }
+
+ pool_registries = gst_registry_pool_list ();
+ registries = pool_registries;
+
+ while ( registries ) {
+ GstRegistry * registry = GST_REGISTRY ( registries->data );
+ plugins = registry->plugins;
+
+ while ( plugins ) {
+ GstPlugin * plugin = GST_PLUGIN ( plugins->data );
+ features = gst_plugin_get_feature_list ( plugin );
+
+ while ( features ) {
+ GstPluginFeature * feature = GST_PLUGIN_FEATURE ( features->data );
+
+ if ( GST_IS_ELEMENT_FACTORY ( feature ) ) {
+ GstElementFactory * factory = GST_ELEMENT_FACTORY ( feature );
+
+ if ( g_strrstr ( factory->details.klass, classname ) ) {
+ name = g_strdup ( GST_OBJECT_NAME ( factory ) );
+ if ( name != "artsdsink" ) results << name;
+ }
+ }
+ features = g_list_next ( features );
+ }
+ plugins = g_list_next ( plugins );
+ }
+ registries = g_list_next ( registries );
+ }
+ g_list_free ( pool_registries );
+ pool_registries = NULL;
+
+ return results;
+}
+
+bool GStreamerPlayer::requireVersion(uint major, uint minor, uint micro)
+{
+ guint gmajor, gminor, gmicro;
+
+ if(!m_initialized) {
+ int argc = kapp->argc();
+ char **argv = kapp->argv();
+ gst_init(&argc, &argv);
+ m_initialized = true;
+ }
+
+ gst_version(&gmajor, &gminor, &gmicro);
+ // kdDebug() << QString("GStreamerPlayer::requireVersion: You have gstreamer %1.%2.%3 installed.").arg(gmajor).arg(gminor).arg(gmicro) << endl;
+ if (gmajor > major) return true;
+ if (gminor > minor) return true;
+ if (gmicro >= micro) return true;
+ kdDebug() << QString("GStreamerPlayer::requireVersion: You have gstreamer %1.%2.%3 installed.").arg(gmajor).arg(gminor).arg(gmicro) << endl;
+ kdDebug() << QString("GStreamerPlayer::requireVersion: This application requires %1.%2.%3 or greater.").arg(major).arg(minor).arg(micro) << endl;
+ return false;
+}
+
+void GStreamerPlayer::setSinkName(const QString &sinkName) { m_sinkName = sinkName; }
+
+////////////////////////////////////////////////////////////////////////////////
+// private methods
+////////////////////////////////////////////////////////////////////////////////
+
+void GStreamerPlayer::readConfig()
+{
+ KConfigGroup config(KGlobal::config(), "GStreamerPlayer");
+ m_sinkName = config.readEntry("SinkName", QString::null);
+}
+
+void GStreamerPlayer::setupPipeline()
+{
+ if(!m_initialized) {
+ int argc = kapp->argc();
+ char **argv = kapp->argv();
+ gst_init(&argc, &argv);
+ m_initialized = true;
+ }
+
+ m_pipeline = gst_thread_new("pipeline");
+ m_source = gst_element_factory_make("filesrc", "source");
+ m_decoder = gst_element_factory_make("spider", "decoder");
+ m_volume = gst_element_factory_make("volume", "volume");
+
+ if(!m_sinkName.isNull())
+ m_sink = gst_element_factory_make(m_sinkName.utf8().data(), "sink");
+ if (!m_sink)
+ {
+ // m_sink = gst_element_factory_make("alsasink", "sink");
+ // if(!m_sink)
+ // m_sink = gst_element_factory_make("osssink", "sink");
+
+ // Reversing order. OSS seems to work. Alsa sink produces ugly echo of last
+ // couple of words in each wav file. argh!
+ // kdDebug() << "GStreamerPlayer::setupPipeline: trying oss sink." << endl;
+ m_sink = gst_element_factory_make("osssink", "sink");
+ if(!m_sink)
+ {
+ // kdDebug() << "GStreamerPlayer::setupPipeline: reverting to alsa sink." << endl;
+ m_sink = gst_element_factory_make("alsasink", "sink");
+ }
+ }
+
+ gst_bin_add_many(GST_BIN(m_pipeline), m_source, m_decoder, m_volume, m_sink, 0);
+ gst_element_link_many(m_source, m_decoder, m_volume, m_sink, 0);
+}
+
+long long GStreamerPlayer::time(GstQueryType type) const
+{
+ gint64 ns = 0;
+ GstFormat format = GST_FORMAT_TIME;
+ gst_element_query(m_sink, type, &format, &ns);
+ return ns;
+}
+
+// vim: set et sw=4:
diff --git a/kttsd/players/gstplayer/gstreamerplayer.h b/kttsd/players/gstplayer/gstreamerplayer.h
new file mode 100644
index 0000000..6a7f1d6
--- /dev/null
+++ b/kttsd/players/gstplayer/gstreamerplayer.h
@@ -0,0 +1,76 @@
+/***************************************************************************
+ copyright : (C) 2004 Scott Wheeler
+ email : wheeler@kde.org
+***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#ifndef GSTREAMERPLAYER_H
+#define GSTREAMERPLAYER_H
+
+#include "config.h"
+
+#include <glib.h>
+extern "C" {
+#include <gst/gstversion.h>
+}
+#include <gst/gst.h>
+#include <qstring.h>
+#include "player.h"
+
+class GStreamerPlayer : public Player
+{
+ Q_OBJECT
+
+public:
+ GStreamerPlayer(QObject* parent = 0, const char* name = 0, const QStringList& args=QStringList());
+ virtual ~GStreamerPlayer();
+
+ // virtual void play(const FileHandle &file = FileHandle::null());
+ virtual void startPlay(const QString& file);
+
+ virtual void setVolume(float volume = 1.0);
+ virtual float volume() const;
+
+ virtual bool playing() const;
+ virtual bool paused() const;
+
+ virtual int totalTime() const;
+ virtual int currentTime() const;
+ virtual int position() const; // in this case not really the percent
+
+ virtual void seek(int seekTime);
+ virtual void seekPosition(int position);
+
+ virtual QStringList getPluginList( const QCString& classname );
+ virtual void setSinkName(const QString &sinkName);
+
+ virtual bool requireVersion(uint major, uint minor, uint micro);
+
+ void pause();
+ void stop();
+
+private:
+ void readConfig();
+ void setupPipeline();
+ long long time(GstQueryType type) const;
+
+ QString m_sinkName;
+ // True once gst_init() has been called.
+ bool m_initialized;
+
+ GstElement *m_pipeline;
+ GstElement *m_source;
+ GstElement *m_decoder;
+ GstElement *m_volume;
+ GstElement *m_sink;
+};
+
+#endif
diff --git a/kttsd/players/gstplayer/kttsd_gstplugin.desktop b/kttsd/players/gstplayer/kttsd_gstplugin.desktop
new file mode 100644
index 0000000..7646cee
--- /dev/null
+++ b/kttsd/players/gstplayer/kttsd_gstplugin.desktop
@@ -0,0 +1,92 @@
+[Desktop Entry]
+Name=KTTSD GStreamer Plugin
+Name[br]=Lugent KTTSD GStreamer
+Name[bs]=KTTSD GStreamer dodatak
+Name[ca]=Connector GStreamer pel KTTSD
+Name[cs]=KTTSD GStreamer modul
+Name[da]=KTTSD GStreamer-plugin
+Name[de]=KTTSD GStreamer-Modul
+Name[el]=KTTSD πρόσθετο GStreamer
+Name[es]=Complemento KTTSD GStreamer
+Name[et]=KTTSD GStreameri plugin
+Name[eu]=KTTSD-ren GStreamer plugina
+Name[fa]=وصلۀ KTTSD GStreamer
+Name[fi]=KTTSD GStreamer-liitännäinen
+Name[fr]=Module GStreamer pour KTTSD
+Name[ga]=Breiseán KTTSD GStreamer
+Name[gl]=Plugin GStreamer de KTTSD
+Name[hu]=KTTSD GStreamer-modul
+Name[is]=KTTSD GStreamer íforrit
+Name[it]=Plugin per GStreamer di KTTSD
+Name[ja]=KTTSD GStreamer プラグイン
+Name[ka]=KTTSD GStreamer მოდული
+Name[km]= កម្មវិធី​ជំនួយ GStreamer សម្រាប់ KTTSD
+Name[mk]=GStreamer-приклучок за KTTSD
+Name[ms]=Plugin KTTSD GStreamer
+Name[nb]=GStreamer programtillegg for KTTSD
+Name[nds]=GStreamer-Moduul för KTTSD
+Name[ne]=KTTSD जि स्ट्रिमर प्लगइन
+Name[nl]=KTTSD GStreamer-plugin
+Name[pa]=KTTSD ਜੀਸਟਰੀਮਰ ਪਲੱਗਿੰਨ
+Name[pl]=Wtyczka GStreamer KTTSD
+Name[pt]='Plugin' GStreamer do KTTSD
+Name[pt_BR]=Plug-in do GStreamer para o KTTSD
+Name[ru]=Модуль GStreamer для KTTSD
+Name[sk]=Modul KTTSD GStreamer
+Name[sl]=Vstavek KTTSD za GStreamer
+Name[sr]=GStreamer као прикључак за KTTSD
+Name[sr@Latn]=GStreamer kao priključak za KTTSD
+Name[sv]=KTTSD-insticksprogram för Gstreamer
+Name[ta]=KTTSD GStreamer சொருகுப்பொருள்
+Name[tg]=Модули GStreamer барои KTTSD
+Name[tr]=KTTSD GStreamer Eklentisi
+Name[uk]=Втулок GStreamer для KTTSD
+Name[vi]=Trình bổ sung KTTSD GStreamer
+Name[zh_TW]=KTTSd GStreamer 外掛程式
+Comment=KTTSD GStreamer audio plugin
+Comment[bg]=Аудио приставка на KTTSD за GStreamer
+Comment[br]=Lugent klevet GStreamer evit KTTSD
+Comment[ca]=Connector d'àudio GStreamer pel KTTSD
+Comment[cs]=KTTSD GStreamer zvukový modul
+Comment[da]=KTTSD GStreamer lyd-plugin
+Comment[de]=KTTSD GStreamer Audio-Modul
+Comment[el]=KTTSD πρόσθετο ήχου GStreamer
+Comment[es]=Complemento de audio KTTSD GStreamer
+Comment[et]=KTTSD GStreameri audioplugin
+Comment[eu]=KTTSD-ren GStreamer audio-plugina
+Comment[fa]=وصلۀ صوتی KTTSD GStreamer
+Comment[fi]=KTTSD GStreamer ääniliitännäinen
+Comment[fr]=Module audio GStreamer pour KTTSD
+Comment[ga]=Breiseán fuaime GStreamer KTTSD
+Comment[gl]=Plugin de áudio GStreamer para KTTSD
+Comment[hu]=KTTSD hangmodul a GStreamerhez
+Comment[is]=KTTSD GStreamer hljóð íforrit
+Comment[it]=Plugin audio per GStreamer di KTTSD
+Comment[ja]=KTTSD GStreamer オーディオプラグイン
+Comment[ka]=KTTSD GStreamer აუდიო მოდული
+Comment[km]=កម្មវិធី​ជំនួយអូឌីយ៉ូ​ GStreamer សម្រាប់ KTTSD
+Comment[mk]=GStreamer-аудиоприклучок за KTTSD
+Comment[ms]=Plugin audio KTTSD GStreamer
+Comment[nb]=GStreamer lyd-programtillegg for KTTSD
+Comment[nds]=GStreamer-Audiomoduul för KTTSD
+Comment[ne]=KTTSD जि स्ट्रिमर अडियो प्लगइन
+Comment[nl]=KTTSD GStreamer-audioplugin
+Comment[pa]=KTTSD ਜੀਸਟਰੀਮਰ ਆਡੀਓ ਪਲੱਗਿੰਨ
+Comment[pl]=Wtyczka dźwięku GStreamer dla KTTSD
+Comment[pt]='Plugin' áudio GStreamer do KTTSD
+Comment[pt_BR]=Plug-in de áudio do GStreamer para o KTTSD
+Comment[ru]=Модуль вывода звука KTTSD через GStreamer
+Comment[sk]=Modul KTTSD GStreamer audio
+Comment[sl]=Vstavek KTTSD za zvok v GStreamer
+Comment[sr]=GStreamer као аудио прикључак за KTTSD
+Comment[sr@Latn]=GStreamer kao audio priključak za KTTSD
+Comment[sv]=KTTSD-ljudinsticksprogram för Gstreamer
+Comment[ta]=KTTSD GStreamer கேட்பொலி சொருகுப்பொருள்
+Comment[tg]=Модули барориши овози KTTSD ба воситаи GStreamer
+Comment[tr]= KTTSD GStreamer ses eklentisi
+Comment[uk]=Звуковий втулок GStreamer для KTTSD
+Comment[vi]=Trình bổ sung âm thanh KTTSD GStreamer
+Comment[zh_TW]=KTTSd GStreamer 語音外掛程式
+Type=Service
+ServiceTypes=KTTSD/AudioPlugin
+X-KDE-Library=libkttsd_gstplugin