1
/***************************************************************************
2
copyright : (C) 2004 Scott Wheeler
3
email : wheeler@kde.org
4
***************************************************************************/
6
/***************************************************************************
8
* This program is free software; you can redistribute it and/or modify *
9
* it under the terms of the GNU General Public License as published by *
10
* the Free Software Foundation; either version 2 of the License, or *
11
* (at your option) any later version. *
13
***************************************************************************/
15
#include "gstreamerplayer.h"
19
#include <kapplication.h>
26
////////////////////////////////////////////////////////////////////////////////
28
////////////////////////////////////////////////////////////////////////////////
30
GStreamerPlayer::GStreamerPlayer() :
42
GStreamerPlayer::~GStreamerPlayer()
45
gst_object_unref(GST_OBJECT(m_pipeline));
48
void GStreamerPlayer::play(const FileHandle &file)
52
g_object_set(G_OBJECT(m_source), "location", file.absFilePath().local8Bit().data(), 0);
55
gst_element_set_state(m_pipeline, GST_STATE_PLAYING);
58
void GStreamerPlayer::pause()
60
gst_element_set_state(m_pipeline, GST_STATE_PAUSED);
63
void GStreamerPlayer::stop()
65
gst_element_set_state(m_pipeline, GST_STATE_NULL);
68
void GStreamerPlayer::setVolume(float volume)
70
g_object_set(G_OBJECT(m_volume), "volume", volume, 0);
73
float GStreamerPlayer::volume() const
76
g_object_get(G_OBJECT(m_volume), "volume", &value, 0);
80
bool GStreamerPlayer::playing() const
82
return gst_element_get_state(m_pipeline) == GST_STATE_PLAYING;
85
bool GStreamerPlayer::paused() const
87
return gst_element_get_state(m_pipeline) == GST_STATE_PAUSED;
90
int GStreamerPlayer::totalTime() const
92
return time(GST_QUERY_TOTAL) / GST_SECOND;
95
int GStreamerPlayer::currentTime() const
97
return time(GST_QUERY_POSITION) / GST_SECOND;
100
int GStreamerPlayer::position() const
102
long long total = time(GST_QUERY_TOTAL);
103
long long current = time(GST_QUERY_POSITION);
104
return total > 0 ? int((double(current) / double(total)) * double(1000) + 0.5) : 0;
107
void GStreamerPlayer::seek(int seekTime)
109
int type = (GST_FORMAT_TIME | GST_SEEK_METHOD_SET | GST_SEEK_FLAG_FLUSH);
110
gst_element_seek(m_sink, GstSeekType(type), seekTime * GST_SECOND);
113
void GStreamerPlayer::seekPosition(int position)
115
long long total = time(GST_QUERY_TOTAL);
117
seek(int(double(position) / double(1000) * double(totalTime()) + 0.5));
120
////////////////////////////////////////////////////////////////////////////////
122
////////////////////////////////////////////////////////////////////////////////
124
void GStreamerPlayer::readConfig()
126
KConfigGroup config(KGlobal::config(), "GStreamerPlayer");
127
m_sinkName = config.readEntry("SinkName", QString::null);
130
void GStreamerPlayer::setupPipeline()
132
static bool initialized = false;
134
int argc = kapp->argc();
135
char **argv = kapp->argv();
136
gst_init(&argc, &argv);
140
m_pipeline = gst_thread_new("pipeline");
141
m_source = gst_element_factory_make("filesrc", "source");
142
m_decoder = gst_element_factory_make("spider", "decoder");
143
m_volume = gst_element_factory_make("volume", "volume");
145
if(!m_sinkName.isNull())
146
m_sink = gst_element_factory_make(m_sinkName.utf8().data(), "sink");
148
m_sink = gst_element_factory_make("alsasink", "sink");
150
m_sink = gst_element_factory_make("osssink", "sink");
154
gst_bin_add_many(GST_BIN(m_pipeline), m_source, m_decoder, m_volume, m_sink, 0);
155
gst_element_link_many(m_source, m_decoder, m_volume, m_sink, 0);
158
long long GStreamerPlayer::time(GstQueryType type) const
161
GstFormat format = GST_FORMAT_TIME;
162
gst_element_query(m_sink, type, &format, &ns);
166
#include "gstreamerplayer.moc"