Mostly ALSA fixing - Alex
[terminatorX.git] / terminatorX / src / tX_midiin.h
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 2002 Arthur Peters
4         
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_midiin.h
20  
21     Description: Header to tX_midiin.cc
22         
23         Changes (Alexander K├Ânig <alex@lisas.de>:
24         - Default Constructor for tX_midievents
25         - new handlers for destroy and remove binding events
26 */    
27
28 #ifndef _tx_midiin_h
29 #define _tx_midiin_h 1
30
31 class vtt_class;
32
33 class tX_midievent
34 {
35   public:
36         int channel;
37         enum
38         {
39                 NONE=0,
40                 CC=1,
41                 NOTE,
42                 PITCHBEND,
43         } type;
44         int number; // note # or controller #
45         
46         float value; // controller value or note velocity
47         bool is_noteon; // note on or off?
48
49         bool type_matches( const tX_midievent& other ) const
50         {
51                 return channel == other.channel && type == other.type && number == other.number;
52         }
53
54         void clear_non_type()
55         {
56                 value = 0;
57                 is_noteon = false;
58         }
59         
60         tX_midievent() : channel(0), type(NONE), value(0.0), is_noteon(false) {}
61 };
62
63 #include <config.h>
64 #ifdef USE_ALSA_MIDI_IN
65
66 #include <alsa/asoundlib.h>
67 #include <gtk/gtk.h>
68
69 class tX_midiin
70 {
71         snd_seq_t *ALSASeqHandle;
72         tX_midievent last_event;
73         bool is_open;
74         
75   public:
76         tX_midiin();
77         ~tX_midiin();
78
79         bool get_is_open() {
80                 return is_open;
81         }
82         
83         int check_event();
84
85         void configure_bindings( vtt_class* );
86
87         const tX_midievent& get_last_event()
88         {
89                 return last_event;
90         }
91
92   private:
93
94         class midi_binding_gui
95         {
96           public:
97                 midi_binding_gui( GtkTreeModel* _model, tX_midiin* _midi );
98                 ~midi_binding_gui();
99
100                 GtkWidget *window;
101                 
102                 GtkWidget *parameter_treeview;
103                 GtkWidget *midi_event_info;
104                 GtkWidget *bind_button;
105
106                 GtkTreeModel* model;
107
108                 tX_midiin* midi;
109
110                 tX_midievent last_event;
111
112                 static void window_closed( GtkWidget *widget, gpointer _this );
113                 static void unbind_clicked( GtkButton *button, gpointer _this );          
114                 static void bind_clicked( GtkButton *button, gpointer _this );
115                 static void close_clicked( GtkButton *button, gpointer _this );
116                 static gint timer( gpointer _this );
117
118           private:
119                 char tempstr[128];
120
121                 gint timer_tag;
122         };
123 };
124
125 #endif // USE_ALSA_MIDI_IN
126
127 #endif // ndef _tx_midiin_h