-#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>
+ 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.
-#include "pbd/abstract_ui.h"
+ 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.
-#include <cwiid.h>
+ 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.
+*/
-namespace ARDOUR {
- class Session;
-}
+#ifndef ardour_wiimote_control_protocol_h
+#define ardour_wiimote_control_protocol_h
-#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;\
- }
+#include <cwiid.h>
+#define ABSTRACT_UI_EXPORTS
+#include "pbd/abstract_ui.h"
+#include "ardour/types.h"
+#include "control_protocol/control_protocol.h"
-class WiimoteControlProtocol : public ARDOUR::ControlProtocol {
- public:
- WiimoteControlProtocol (ARDOUR::Session &);
- virtual ~WiimoteControlProtocol ();
+struct WiimoteControlUIRequest : public BaseUI::BaseRequestObject {
+public:
+ WiimoteControlUIRequest () {}
+ ~WiimoteControlUIRequest () {}
+};
- static bool probe();
+class WiimoteControlProtocol
+ : public ARDOUR::ControlProtocol
+ , public AbstractUI<WiimoteControlUIRequest>
+{
+public:
+ WiimoteControlProtocol (ARDOUR::Session &);
+ virtual ~WiimoteControlProtocol ();
- int set_active (bool yn);
- XMLNode& get_state();
- int set_state(const XMLNode&);
+ static bool probe ();
+ static void* request_factory (uint32_t);
- void wiimote_callback(cwiid_wiimote_t *, int, union cwiid_mesg [],
- struct timespec *);
+ int set_active (bool yn);
- private:
-
- void wiimote_main();
- volatile bool main_thread_quit;
- volatile bool restart_discovery;
+ XMLNode& get_state ();
+ int set_state (const XMLNode&, int version);
- Glib::Thread *main_thread;
+ void start_wiimote_discovery ();
+ void stop_wiimote_discovery ();
- void update_led_state();
+ void wiimote_callback (int mesg_count, union cwiid_mesg mesg[]);
- bool callback_thread_registered_for_ardour;
+ void stripable_selection_changed () {}
- 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 */