aboutsummaryrefslogtreecommitdiff
path: root/src/utils/SeekHandler.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils/SeekHandler.cpp')
-rw-r--r--src/utils/SeekHandler.cpp94
1 files changed, 94 insertions, 0 deletions
diff --git a/src/utils/SeekHandler.cpp b/src/utils/SeekHandler.cpp
new file mode 100644
index 0000000000..9c4e101800
--- /dev/null
+++ b/src/utils/SeekHandler.cpp
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2012-2013 Team XBMC
+ * http://xbmc.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, 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 XBMC; see the file COPYING. If not, see
+ * <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#include "SeekHandler.h"
+#include "GUIInfoManager.h"
+#include "Application.h"
+
+CSeekHandler::CSeekHandler()
+: m_requireSeek(false),
+ m_percent(0.0f)
+{
+}
+
+void CSeekHandler::Reset()
+{
+ m_requireSeek = false;
+ m_percent = 0;
+}
+
+void CSeekHandler::Seek(bool forward, float amount, float duration)
+{
+ if (!m_requireSeek)
+ { // not yet seeking
+ if (g_infoManager.GetTotalPlayTime())
+ m_percent = (float)g_infoManager.GetPlayTime() / g_infoManager.GetTotalPlayTime() * 0.1f;
+ else
+ m_percent = 0.0f;
+
+ // tell info manager that we have started a seek operation
+ m_requireSeek = true;
+ g_infoManager.SetSeeking(true);
+ }
+ // calculate our seek amount
+ if (!g_infoManager.m_performingSeek)
+ {
+ //100% over 1 second.
+ float speed = 100.0f;
+ if( duration )
+ speed *= duration;
+ else
+ speed /= g_infoManager.GetFPS();
+
+ if (forward)
+ m_percent += amount * amount * speed;
+ else
+ m_percent -= amount * amount * speed;
+ if (m_percent > 100.0f) m_percent = 100.0f;
+ if (m_percent < 0.0f) m_percent = 0.0f;
+ }
+ m_timer.StartZero();
+}
+
+float CSeekHandler::GetPercent() const
+{
+ return m_percent;
+}
+
+bool CSeekHandler::InProgress() const
+{
+ return m_requireSeek;
+}
+
+void CSeekHandler::Process()
+{
+ if (m_timer.GetElapsedMilliseconds() > time_before_seek)
+ {
+ if (!g_infoManager.m_performingSeek && m_timer.GetElapsedMilliseconds() > time_for_display) // TODO: Why?
+ g_infoManager.SetSeeking(false);
+ if (m_requireSeek)
+ {
+ g_infoManager.m_performingSeek = true;
+ double time = g_infoManager.GetTotalPlayTime() * m_percent * 0.01;
+ g_application.SeekTime(time);
+ m_requireSeek = false;
+ }
+ }
+}