From 4af4e185daa548d5c2b464c0bcf42aa71fb7c200 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eduardo=20S=C3=A1nchez=20Mu=C3=B1oz?= Date: Wed, 1 Jul 2015 20:24:17 +0200 Subject: [PATCH] Fix song continuously rewinding when seeking using keyboard arrow keys. --- src/engines/enginebase.h | 0 src/engines/gstengine.cpp | 0 src/engines/gstengine.h | 0 src/engines/gstenginepipeline.cpp | 8 +++++--- src/engines/gstenginepipeline.h | 7 +++++++ 5 files changed, 12 insertions(+), 3 deletions(-) mode change 100755 => 100644 src/engines/enginebase.h mode change 100755 => 100644 src/engines/gstengine.cpp mode change 100755 => 100644 src/engines/gstengine.h diff --git a/src/engines/enginebase.h b/src/engines/enginebase.h old mode 100755 new mode 100644 diff --git a/src/engines/gstengine.cpp b/src/engines/gstengine.cpp old mode 100755 new mode 100644 diff --git a/src/engines/gstengine.h b/src/engines/gstengine.h old mode 100755 new mode 100644 diff --git a/src/engines/gstenginepipeline.cpp b/src/engines/gstenginepipeline.cpp index b9b1bd898..d71870c8d 100644 --- a/src/engines/gstenginepipeline.cpp +++ b/src/engines/gstenginepipeline.cpp @@ -77,6 +77,7 @@ GstEnginePipeline::GstEnginePipeline(GstEngine* engine) pipeline_is_initialised_(false), pipeline_is_connected_(false), pending_seek_nanosec_(-1), + last_known_position_(0), volume_percent_(100), volume_modifier_(1.0), pipeline_(nullptr), @@ -976,10 +977,10 @@ void GstEnginePipeline::TransitionToNext() { } qint64 GstEnginePipeline::position() const { - gint64 value = 0; - gst_element_query_position(pipeline_, GST_FORMAT_TIME, &value); + if (pipeline_is_initialised_) + gst_element_query_position(pipeline_, GST_FORMAT_TIME, &last_known_position_); - return value; + return last_known_position_; } qint64 GstEnginePipeline::length() const { @@ -1033,6 +1034,7 @@ bool GstEnginePipeline::Seek(qint64 nanosec) { } pending_seek_nanosec_ = -1; + last_known_position_ = nanosec; return gst_element_seek_simple(pipeline_, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH, nanosec); } diff --git a/src/engines/gstenginepipeline.h b/src/engines/gstenginepipeline.h index f1f6c173f..af5e7d45b 100644 --- a/src/engines/gstenginepipeline.h +++ b/src/engines/gstenginepipeline.h @@ -258,6 +258,13 @@ signals: bool pipeline_is_connected_; qint64 pending_seek_nanosec_; + // We can only use gst_element_query_position() when the pipeline is in + // PAUSED nor PLAYING state. Whenever we get a new position (e.g. after a + // correct call to gst_element_query_position() or after a seek), we store + // it here so that we can use it when using gst_element_query_position() is + // not possible. + mutable gint64 last_known_position_; + int volume_percent_; qreal volume_modifier_;