fix merge conflict with master
[ardour.git] / libs / surfaces / wiimote / wiimote.h
index 4ab19749e52dd8fdddab2779b886de7a22a61292..6edadf6c64f305cbb78738da372ac3129cdc36d7 100644 (file)
@@ -1,69 +1,77 @@
+/*
+    Copyright (C) 2009-2013 Paul Davis
+    Authors: Sampo Savolainen, Jannis Pohlmann
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
 #ifndef ardour_wiimote_control_protocol_h
 #define ardour_wiimote_control_protocol_h
 
+#include <cwiid.h>
+
+#define ABSTRACT_UI_EXPORTS
+#include "pbd/abstract_ui.h"
 #include "ardour/types.h"
 #include "control_protocol/control_protocol.h"
 
-#include <glibmm/threads.h>
+struct WiimoteControlUIRequest : public BaseUI::BaseRequestObject {
+public:
+       WiimoteControlUIRequest () {}
+       ~WiimoteControlUIRequest () {}
+};
+
+class WiimoteControlProtocol
+       : public ARDOUR::ControlProtocol
+       , public AbstractUI<WiimoteControlUIRequest>
+{
+public:
+       WiimoteControlProtocol (ARDOUR::Session &);
+       virtual ~WiimoteControlProtocol ();
 
-#include "pbd/abstract_ui.h"
+       static bool probe ();
+       int set_active (bool yn);
 
-#include <cwiid.h>
+       XMLNode& get_state ();
+       int set_state (const XMLNode&, int version);
 
+       void start_wiimote_discovery ();
+       void stop_wiimote_discovery ();
 
-namespace ARDOUR {
-        class Session;
-}
-
-#define ENSURE_WIIMOTE_THREAD(slot) \
-       if (Glib::Threads::Thread::self() != main_thread) {     \
-               slot_mutex.lock();\
-               slot_list.push_back(slot);\
-               slot_cond.signal();\
-               slot_mutex.unlock();\
-               return;\
-       } 
-
-
-class WiimoteControlProtocol : public ARDOUR::ControlProtocol {
-  public:
-    WiimoteControlProtocol (ARDOUR::Session &);
-    virtual ~WiimoteControlProtocol ();
-    
-    static bool probe();
-    
-    int set_active (bool yn);
-    XMLNode& get_state();
-    int set_state(const XMLNode&);
-    
-    void wiimote_callback(cwiid_wiimote_t *, int, union cwiid_mesg [], 
-                         struct timespec *);
-    
-  private:
-    
-    void wiimote_main();
-    volatile bool main_thread_quit;
-    volatile bool restart_discovery;
-    
-    Glib::Threads::Thread *main_thread;
-    
-    void update_led_state();
-    
-    bool callback_thread_registered_for_ardour;
-    
-    static uint16_t button_state;
-    
-    cwiid_wiimote_t *wiimote_handle;
-    
-    Glib::Threads::Cond slot_cond;
-    Glib::Threads::Mutex slot_mutex;
-    
-    std::list< sigc::slot<void> > slot_list;
-    
-    sigc::connection transport_state_conn;
-    sigc::connection record_state_conn;
-};
+       void wiimote_callback (int mesg_count, union cwiid_mesg mesg[]);
+
+protected:
+       void do_request (WiimoteControlUIRequest*);
+       int start ();
+       int stop ();
 
+       void thread_init ();
+
+       bool connect_idle ();
+       bool connect_wiimote ();
+
+       void update_led_state ();
+
+protected:
+       PBD::ScopedConnectionList session_connections;
+       cwiid_wiimote_t* wiimote;
+       GSource *idle_source;
+       uint16_t button_state;
+       bool callback_thread_registered;
+};
 
 #endif  /* ardour_wiimote_control_protocol_h */