MythTV master
mediamonitor.h
Go to the documentation of this file.
1#ifndef MYTH_MEDIA_MONITOR_H
2#define MYTH_MEDIA_MONITOR_H
3
4#include <QStringList>
5#include <QPointer>
6#include <QRecursiveMutex>
7#include <QWaitCondition>
8#include <QList>
9#include <QDateTime>
10
11#include "libmythbase/mthread.h"
13#include "libmythui/mythuiexp.h"
14
15using MediaCallback = void (*)(MythMediaDevice *, bool);
16
18
19// Adding member initializers caused compilation to fail with an error
20// that it cannot convert a brace-enclosed initializer list to MHData.
21// NOLINTNEXTLINE(cppcoreguidelines-pro-type-member-init)
22struct MHData
23{
26 QString destination;
27 QString description;
28};
29
30class MediaMonitor;
31class MonitorThread : public MThread
32{
33 public:
34 MonitorThread(MediaMonitor* pMon, unsigned long interval) :
35 MThread("Monitor"), m_monitor(pMon), m_interval(interval),
36 m_lastCheckTime(QDateTime::currentDateTimeUtc()) {}
37 ~MonitorThread() override { wait(); m_monitor = nullptr; }
38 void setMonitor(MediaMonitor* pMon) { m_monitor = pMon; }
39
40 protected:
41 void run(void) override; // MThread
42
43 QPointer<MediaMonitor> m_monitor;
44 unsigned long m_interval;
45 QDateTime m_lastCheckTime;
46};
47
48class MUI_PUBLIC MediaMonitor : public QObject
49{
50 Q_OBJECT
51 friend class MonitorThread;
52 friend class MonitorThreadDarwin;
53
54 public:
55 virtual void deleteLater(void);
56 bool eventFilter(QObject *obj, QEvent *event) override; // QObject
57 bool IsActive(void) const { return m_active; }
58
59 virtual void StartMonitoring(void);
60 void StopMonitoring(void);
61 void ChooseAndEjectMedia(void);
62 void EjectMedia(const QString &path);
63
64 static MediaMonitor *GetMediaMonitor(void);
65 static QString GetMountPath(const QString& devPath);
66 static void SetCDSpeed(const char *device, int speed);
67
68 bool ValidateAndLock(MythMediaDevice *pMedia);
69 void Unlock(MythMediaDevice *pMedia);
70
71 // To safely dereference the pointers returned by this function
72 // first validate the pointer with ValidateAndLock(), if true is returned
73 // it is safe to dereference the pointer. When finished call Unlock()
74 QList<MythMediaDevice*> GetRemovable(bool showMounted = false,
75 bool showUsable = false);
76 QList<MythMediaDevice*> GetMedias(unsigned mediatypes);
77 MythMediaDevice* GetMedia(const QString &path);
78
79 void RegisterMediaHandler(const QString &destination,
80 const QString &description,
81 MediaCallback callback,
82 int mediaType,
83 const QString &extensions);
84 void JumpToMediaHandler(MythMediaDevice* pMedia, bool forcePlayback = false);
85
86 // Plugins should use these if they need to access optical disks:
87 static QString defaultCDdevice();
88 static QString defaultVCDdevice();
89 static QString defaultDVDdevice();
90 static QString defaultCDWriter();
91 static QString defaultDVDWriter();
92
93 static void ejectOpticalDisc(void);
94
95 protected:
96 virtual QStringList GetCDROMBlockDevices(void) = 0;
97
98 public slots:
99 void mediaStatusChanged(MythMediaStatus oldStatus, MythMediaDevice* pMedia) const;
100
101 protected:
102 MediaMonitor(QObject *par, unsigned long interval, bool allowEject);
103 ~MediaMonitor() override = default;
104
105 static void AttemptEject(MythMediaDevice *device);
106 void CheckDevices(void);
107 virtual void CheckDeviceNotifications(void) {};
108 virtual bool AddDevice(MythMediaDevice* pDevice) = 0;
109 bool RemoveDevice(const QString &dev);
110 bool shouldIgnore(const MythMediaDevice *device);
111
112 QString listDevices(void);
113
114 static QString defaultDevice(const QString &setting,
115 const QString &label,
116 const char *hardCodedDefault);
117 MythMediaDevice *selectDrivePopup(const QString &label,
118 bool &canceled,
119 bool showMounted = false,
120 bool showUsable = false);
121
122 protected:
123 QRecursiveMutex m_devicesLock;
124 QList<MythMediaDevice*> m_devices;
125 QList<MythMediaDevice*> m_removedDevices;
126 QMap<MythMediaDevice*, int> m_useCount;
127
128 // List of devices/mountpoints that the user doesn't want to monitor:
129 QStringList m_ignoreList;
130
131 bool volatile m_active {false};
132 QWaitCondition m_wait;
136
137 QMap<QString, MHData> m_handlerMap;
138
140};
141
142static inline void
143REG_MEDIA_HANDLER (const QString& destination,
144 const QString& description,
145 MediaCallback callback,
146 int mediaType,
147 const QString& extensions)
148{
149 MediaMonitor::GetMediaMonitor()->RegisterMediaHandler(destination, description,
150 callback, mediaType, extensions);
151}
152
153
154#endif // MYTH_MEDIA_MONITOR_H
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
MThreadInternal * m_thread
Definition: mthread.h:131
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:284
virtual bool AddDevice(MythMediaDevice *pDevice)=0
unsigned long m_monitorPollingInterval
Definition: mediamonitor.h:134
virtual void CheckDeviceNotifications(void)
Definition: mediamonitor.h:107
static MediaMonitor * GetMediaMonitor(void)
QRecursiveMutex m_devicesLock
Definition: mediamonitor.h:123
QList< MythMediaDevice * > m_removedDevices
Definition: mediamonitor.h:125
QWaitCondition m_wait
Definition: mediamonitor.h:132
static MediaMonitor * s_monitor
Definition: mediamonitor.h:139
QStringList m_ignoreList
Definition: mediamonitor.h:129
QMap< QString, MHData > m_handlerMap
Registered Media Handlers.
Definition: mediamonitor.h:137
bool IsActive(void) const
Definition: mediamonitor.h:57
void RegisterMediaHandler(const QString &destination, const QString &description, MediaCallback callback, int mediaType, const QString &extensions)
Register a handler for media related events.
QList< MythMediaDevice * > m_devices
Definition: mediamonitor.h:124
QMap< MythMediaDevice *, int > m_useCount
Definition: mediamonitor.h:126
virtual QStringList GetCDROMBlockDevices(void)=0
~MediaMonitor() override=default
void run(void) override
Runs the Qt event loop unless we have a QRunnable, in which case we run the runnable run instead.
QDateTime m_lastCheckTime
Definition: mediamonitor.h:45
unsigned long m_interval
Definition: mediamonitor.h:44
MonitorThread(MediaMonitor *pMon, unsigned long interval)
Definition: mediamonitor.h:34
void setMonitor(MediaMonitor *pMon)
Definition: mediamonitor.h:38
QPointer< MediaMonitor > m_monitor
Definition: mediamonitor.h:43
~MonitorThread() override
Definition: mediamonitor.h:37
void(*)(MythMediaDevice *, bool) MediaCallback
Definition: mediamonitor.h:15
static void REG_MEDIA_HANDLER(const QString &destination, const QString &description, MediaCallback callback, int mediaType, const QString &extensions)
Definition: mediamonitor.h:143
MythMediaStatus
Definition: mythmedia.h:12
#define MUI_PUBLIC
Definition: mythuiexp.h:9
Stores details of media handlers.
Definition: mediamonitor.h:23
QString destination
Definition: mediamonitor.h:26
MediaCallback callback
Definition: mediamonitor.h:24
QString description
Definition: mediamonitor.h:27
int MythMediaType
Definition: mediamonitor.h:25