Fix DSP load sorting with inactive plugins
[ardour.git] / gtk2_ardour / automation_time_axis.cc
index 8e74774e79cc30d9cf699b7ac67608ad4675bd35..17e4877f3a8daeb8eb9b48c3c8ba1cc7d3e48557 100644 (file)
@@ -1,21 +1,32 @@
 /*
-    Copyright (C) 2000-2007 Paul Davis
-
-    This program is free software; you can redistribute it and/or modify
-    it under the terms of the GNU General Public License as published by
-    the Free Software Foundation; either version 2 of the License, or
-    (at your option) any later version.
-
-    This program is distributed in the hope that it will be useful,
-    but WITHOUT ANY WARRANTY; without even the implied warranty of
-    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-    GNU General Public License for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with this program; if not, write to the Free Software
-    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
+ * Copyright (C) 2005-2006 Taybin Rutkin <taybin@taybin.com>
+ * Copyright (C) 2005-2017 Paul Davis <paul@linuxaudiosystems.com>
+ * Copyright (C) 2005 Karsten Wiese <fzuuzf@googlemail.com>
+ * Copyright (C) 2006-2007 Doug McLain <doug@nostar.net>
+ * Copyright (C) 2006 Hans Fugal <hans@fugal.net>
+ * Copyright (C) 2007-2012 Carl Hetherington <carl@carlh.net>
+ * Copyright (C) 2007-2015 David Robillard <d@drobilla.net>
+ * Copyright (C) 2009 Hans Baier <hansfbaier@googlemail.com>
+ * Copyright (C) 2014-2015 Ben Loftis <ben@harrisonconsoles.com>
+ * Copyright (C) 2014-2017 Nick Mainsbridge <mainsbridge@gmail.com>
+ * Copyright (C) 2014-2017 Robin Gareus <robin@gareus.org>
+ * Copyright (C) 2015-2017 Tim Mayberry <mojofunk@gmail.com>
+ * Copyright (C) 2016 Julien "_FrnchFrgg_" RIVAUD <frnchfrgg@free.fr>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
 
 #include <utility>
 
@@ -31,7 +42,7 @@
 #include "pbd/unwind.h"
 
 #include "ardour/automation_control.h"
-#include "ardour/beats_frames_converter.h"
+#include "ardour/beats_samples_converter.h"
 #include "ardour/event_type_map.h"
 #include "ardour/parameter_types.h"
 #include "ardour/profile.h"
@@ -321,6 +332,7 @@ AutomationTimeAxisView::~AutomationTimeAxisView ()
                cleanup_gui_properties ();
        }
        delete _view;
+       CatchDeletion (this);
 }
 
 void
@@ -726,7 +738,7 @@ AutomationTimeAxisView::build_display_menu ()
 }
 
 void
-AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame, double y, bool with_guard_points)
+AutomationTimeAxisView::add_automation_event (GdkEvent* event, samplepos_t sample, double y, bool with_guard_points)
 {
        if (!_line) {
                return;
@@ -741,14 +753,14 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame,
                return;
        }
 
-       MusicFrame when (frame, 0);
+       MusicSample when (sample, 0);
        _editor.snap_to_with_modifier (when, event);
 
        if (UIConfiguration::instance().get_new_automation_points_on_lane()) {
                if (_control->list()->size () == 0) {
                        y = _control->get_value ();
                } else {
-                       y = _control->list()->eval (when.frame);
+                       y = _control->list()->eval (when.sample);
                }
        } else {
                double x = 0;
@@ -762,12 +774,12 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame,
        XMLNode& before = list->get_state();
        std::list<Selectable*> results;
 
-       if (list->editor_add (when.frame, y, with_guard_points)) {
+       if (list->editor_add (when.sample, y, with_guard_points)) {
                XMLNode& after = list->get_state();
                _editor.begin_reversible_command (_("add automation event"));
                _session->add_command (new MementoCommand<ARDOUR::AutomationList> (*list.get (), &before, &after));
 
-               _line->get_selectables (when.frame, when.frame, 0.0, 1.0, results);
+               _line->get_selectables (when.sample, when.sample, 0.0, 1.0, results);
                _editor.get_selection ().set (results);
 
                _editor.commit_reversible_command ();
@@ -776,7 +788,7 @@ AutomationTimeAxisView::add_automation_event (GdkEvent* event, framepos_t frame,
 }
 
 bool
-AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t divisions)
+AutomationTimeAxisView::paste (samplepos_t pos, const Selection& selection, PasteContext& ctx, const int32_t divisions)
 {
        if (_line) {
                return paste_one (pos, ctx.count, ctx.times, selection, ctx.counts, ctx.greedy);
@@ -797,7 +809,7 @@ AutomationTimeAxisView::paste (framepos_t pos, const Selection& selection, Paste
 }
 
 bool
-AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float times, const Selection& selection, ItemCounts& counts, bool greedy)
+AutomationTimeAxisView::paste_one (samplepos_t pos, unsigned paste_count, float times, const Selection& selection, ItemCounts& counts, bool greedy)
 {
        boost::shared_ptr<AutomationList> alist(_line->the_list());
 
@@ -824,7 +836,7 @@ AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float t
 
        if (parameter_is_midi (src_type)) {
                // convert length to samples (incl tempo-ramps)
-               len = DoubleBeatsFramesConverter (_session->tempo_map(), pos).to (len * paste_count);
+               len = DoubleBeatsSamplesConverter (_session->tempo_map(), pos).to (len * paste_count);
                pos += _editor.get_paste_offset (pos, paste_count > 0 ? 1 : 0, len);
        } else {
                pos += _editor.get_paste_offset (pos, paste_count, len);
@@ -834,14 +846,14 @@ AutomationTimeAxisView::paste_one (framepos_t pos, unsigned paste_count, float t
        double const model_pos = _line->time_converter().from (pos - _line->time_converter().origin_b ());
 
        XMLNode &before = alist->get_state();
-       alist->paste (**p, model_pos, DoubleBeatsFramesConverter (_session->tempo_map(), pos));
+       alist->paste (**p, model_pos, DoubleBeatsSamplesConverter (_session->tempo_map(), pos));
        _session->add_command (new MementoCommand<AutomationList>(*alist.get(), &before, &alist->get_state()));
 
        return true;
 }
 
 void
-AutomationTimeAxisView::get_selectables (framepos_t start, framepos_t end, double top, double bot, list<Selectable*>& results, bool /*within*/)
+AutomationTimeAxisView::get_selectables (samplepos_t start, samplepos_t end, double top, double bot, list<Selectable*>& results, bool /*within*/)
 {
        if (!_line && !_view) {
                return;
@@ -997,35 +1009,6 @@ AutomationTimeAxisView::set_state (const XMLNode&, int /*version*/)
        return 0;
 }
 
-void
-AutomationTimeAxisView::what_has_visible_automation (const boost::shared_ptr<Automatable>& automatable, set<Evoral::Parameter>& visible)
-{
-       /* this keeps "knowledge" of how we store visibility information
-          in XML private to this class.
-       */
-
-       assert (automatable);
-
-       Automatable::Controls& controls (automatable->controls());
-
-       for (Automatable::Controls::iterator i = controls.begin(); i != controls.end(); ++i) {
-
-               boost::shared_ptr<AutomationControl> ac = boost::dynamic_pointer_cast<AutomationControl> (i->second);
-
-               if (ac && ac->alist()) {
-
-                       const XMLNode* gui_node = ac->extra_xml ("GUI");
-
-                       if (gui_node) {
-                               bool shown;
-                               if (gui_node->get_property ("shown", shown) && shown) {
-                                       visible.insert (i->first);
-                               }
-                       }
-               }
-       }
-}
-
 
 /** @return true if this view has any automation data to display */
 bool
@@ -1138,7 +1121,7 @@ AutomationTimeAxisView::cut_copy_clear_one (AutomationLine& line, Selection& sel
        XMLNode &before = alist->get_state();
 
        /* convert time selection to automation list model coordinates */
-       const Evoral::TimeConverter<double, ARDOUR::framepos_t>& tc = line.time_converter ();
+       const Evoral::TimeConverter<double, ARDOUR::samplepos_t>& tc = line.time_converter ();
        double const start = tc.from (selection.time.front().start - tc.origin_b ());
        double const end = tc.from (selection.time.front().end - tc.origin_b ());