various fixes for push2 support. Now setups video display when enabled
[ardour.git] / libs / surfaces / push2 / push2.h
1 /*
2     Copyright (C) 2016 Paul Davis
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17 */
18
19 #ifndef __ardour_push2_h__
20 #define __ardour_push2_h__
21
22 #include <vector>
23 #include <map>
24 #include <list>
25 #include <set>
26
27 #include <libusb.h>
28
29 #include <cairomm/refptr.h>
30 #include <glibmm/threads.h>
31
32 #define ABSTRACT_UI_EXPORTS
33 #include "pbd/abstract_ui.h"
34 #include "midi++/types.h"
35 #include "ardour/types.h"
36 #include "control_protocol/control_protocol.h"
37
38 namespace Cairo {
39         class ImageSurface;
40 }
41
42 namespace ArdourSurface {
43
44 struct Push2Request : public BaseUI::BaseRequestObject {
45 public:
46         Push2Request () {}
47         ~Push2Request () {}
48 };
49
50 class Push2 : public ARDOUR::ControlProtocol
51             , public AbstractUI<Push2Request>
52 {
53    public:
54         Push2 (ARDOUR::Session&);
55         ~Push2 ();
56
57         static bool probe ();
58         static void* request_factory (uint32_t);
59
60         int set_active (bool yn);
61
62    private:
63         libusb_device_handle *handle;
64         Glib::Threads::Mutex fb_lock;
65         uint8_t   frame_header[16];
66         uint16_t* device_frame_buffer[2];
67         int  device_buffer;
68         Cairo::RefPtr<Cairo::ImageSurface> frame_buffer;
69         sigc::connection vblank_connection;
70
71         static const int cols;
72         static const int rows;
73         static const int pixels_per_row;
74
75         void do_request (Push2Request*);
76         int stop ();
77         int open ();
78         int close ();
79         int render ();
80         bool vblank ();
81 };
82
83
84 } /* namespace */
85
86 #endif /* __ardour_push2_h__ */