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 void run(void) override; // MThread
40
41 protected:
42 QPointer<MediaMonitor> m_monitor;
43 unsigned long m_interval;
44 QDateTime m_lastCheckTime;
45};
46
47class MUI_PUBLIC MediaMonitor : public QObject
48{
49 Q_OBJECT
50 friend class MonitorThread;
51 friend class MonitorThreadDarwin;
52
53 public:
54 virtual void deleteLater(void);
55 bool IsActive(void) const { return m_active; }
56
57 virtual void StartMonitoring(void);
58 void StopMonitoring(void);
59 void ChooseAndEjectMedia(void);
60 void EjectMedia(const QString &path);
61
62 static MediaMonitor *GetMediaMonitor(void);
63 static QString GetMountPath(const QString& devPath);
64 static void SetCDSpeed(const char *device, int speed);
65
66 bool ValidateAndLock(MythMediaDevice *pMedia);
67 void Unlock(MythMediaDevice *pMedia);
68
69 // To safely dereference the pointers returned by this function
70 // first validate the pointer with ValidateAndLock(), if true is returned
71 // it is safe to dereference the pointer. When finished call Unlock()
72 QList<MythMediaDevice*> GetRemovable(bool showMounted = false,
73 bool showUsable = false);
74 QList<MythMediaDevice*> GetMedias(unsigned mediatypes);
75 MythMediaDevice* GetMedia(const QString &path);
76
77 void RegisterMediaHandler(const QString &destination,
78 const QString &description,
79 MediaCallback callback,
80 int mediaType,
81 const QString &extensions);
82 void JumpToMediaHandler(MythMediaDevice* pMedia, bool forcePlayback = false);
83
84 // Plugins should use these if they need to access optical disks:
85 static QString defaultCDdevice();
86 static QString defaultVCDdevice();
87 static QString defaultDVDdevice();
88 static QString defaultCDWriter();
89 static QString defaultDVDWriter();
90
91 static void ejectOpticalDisc(void);
92
93 virtual QStringList GetCDROMBlockDevices(void) = 0;
94
95 public slots:
96 void mediaStatusChanged(MythMediaStatus oldStatus, MythMediaDevice* pMedia) const;
97
98 protected:
99 MediaMonitor(QObject *par, unsigned long interval, bool allowEject);
100 ~MediaMonitor() override = default;
101
102 static void AttemptEject(MythMediaDevice *device);
103 void CheckDevices(void);
104 virtual void CheckDeviceNotifications(void) {};
105 virtual bool AddDevice(MythMediaDevice* pDevice) = 0;
106 bool RemoveDevice(const QString &dev);
107 bool shouldIgnore(const MythMediaDevice *device);
108 bool eventFilter(QObject *obj, QEvent *event) override; // QObject
109
110 QString listDevices(void);
111
112 static QString defaultDevice(const QString &setting,
113 const QString &label,
114 const char *hardCodedDefault);
115 MythMediaDevice *selectDrivePopup(const QString &label,
116 bool &canceled,
117 bool showMounted = false,
118 bool showUsable = false);
119
120 protected:
121 QRecursiveMutex m_devicesLock;
122 QList<MythMediaDevice*> m_devices;
123 QList<MythMediaDevice*> m_removedDevices;
124 QMap<MythMediaDevice*, int> m_useCount;
125
126 // List of devices/mountpoints that the user doesn't want to monitor:
127 QStringList m_ignoreList;
128
129 bool volatile m_active {false};
130 QWaitCondition m_wait;
134
135 QMap<QString, MHData> m_handlerMap;
136
138};
139
140static inline void
141REG_MEDIA_HANDLER (const QString& destination,
142 const QString& description,
143 MediaCallback callback,
144 int mediaType,
145 const QString& extensions)
146{
147 MediaMonitor::GetMediaMonitor()->RegisterMediaHandler(destination, description,
148 callback, mediaType, extensions);
149}
150
151
152#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:135
bool wait(std::chrono::milliseconds time=std::chrono::milliseconds::max())
Wait for the MThread to exit, with a maximum timeout.
Definition: mthread.cpp:300
virtual bool AddDevice(MythMediaDevice *pDevice)=0
unsigned long m_monitorPollingInterval
Definition: mediamonitor.h:132
virtual void CheckDeviceNotifications(void)
Definition: mediamonitor.h:104
static MediaMonitor * GetMediaMonitor(void)
QRecursiveMutex m_devicesLock
Definition: mediamonitor.h:121
QList< MythMediaDevice * > m_removedDevices
Definition: mediamonitor.h:123
QWaitCondition m_wait
Definition: mediamonitor.h:130
static MediaMonitor * s_monitor
Definition: mediamonitor.h:137
QStringList m_ignoreList
Definition: mediamonitor.h:127
QMap< QString, MHData > m_handlerMap
Registered Media Handlers.
Definition: mediamonitor.h:135
bool IsActive(void) const
Definition: mediamonitor.h:55
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:122
QMap< MythMediaDevice *, int > m_useCount
Definition: mediamonitor.h:124
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:44
unsigned long m_interval
Definition: mediamonitor.h:43
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:42
~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:141
MythMediaStatus
Definition: mythmedia.h:12
#define MUI_PUBLIC
Definition: mythuiexp.h:9
bool
Definition: pxsup2dast.c:31
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