]> git.0d.be Git - jack_mixer.git/commitdiff
Back to polling for MIDI events, to avoid the need for threads
authorFrédéric Péters <fpeters@0d.be>
Tue, 9 Feb 2010 14:32:49 +0000 (15:32 +0100)
committerFrédéric Péters <fpeters@0d.be>
Tue, 9 Feb 2010 14:32:49 +0000 (15:32 +0100)
channel.py
jack_mixer.c
jack_mixer.h
jack_mixer.py
jack_mixer_c.c

index c2269eaa649108536fd091ce8b895e4e582a5733..545e509c36371bea6170a05603b759e408eadc3b 100644 (file)
@@ -70,7 +70,6 @@ class Channel(gtk.VBox, SerializedObject):
 
         self.slider_adjustment.connect("volume-changed", self.on_volume_changed)
         self.balance_adjustment.connect("value-changed", self.on_balance_changed)
-        self.connect('midi-event-received', self.on_midi_event_received)
 
         self.slider = None
         self.create_slider_widget()
@@ -256,15 +255,15 @@ class Channel(gtk.VBox, SerializedObject):
             return True
         return False
 
+    def midi_events_check(self):
+        if self.channel.midi_got_events:
+            self.slider_adjustment.set_value_db(self.channel.volume)
+            self.balance_adjustment.set_value(self.channel.balance)
+
     def on_midi_event_received(self, *args):
         self.slider_adjustment.set_value_db(self.channel.volume)
         self.balance_adjustment.set_value(self.channel.balance)
 
-    def midi_change_callback(self, *args):
-        # the changes are not applied directly to the widgets as they
-        # absolutely have to be done from the gtk thread.
-        self.emit('midi-event-received')
-
     def on_monitor_button_toggled(self, button):
         if not button.get_active():
             self.app.main_mix.monitor_button.set_active(True)
@@ -283,10 +282,6 @@ class Channel(gtk.VBox, SerializedObject):
             self.app.set_monitored_channel(self)
         self.monitor_button.set_active(True)
 
-gobject.signal_new('midi-event-received', Channel,
-                gobject.SIGNAL_RUN_FIRST | gobject.SIGNAL_ACTION,
-                gobject.TYPE_NONE, ())
-
 class InputChannel(Channel):
     post_fader_output_channel = None
 
@@ -303,7 +298,6 @@ class InputChannel(Channel):
         if self.future_balance_midi_cc:
             self.channel.balance_midi_cc = self.future_balance_midi_cc
         self.channel.midi_scale = self.slider_scale.scale
-        self.channel.midi_change_callback = self.midi_change_callback
 
         self.on_volume_changed(self.slider_adjustment)
         self.on_balance_changed(self.balance_adjustment)
@@ -533,7 +527,6 @@ class OutputChannel(Channel):
         Channel.realize(self)
 
         self.channel.midi_scale = self.slider_scale.scale
-        self.channel.midi_change_callback = self.midi_change_callback
 
         self.on_volume_changed(self.slider_adjustment)
         self.on_balance_changed(self.balance_adjustment)
@@ -672,7 +665,6 @@ class MainMixChannel(Channel):
         Channel.realize(self)
         self.channel = self.mixer.main_mix_channel
         self.channel.midi_scale = self.slider_scale.scale
-        self.channel.midi_change_callback = self.midi_change_callback
 
         self.on_volume_changed(self.slider_adjustment)
         self.on_balance_changed(self.balance_adjustment)
index 67a643fd2f5db66c2fa3633ad99b78767925204e..94a7ec5024c77e23b899535d464e667f62bea3fa 100644 (file)
@@ -85,6 +85,7 @@ struct channel
   jack_default_audio_sample_t * left_buffer_ptr;
   jack_default_audio_sample_t * right_buffer_ptr;
 
+  bool midi_got_events;
   void (*midi_change_callback) (void*);
   void *midi_change_callback_data;
 
@@ -543,6 +544,15 @@ channel_set_midi_change_callback(
   channel_ptr->midi_change_callback_data = user_data;
 }
 
+bool
+channel_get_midi_got_events(
+  jack_mixer_channel_t channel)
+{
+  bool t = channel_ptr->midi_got_events;
+  channel_ptr->midi_got_events = false;
+  return t;
+}
+
 #undef channel_ptr
 
 /* process input channels and mix them into main mix */
@@ -909,6 +919,7 @@ process(
 
       calc_channel_volumes(channel_ptr);
 
+      channel_ptr->midi_got_events = true;
       if (channel_ptr->midi_change_callback)
         channel_ptr->midi_change_callback(channel_ptr->midi_change_callback_data);
 
index e157d5b3f51d0ac3b0db595b80cc3f969d159fc4..c861bd53183a838c5d17be40fa302e376890bfed 100644 (file)
@@ -181,6 +181,10 @@ channel_set_midi_scale(
   jack_mixer_channel_t channel,
   jack_mixer_scale_t scale);
 
+bool
+channel_get_midi_got_events(
+  jack_mixer_channel_t channel);
+
 jack_mixer_scale_t
 scale_create();
 
index 15e497e418ff01dd7b5950134f2db325c7a6ece3..b00d3849ad7da024789f2f5a1336e95ebe4efa1d 100755 (executable)
@@ -201,6 +201,8 @@ class JackMixer(SerializedObject):
 
         gobject.timeout_add(200, self.lash_check_events)
 
+        gobject.timeout_add(50, self.midi_events_check)
+
     def sighandler(self, signum, frame):
         #print "Signal %d received" % signum
         if signum == signal.SIGUSR1:
@@ -443,6 +445,11 @@ class JackMixer(SerializedObject):
             channel.read_meter()
         return True
 
+    def midi_events_check(self):
+        for channel in self.channels + [self.main_mix] + self.output_channels:
+            channel.midi_events_check()
+        return True
+
     def add_output_channel(self, name, stereo, volume_cc, balance_cc, display_solo_buttons):
         try:
             channel = OutputChannel(self, name, stereo)
index cab58701c51f591d303f46e4e20a671f5ca08e70..d1e3229e1e3ecb6c26a37298f286232cd112c675 100644 (file)
@@ -437,6 +437,21 @@ Channel_set_volume_midi_cc(ChannelObject *self, PyObject *value, void *closure)
        return -1;
 }
 
+static PyObject*
+Channel_get_midi_got_events(ChannelObject *self, void *closure)
+{
+       PyObject *result;
+
+       if (channel_get_midi_got_events(self->channel)) {
+               result = Py_True;
+       } else {
+               result = Py_False;
+       }
+       Py_INCREF(result);
+       return result;
+}
+
+
 static PyGetSetDef Channel_getseters[] = {
        {"is_stereo", 
                (getter)Channel_get_is_stereo, NULL,
@@ -478,6 +493,9 @@ static PyGetSetDef Channel_getseters[] = {
                (getter)Channel_get_volume_midi_cc,
                (setter)Channel_set_volume_midi_cc,
                "Volume MIDI CC", NULL},
+       {"midi_got_events",
+               (getter)Channel_get_midi_got_events, NULL,
+               "Got new MIDI events", NULL},
        {NULL}
 };