1 /* 2 * Copyright (C) 2012-2018 Team Kodi 3 * This file is part of Kodi - https://kodi.tv 4 * 5 * SPDX-License-Identifier: GPL-2.0-or-later 6 * See LICENSES/README.md for more information. 7 */ 8 9 #pragma once 10 11 #include "input/Key.h" 12 #include "interfaces/IActionListener.h" 13 #include "settings/lib/ISettingCallback.h" 14 #include "threads/CriticalSection.h" 15 #include "utils/Stopwatch.h" 16 17 #include <map> 18 #include <utility> 19 #include <vector> 20 21 struct IntegerSettingOption; 22 23 enum SeekType 24 { 25 SEEK_TYPE_VIDEO = 0, 26 SEEK_TYPE_MUSIC = 1 27 }; 28 29 class CSeekHandler : public ISettingCallback, public IActionListener 30 { 31 public: 32 CSeekHandler() = default; 33 ~CSeekHandler() override; 34 35 static void SettingOptionsSeekStepsFiller(const std::shared_ptr<const CSetting>& setting, 36 std::vector<IntegerSettingOption>& list, 37 int& current, 38 void* data); 39 40 void OnSettingChanged(const std::shared_ptr<const CSetting>& setting) override; 41 bool OnAction(const CAction &action) override; 42 43 void Seek(bool forward, float amount, float duration = 0, bool analogSeek = false, SeekType type = SEEK_TYPE_VIDEO); 44 void SeekSeconds(int seconds); 45 void FrameMove(); 46 void Reset(); 47 void Configure(); 48 49 int GetSeekSize() const; 50 bool InProgress() const; 51 HasTimeCode()52 bool HasTimeCode() const { return m_timeCodePosition > 0; } 53 int GetTimeCodeSeconds() const; 54 55 protected: 56 CSeekHandler(const CSeekHandler&) = delete; 57 CSeekHandler& operator=(CSeekHandler const&) = delete; 58 bool SeekTimeCode(const CAction &action); 59 void ChangeTimeCode(int remote); 60 61 private: 62 static const int analogSeekDelay = 500; 63 64 void SetSeekSize(double seekSize); 65 int GetSeekStepSize(SeekType type, int step); 66 67 int m_seekDelay = 500; 68 std::map<SeekType, int > m_seekDelays; 69 bool m_requireSeek = false; 70 bool m_seekChanged = false; 71 bool m_analogSeek = false; 72 double m_seekSize = 0; 73 int m_seekStep = 0; 74 std::map<SeekType, std::vector<int> > m_forwardSeekSteps; 75 std::map<SeekType, std::vector<int> > m_backwardSeekSteps; 76 CStopWatch m_timer; 77 CStopWatch m_timerTimeCode; 78 int m_timeCodeStamp[6]; 79 int m_timeCodePosition; 80 81 CCriticalSection m_critSection; 82 }; 83