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