summaryrefslogtreecommitdiff
path: root/libs/surfaces/wiimote/wiimote.h
blob: 4ab19749e52dd8fdddab2779b886de7a22a61292 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#ifndef ardour_wiimote_control_protocol_h
#define ardour_wiimote_control_protocol_h

#include "ardour/types.h"
#include "control_protocol/control_protocol.h"

#include <glibmm/threads.h>

#include "pbd/abstract_ui.h"

#include <cwiid.h>


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;
};


#endif  /* ardour_wiimote_control_protocol_h */