1 #pragma once
2 
3 #include <QSharedPointer>
4 
5 #include "controllers/controllerenumerator.h"
6 #include "controllers/controllerpreset.h"
7 #include "controllers/controllerpresetinfo.h"
8 #include "controllers/controllerpresetinfoenumerator.h"
9 #include "preferences/usersettings.h"
10 
11 // Forward declaration(s)
12 class Controller;
13 class ControllerLearningEventFilter;
14 
15 /// Function to sort controllers by name
16 bool controllerCompare(Controller *a, Controller *b);
17 
18 /// Manages enumeration/operation/deletion of hardware controllers.
19 class ControllerManager : public QObject {
20     Q_OBJECT
21   public:
22     ControllerManager(UserSettingsPointer pConfig);
23     virtual ~ControllerManager();
24 
25     static const mixxx::Duration kPollInterval;
26 
27     QList<Controller*> getControllers() const;
28     QList<Controller*> getControllerList(bool outputDevices=true, bool inputDevices=true);
29     ControllerLearningEventFilter* getControllerLearningEventFilter() const;
getMainThreadUserPresetEnumerator()30     QSharedPointer<PresetInfoEnumerator> getMainThreadUserPresetEnumerator() {
31         return m_pMainThreadUserPresetEnumerator;
32     }
getMainThreadSystemPresetEnumerator()33     QSharedPointer<PresetInfoEnumerator> getMainThreadSystemPresetEnumerator() {
34         return m_pMainThreadSystemPresetEnumerator;
35     }
36     QString getConfiguredPresetFileForDevice(const QString& name);
37 
38     /// Prevent other parts of Mixxx from having to manually connect to our slots
setUpDevices()39     void setUpDevices() { emit requestSetUpDevices(); };
40 
41     static QList<QString> getPresetPaths(UserSettingsPointer pConfig);
42 
43   signals:
44     void devicesChanged();
45     void requestSetUpDevices();
46     void requestShutdown();
47     void requestInitialize();
48 
49   public slots:
50     void updateControllerList();
51 
52     void slotApplyPreset(Controller* pController, ControllerPresetPointer pPreset, bool bEnabled);
53     void openController(Controller* pController);
54     void closeController(Controller* pController);
55 
56   private slots:
57     /// Perform initialization that should be delayed until the ControllerManager
58     /// thread is started.
59     void slotInitialize();
60     /// Open whatever controllers are selected in the preferences. This currently
61     /// only runs on start-up but maybe should instead be signaled by the
62     /// preferences dialog on apply, and only open/close changed devices
63     void slotSetUpDevices();
64     void slotShutdown();
65     /// Calls poll() on all devices that have isPolling() true.
66     void pollDevices();
67     void startPolling();
68     void stopPolling();
69     void maybeStartOrStopPolling();
70 
71   private:
72     UserSettingsPointer m_pConfig;
73     ControllerLearningEventFilter* m_pControllerLearningEventFilter;
74     QTimer m_pollTimer;
75     mutable QMutex m_mutex;
76     QList<ControllerEnumerator*> m_enumerators;
77     QList<Controller*> m_controllers;
78     QThread* m_pThread;
79     QSharedPointer<PresetInfoEnumerator> m_pMainThreadUserPresetEnumerator;
80     QSharedPointer<PresetInfoEnumerator> m_pMainThreadSystemPresetEnumerator;
81     bool m_skipPoll;
82 };
83