fix ChanCount min/max
[ardour.git] / libs / ardour / midi_track.cc
index c49a2ef7f1afbb227327104cb796f0238cfd62d8..da47fabc78c8a13f850396ecefb333f85587c796 100644 (file)
@@ -48,6 +48,7 @@
 #include "ardour/port.h"
 #include "ardour/processor.h"
 #include "ardour/profile.h"
+#include "ardour/route_group_specialized.h"
 #include "ardour/session.h"
 #include "ardour/session_playlists.h"
 #include "ardour/utils.h"
@@ -103,23 +104,23 @@ MidiTrack::create_diskstream ()
 
 
 void
-MidiTrack::set_record_enabled (bool yn, void *src)
+MidiTrack::set_record_enabled (bool yn, Controllable::GroupControlDisposition group_override)
 {
        if (_step_editing) {
                return;
        }
 
-       Track::set_record_enabled (yn, src);
+       Track::set_record_enabled (yn, group_override);
 }
 
 void
-MidiTrack::set_record_safe (bool yn, void *src)
+MidiTrack::set_record_safe (bool yn, Controllable::GroupControlDisposition group_override)
 {
        if (_step_editing) { /* REQUIRES REVIEW */
                return;
        }
 
-       Track::set_record_safe (yn, src);
+       Track::set_record_safe (yn, group_override);
 }
 
 void
@@ -394,6 +395,16 @@ MidiTrack::roll (pframes_t nframes, framepos_t start_frame, framepos_t end_frame
                return dret;
        }
 
+       if (_mute_control->list() && _mute_control->automation_playback()) {
+               bool        valid = false;
+               const float mute  = _mute_control->list()->rt_safe_eval(transport_frame, valid);
+               if (mute >= 0.5 && !muted()) {
+                       _mute_control->set_value_unchecked(1.0);  // mute
+               } else if (mute < 0.5 && muted()) {
+                       _mute_control->set_value_unchecked(0.0);  // unmute
+               }
+       }
+
        BufferSet& bufs = _session.get_route_buffers (n_process_buffers());
 
        fill_buffers_with_input (bufs, _input, nframes);
@@ -533,7 +544,7 @@ MidiTrack::non_realtime_locate (framepos_t pos)
                    (rcontrol = region->control(tcontrol->parameter()))) {
                        const Evoral::Beats pos_beats = bfc.from(pos - origin);
                        if (rcontrol->list()->size() > 0) {
-                               tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()));
+                               tcontrol->set_value(rcontrol->list()->eval(pos_beats.to_double()), Controllable::NoGroup);
                        }
                }
        }
@@ -715,15 +726,22 @@ MidiTrack::set_parameter_automation_state (Evoral::Parameter param, AutoState st
 }
 
 void
-MidiTrack::MidiControl::set_value(double val)
+MidiTrack::MidiControl::set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
 {
        if (writable()) {
-               set_value_unchecked (val);
+               _set_value (val, group_override);
        }
 }
 
 void
-MidiTrack::MidiControl::set_value_unchecked(double val)
+MidiTrack::MidiControl::set_value_unchecked (double val)
+{
+       /* used only by automation playback */
+       _set_value (val, Controllable::NoGroup);
+}
+
+void
+MidiTrack::MidiControl::_set_value (double val, PBD::Controllable::GroupControlDisposition group_override)
 {
        const Evoral::Parameter &parameter = _list ? _list->parameter() : Control::parameter();
        const Evoral::ParameterDescriptor &desc = EventTypeMap::instance().descriptor(parameter);
@@ -780,7 +798,7 @@ MidiTrack::MidiControl::set_value_unchecked(double val)
                _route->write_immediate_event(size,  ev);
        }
 
-       AutomationControl::set_value(val);
+       AutomationControl::set_value(val, group_override);
 }
 
 void
@@ -935,16 +953,21 @@ MidiTrack::act_on_mute ()
                }
 
                /* Resolve active notes. */
-               midi_diskstream()->resolve_tracker(_immediate_events, 0);
+               midi_diskstream()->resolve_tracker(_immediate_events, Port::port_offset());
        }
 }
 
 void
-MidiTrack::set_monitoring (MonitorChoice mc)
+MidiTrack::set_monitoring (MonitorChoice mc, Controllable::GroupControlDisposition gcd)
 {
+       if (use_group (gcd, &RouteGroup::is_monitoring)) {
+               _route_group->apply (&Track::set_monitoring, mc, Controllable::NoGroup);
+               return;
+       }
+
        if (mc != _monitoring) {
 
-               Track::set_monitoring (mc);
+               Track::set_monitoring (mc, gcd);
 
                /* monitoring state changed, so flush out any on notes at the
                 * port level.