aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorghost <andreas.monzner@multimedia-labs.de>2009-10-09 00:17:38 +0200
committerghost <andreas.monzner@multimedia-labs.de>2009-10-09 00:17:38 +0200
commita9d34a0da90559741b525756944ced38bbf4538a (patch)
tree0ad1da13bfdbdb1a3baf860e1e8afaf5278db866
parentf465e5318690b0fb2dfd76964e07d16a6f57b12c (diff)
downloadenigma2-a9d34a0da90559741b525756944ced38bbf4538a.tar.gz
enigma2-a9d34a0da90559741b525756944ced38bbf4538a.zip
servicemp3.h/cpp: improved pause / skip forward/backward (needs current gstreamer and gst-plugin-dvbmediasink)
-rw-r--r--lib/service/servicemp3.cpp56
-rw-r--r--lib/service/servicemp3.h2
2 files changed, 29 insertions, 29 deletions
diff --git a/lib/service/servicemp3.cpp b/lib/service/servicemp3.cpp
index 7d5901e2..95ec274d 100644
--- a/lib/service/servicemp3.cpp
+++ b/lib/service/servicemp3.cpp
@@ -17,12 +17,6 @@
/* for subtitles */
#include <lib/gui/esubtitle.h>
-#ifndef GST_SEEK_FLAG_SKIP
-#warning Compiling for legacy gstreamer, things will break
-#define GST_SEEK_FLAG_SKIP 0
-#define GST_TAG_HOMEPAGE ""
-#endif
-
// eServiceFactoryMP3
eServiceFactoryMP3::eServiceFactoryMP3()
@@ -446,24 +440,19 @@ RESULT eServiceMP3::pause()
{
if (!m_gst_playbin || m_state != stRunning)
return -1;
- GstStateChangeReturn res = gst_element_set_state(m_gst_playbin, GST_STATE_PAUSED);
- if (res == GST_STATE_CHANGE_ASYNC)
- {
- pts_t ppos;
- getPlayPosition(ppos);
- seekTo(ppos);
- }
+
+ gst_element_set_state(m_gst_playbin, GST_STATE_PAUSED);
+
return 0;
}
RESULT eServiceMP3::unpause()
{
- m_subtitle_pages.clear();
if (!m_gst_playbin || m_state != stRunning)
return -1;
- GstStateChangeReturn res;
- res = gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
+ gst_element_set_state(m_gst_playbin, GST_STATE_PLAYING);
+
return 0;
}
@@ -478,9 +467,10 @@ RESULT eServiceMP3::getLength(pts_t &pts)
{
if (!m_gst_playbin)
return -1;
+
if (m_state != stRunning)
return -1;
-
+
GstFormat fmt = GST_FORMAT_TIME;
gint64 len;
@@ -492,13 +482,8 @@ RESULT eServiceMP3::getLength(pts_t &pts)
return 0;
}
-RESULT eServiceMP3::seekTo(pts_t to)
+RESULT eServiceMP3::seekToImpl(pts_t to)
{
- if (!m_gst_playbin)
- return -1;
-
- eSingleLocker l(m_subs_to_pull_lock); // this is needed to dont handle incomming subtitles during seek!
-
/* convert pts to nanoseconds */
gint64 time_nanoseconds = to * 11111LL;
if (!gst_element_seek (m_gst_playbin, 1.0, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
@@ -509,12 +494,26 @@ RESULT eServiceMP3::seekTo(pts_t to)
return -1;
}
- m_subtitle_pages.clear();
- m_subs_to_pull = 0;
-
return 0;
}
+RESULT eServiceMP3::seekTo(pts_t to)
+{
+ RESULT ret = -1;
+
+ if (m_gst_playbin) {
+ eSingleLocker l(m_subs_to_pull_lock); // this is needed to dont handle incomming subtitles during seek!
+ if (!(ret = seekToImpl(to)))
+ {
+ m_subtitle_pages.clear();
+ m_subs_to_pull = 0;
+ }
+ }
+
+ return ret;
+}
+
+
RESULT eServiceMP3::trickSeek(gdouble ratio)
{
if (!m_gst_playbin)
@@ -1374,8 +1373,8 @@ void eServiceMP3::pullSubtitle()
{
eSingleLocker l(m_subs_to_pull_lock);
--m_subs_to_pull;
+ g_signal_emit_by_name (sink, "pull-buffer", &buffer);
}
- g_signal_emit_by_name (sink, "pull-buffer", &buffer);
if (buffer)
{
gint64 buf_pos = GST_BUFFER_TIMESTAMP(buffer);
@@ -1471,9 +1470,9 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
if (m_currentSubtitleStream != pid)
{
+ eSingleLocker l(m_subs_to_pull_lock);
g_object_set (G_OBJECT (m_gst_playbin), "current-text", pid, NULL);
m_currentSubtitleStream = pid;
- eSingleLocker l(m_subs_to_pull_lock);
m_subs_to_pull = 0;
m_subtitle_pages.clear();
}
@@ -1486,7 +1485,6 @@ RESULT eServiceMP3::enableSubtitles(eWidget *parent, ePyObject tuple)
eDebug ("eServiceMP3::switched to subtitle stream %i", text_pid);
-
return 0;
error_out:
diff --git a/lib/service/servicemp3.h b/lib/service/servicemp3.h
index 29c1d438..d2a8fb0b 100644
--- a/lib/service/servicemp3.h
+++ b/lib/service/servicemp3.h
@@ -205,6 +205,8 @@ private:
int m_subs_to_pull;
eSingleLock m_subs_to_pull_lock;
+ RESULT seekToImpl(pts_t to);
+
gint m_aspect, m_width, m_height, m_framerate, m_progressive;
RESULT trickSeek(gdouble ratio);
};