Merge branch 'master' into cairocanvas
[ardour.git] / libs / surfaces / wiimote / wiimote.h
index c7c2cd59c907ab756306becccd59e99a7fd163e5..f6ac8edc41d140288611e37f5987c6c6247d6e89 100644 (file)
@@ -1,69 +1,76 @@
-#ifndef ardour_wiimote_control_protocol_h
-#define ardour_wiimote_control_protocol_h
-
-#include "ardour/types.h"
-#include "control_protocol/control_protocol.h"
+/*
+    Copyright (C) 2009-2013 Paul Davis
+    Authors: Sampo Savolainen, Jannis Pohlmann
 
-#include <glibmm/thread.h>
-
-#include "pbd/abstract_ui.h"
-
-#include <cwiid.h>
+    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.
 
-namespace ARDOUR {
-        class Session;
-}
+    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.
 
-#define ENSURE_WIIMOTE_THREAD(slot) \
-       if (Glib::Thread::self() != main_thread) {\
-               slot_mutex.lock();\
-               slot_list.push_back(slot);\
-               slot_cond.signal();\
-               slot_mutex.unlock();\
-               return;\
-       } 
+*/
 
+#ifndef ardour_wiimote_control_protocol_h
+#define ardour_wiimote_control_protocol_h
 
-class WiimoteControlProtocol : public ARDOUR::ControlProtocol {
-       public:
-               WiimoteControlProtocol (ARDOUR::Session &);
-               virtual ~WiimoteControlProtocol ();
+#include <cwiid.h>
 
-               static bool probe();
+#include "pbd/abstract_ui.h"
+#include "ardour/types.h"
+#include "control_protocol/control_protocol.h"
 
-               int set_active (bool yn);
-               XMLNode& get_state();
-               int set_state(const XMLNode&);
+struct WiimoteControlUIRequest : public BaseUI::BaseRequestObject {
+public:
+       WiimoteControlUIRequest () {}
+       ~WiimoteControlUIRequest () {}
+};
 
-               void wiimote_callback(cwiid_wiimote_t *, int, union cwiid_mesg [], 
-                                     struct timespec *);
+class WiimoteControlProtocol
+       : public ARDOUR::ControlProtocol
+       , public AbstractUI<WiimoteControlUIRequest>
+{
+public:
+       WiimoteControlProtocol (ARDOUR::Session &);
+       virtual ~WiimoteControlProtocol ();
 
-       private:
-               
-               void wiimote_main();
-               volatile bool main_thread_quit;
-               volatile bool restart_discovery;
+       static bool probe ();
+       int set_active (bool yn);
 
-               Glib::Thread *main_thread;
+       XMLNode& get_state ();
+       int set_state (const XMLNode&, int version);
 
-               void update_led_state();
+       void start_wiimote_discovery ();
+       void stop_wiimote_discovery ();
 
-               bool callback_thread_registered_for_ardour;
+       void wiimote_callback (int mesg_count, union cwiid_mesg mesg[]);
 
-               static uint16_t button_state;
+protected:
+       void do_request (WiimoteControlUIRequest*);
+       int start ();
+       int stop ();
 
-               cwiid_wiimote_t *wiimote_handle;
+       void thread_init ();
 
-               Glib::Cond slot_cond;
-               Glib::Mutex slot_mutex;
+       bool connect_idle ();
+       bool connect_wiimote ();
 
-               std::list< sigc::slot<void> > slot_list;
+       void update_led_state ();
 
-               sigc::connection transport_state_conn;
-               sigc::connection record_state_conn;
+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 */