vdr-plugin-softhddevice-drm-gles 1.6.8-daba64b
statemachine.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-or-later
2
12#ifndef __STATEMACHINE_H
13#define __STATEMACHINE_H
14
15#if __cplusplus < 201703L
16#error "C++17 or higher is required"
17#endif
18
19#include <atomic>
20#include <mutex>
21#include <variant>
22#include <vector>
23
24#include <vdr/thread.h>
25#include <vdr/tools.h>
26
27#include "config.h"
28#include "logger.h"
29
35// State machine definitions
36// Implementing C++17 visitor pattern
37template<class... Ts>
38struct overload : Ts... { using Ts::operator()...; };
39template<class... Ts> overload(Ts...) -> overload<Ts...>;
40
48
53
54struct PlayEvent {};
55struct PauseEvent {};
56struct StopEvent {};
58 double speed;
59 bool active;
60 bool forward;
61};
63 const uchar *data;
64 int size;
65};
66struct DetachEvent {};
67struct AttachEvent {};
75struct ResyncEvent {};
79
80using Event = std::variant<
93>;
94
95inline const char* EventToString(const Event& e) {
96 return std::visit(overload{
97 [](const PlayEvent&) -> const char* { return "PlayEvent"; },
98 [](const PauseEvent&) -> const char* { return "PauseEvent"; },
99 [](const StopEvent&) -> const char* { return "StopEvent"; },
100 [](const TrickSpeedEvent&) -> const char* { return "TrickSpeedEvent"; },
101 [](const StillPictureEvent&) -> const char* { return "StillPictureEvent"; },
102 [](const DetachEvent&) -> const char* { return "DetachEvent"; },
103 [](const AttachEvent&) -> const char* { return "AttachEvent"; },
104 [](const BufferUnderrunEvent& e) -> const char* { return e.type == AUDIO ? "BufferUnderrunEvent: Audio" : "BufferUnderrunEvent: Video"; },
105 [](const BufferingThresholdReachedEvent&) -> const char* { return "BufferingThresholdReachedEvent"; },
106 [](const ScheduleResyncAtPtsMsEvent&) -> const char* { return "ScheduleResyncAtPtsMsEvent"; },
107 [](const ResyncEvent&) -> const char* { return "ResyncEvent"; },
108 [](const DisplayChangeEvent&) -> const char* { return "DisplayChangeEvent"; },
109 }, e);
110}
111
112inline const char* StateToString(State s) {
113 switch(s) {
114 case State::STOP: return "STOP";
115 case State::BUFFERING: return "BUFFERING";
116 case State::PLAY: return "PLAY";
117 case State::TRICK_SPEED: return "TRICK_SPEED";
118 case State::DETACHED: return "DETACHED";
119 }
120 return "Unknown";
121}
122
125class cSoftHdDevice;
126
142public:
144 void OnEventReceived(const Event&);
145
146 State GetState(void) const { return m_state; };
148 void ChangeState(State);
149
150private:
152 std::mutex m_mutex;
153 std::atomic<State> m_state = DETACHED;
154};
155
163class cEventHandler : public cThread {
164public:
166 ~cEventHandler(void);
167 void AddEvent(Event);
168
169protected:
170 void Action(void);
171
172private:
174 std::mutex m_mutex;
175 std::vector<Event> m_eventQueue;
176};
177
178#endif
Event handler thread.
void AddEvent(Event)
Add an event to the queue.
std::vector< Event > m_eventQueue
event fifo queue
std::mutex m_mutex
queue mutex
~cEventHandler(void)
Stop and delete the event handler thread.
void Action(void)
Periodically send events in the queue to the final event receiver/handler.
cStateMachine * m_pStateMachine
pointer to state machine
Output Device Implementation.
State Machine Implementation.
void SetState(State state)
std::atomic< State > m_state
current state
State GetState(void) const
std::mutex m_mutex
state machine mutex
cSoftHdDevice * m_pDevice
pointer to the device
void ChangeState(State)
Sets the new state and triggers actions, which are necessary when leaving the old and entering the ne...
void OnEventReceived(const Event &)
Event handler for playback state transitions.
Plugin Configuration Header File.
std::variant< PlayEvent, PauseEvent, StopEvent, TrickSpeedEvent, StillPictureEvent, DetachEvent, AttachEvent, BufferUnderrunEvent, BufferingThresholdReachedEvent, ScheduleResyncAtPtsMsEvent, ResyncEvent, DisplayChangeEvent > Event
const char * EventToString(const Event &e)
State
const char * StateToString(State s)
BufferUnderrunType
@ PLAY
@ STOP
@ BUFFERING
@ TRICK_SPEED
@ DETACHED
@ VIDEO
@ AUDIO
Logger Header File.
BufferUnderrunType type
const uchar * data
Holds possible display configurations.
Definition config.h:30