use ForGroup to flag and detect route-group based control changes
[ardour.git] / libs / ardour / automatable.cc
index 0b316890bc354eedd8163de49fac0dc0a788f071..3c5d610ce88eaf7f1b4ffccfca4d8846741c18fd 100644 (file)
@@ -28,6 +28,7 @@
 #include "ardour/amp.h"
 #include "ardour/automatable.h"
 #include "ardour/event_type_map.h"
+#include "ardour/gain_control.h"
 #include "ardour/midi_track.h"
 #include "ardour/pan_controllable.h"
 #include "ardour/pannable.h"
@@ -394,16 +395,21 @@ Automatable::transport_stopped (framepos_t now)
                   when the transport is re-started, a touch will magically
                   be happening without it ever have being started in the usual way.
                */
+               const bool list_did_write = !l->in_new_write_pass ();
+
                l->stop_touch (true, now);
-               l->write_pass_finished (now, Config->get_automation_thinning_factor());
 
-               if (l->automation_playback()) {
-                       c->set_value(c->list()->eval(now));
-               }
+               c->commit_transaction (list_did_write);
+
+               l->write_pass_finished (now, Config->get_automation_thinning_factor ());
 
-               if (l->automation_state() == Write) {
+               if (l->automation_state () == Write) {
                        l->set_automation_state (Touch);
                }
+
+               if (l->automation_playback ()) {
+                       c->set_value_unchecked (c->list ()->eval (now));
+               }
        }
 }
 
@@ -444,19 +450,9 @@ Automatable::control_factory(const Evoral::Parameter& param)
                        warning << "PluginPropertyAutomation for non-Plugin" << endl;
                }
        } else if (param.type() == GainAutomation) {
-               Amp* amp = dynamic_cast<Amp*>(this);
-               if (amp) {
-                       control = new Amp::GainControl(X_("gaincontrol"), _a_session, amp, param);
-               } else {
-                       warning << "GainAutomation for non-Amp" << endl;
-               }
+               control = new GainControl(_a_session, param);
        } else if (param.type() == TrimAutomation) {
-               Amp* amp = dynamic_cast<Amp*>(this);
-               if (amp) {
-                       control = new Amp::GainControl(X_("trimcontrol"), _a_session, amp, param);
-               } else {
-                       warning << "TrimAutomation for non-Amp" << endl;
-               }
+               control = new GainControl(_a_session, param);
        } else if (param.type() == PanAzimuthAutomation || param.type() == PanWidthAutomation || param.type() == PanElevationAutomation) {
                Pannable* pannable = dynamic_cast<Pannable*>(this);
                if (pannable) {