summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2008-12-19 18:08:35 +0000
committerCarl Hetherington <carl@carlh.net>2008-12-19 18:08:35 +0000
commit331de3dc38e4f8b94fc1ddf224349a4afb91cc75 (patch)
treedb93fbe8388ab10f8c5367a0ba6719ee1c279513
parentf6469439f9e07a3ff4f0ec9eadc59b85284e3c0e (diff)
Fix visibility of automation tracks on reloading sessions.
git-svn-id: svn://localhost/ardour2/branches/3.0@4334 d708f5d6-7413-0410-9779-e7cbd77b26cf
-rw-r--r--gtk2_ardour/audio_time_axis.cc49
-rw-r--r--gtk2_ardour/audio_time_axis.h2
-rw-r--r--gtk2_ardour/automation_time_axis.cc31
-rw-r--r--gtk2_ardour/route_time_axis.cc19
4 files changed, 55 insertions, 46 deletions
diff --git a/gtk2_ardour/audio_time_axis.cc b/gtk2_ardour/audio_time_axis.cc
index aa02977581..2c03a451d8 100644
--- a/gtk2_ardour/audio_time_axis.cc
+++ b/gtk2_ardour/audio_time_axis.cc
@@ -85,8 +85,6 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
_view = new AudioStreamView (*this);
- create_automation_child (GainAutomation, false);
-
ignore_toggle = false;
mute_button->set_active (false);
@@ -101,14 +99,19 @@ AudioTimeAxisView::AudioTimeAxisView (PublicEditor& ed, Session& sess, boost::sh
ensure_xml_node ();
set_state (*xml_node);
+
+ /* if set_state above didn't create a gain automation child, we need to make one */
+ if (automation_track (GainAutomation) == 0) {
+ create_automation_child (GainAutomation, false);
+ }
- _route->panner().Changed.connect (bind (mem_fun(*this, &AudioTimeAxisView::update_pans), false));
+ _route->panner().Changed.connect (bind (mem_fun(*this, &AudioTimeAxisView::ensure_pan_views), false));
/* map current state of the route */
processors_changed ();
reset_processor_automation_curves ();
- update_pans (false);
+ ensure_pan_views (false);
update_control_names ();
if (is_audio_track()) {
@@ -342,20 +345,24 @@ AudioTimeAxisView::create_automation_child (const Evoral::Parameter& param, bool
} else if (param.type() == PanAutomation) {
ensure_xml_node ();
- update_pans (show);
+ ensure_pan_views (show);
} else {
error << "AudioTimeAxisView: unknown automation child " << EventTypeMap::instance().to_symbol(param) << endmsg;
}
}
+/** Ensure that we have the appropriate AutomationTimeAxisViews for the
+ * panners that we have.
+ *
+ * @param show true to show any new views that we create, otherwise false.
+ */
void
-AudioTimeAxisView::update_pans (bool show)
+AudioTimeAxisView::ensure_pan_views (bool show)
{
const set<Evoral::Parameter>& params = _route->panner().what_can_be_automated();
set<Evoral::Parameter>::iterator p;
- uint32_t i = 0;
for (p = params.begin(); p != params.end(); ++p) {
boost::shared_ptr<ARDOUR::AutomationControl> pan_control
= boost::dynamic_pointer_cast<ARDOUR::AutomationControl>(
@@ -366,15 +373,25 @@ AudioTimeAxisView::update_pans (bool show)
continue;
}
- boost::shared_ptr<AutomationTimeAxisView> pan_track(new AutomationTimeAxisView (_session,
- _route, _route, pan_control,
- editor,
- *this,
- false,
- parent_canvas,
- _route->describe_parameter(pan_control->parameter())));
- add_automation_child(*p, pan_track, show);
- ++i;
+ if (automation_child (pan_control->parameter ()).get () == 0) {
+
+ /* we don't already have an AutomationTimeAxisView for this parameter */
+
+ std::string const name = _route->describe_parameter (pan_control->parameter ());
+
+ boost::shared_ptr<AutomationTimeAxisView> pan_track (
+ new AutomationTimeAxisView (_session,
+ _route, _route, pan_control,
+ editor,
+ *this,
+ false,
+ parent_canvas,
+ name)
+
+ );
+
+ add_automation_child (*p, pan_track, show);
+ }
}
}
#if 0
diff --git a/gtk2_ardour/audio_time_axis.h b/gtk2_ardour/audio_time_axis.h
index 133a84e590..f3bdbd3fb6 100644
--- a/gtk2_ardour/audio_time_axis.h
+++ b/gtk2_ardour/audio_time_axis.h
@@ -110,7 +110,7 @@ class AudioTimeAxisView : public RouteTimeAxisView
void gain_hidden ();
void pan_hidden ();
- void update_pans (bool show=true);
+ void ensure_pan_views (bool show = true);
void update_control_names ();
Gtk::CheckMenuItem* waveform_item;
diff --git a/gtk2_ardour/automation_time_axis.cc b/gtk2_ardour/automation_time_axis.cc
index f0bcaa30ba..b838931cd1 100644
--- a/gtk2_ardour/automation_time_axis.cc
+++ b/gtk2_ardour/automation_time_axis.cc
@@ -49,6 +49,7 @@ Pango::FontDescription* AutomationTimeAxisView::name_font = 0;
bool AutomationTimeAxisView::have_name_font = false;
const string AutomationTimeAxisView::state_node_name = "AutomationChild";
+
/** \a a the automatable object this time axis is to display data for.
* For route/track automation (e.g. gain) pass the route for both \r and \a.
* For route child (e.g. plugin) automation, pass the child for \a.
@@ -862,31 +863,19 @@ int
AutomationTimeAxisView::set_state (const XMLNode& node)
{
TimeAxisView::set_state (node);
-
- XMLNodeList kids;
- XMLNodeConstIterator iter;
-
- kids = node.children ();
-
- for (iter = kids.begin(); iter != kids.end(); ++iter) {
-
- if ((*iter)->name() == state_node_name) {
- XMLProperty* type = (*iter)->property("automation-id");
-
- if (type && type->value() == ARDOUR::EventTypeMap::instance().to_symbol(_control->parameter())) {
- XMLProperty *shown = (*iter)->property("shown-editor");
- if (shown && shown->value() == "yes") {
- set_marked_for_display(true);
- canvas_display->show(); /* FIXME: necessary? show_at? */
- }
- break;
- }
+ XMLProperty const * type = node.property ("automation-id");
+ if (type && type->value () == ARDOUR::EventTypeMap::instance().to_symbol (_control->parameter())) {
+ XMLProperty const * shown = node.property ("shown");
+ if (shown && shown->value () == "yes") {
+ set_marked_for_display (true);
+ canvas_display->show (); /* FIXME: necessary? show_at? */
}
}
-
- if (!_marked_for_display)
+
+ if (!_marked_for_display) {
hide();
+ }
return 0;
}
diff --git a/gtk2_ardour/route_time_axis.cc b/gtk2_ardour/route_time_axis.cc
index 09683f314c..37ad45bbfc 100644
--- a/gtk2_ardour/route_time_axis.cc
+++ b/gtk2_ardour/route_time_axis.cc
@@ -426,6 +426,7 @@ RouteTimeAxisView::set_state (const XMLNode& node)
for (iter = kids.begin(); iter != kids.end(); ++iter) {
if ((*iter)->name() == AutomationTimeAxisView::state_node_name) {
if ((prop = (*iter)->property ("automation-id")) != 0) {
+
Evoral::Parameter param = ARDOUR::EventTypeMap::instance().new_parameter(prop->value());
bool show = ((prop = (*iter)->property ("shown")) != 0) && prop->value() == "yes";
create_automation_child(param, show);
@@ -434,6 +435,7 @@ RouteTimeAxisView::set_state (const XMLNode& node)
}
}
}
+
return 0;
}
@@ -1249,25 +1251,26 @@ RouteTimeAxisView::show_automation(Evoral::Parameter param)
return (_show_automation.find(param) != _show_automation.end());
}
-/** Retuns NULL if track for \a param doesn't exist.
+/** Retuns 0 if track for \a param doesn't exist.
*/
RouteTimeAxisView::RouteAutomationNode*
-RouteTimeAxisView::automation_track(Evoral::Parameter param)
+RouteTimeAxisView::automation_track (Evoral::Parameter param)
{
- map<Evoral::Parameter, RouteAutomationNode*>::iterator i = _automation_tracks.find(param);
+ map<Evoral::Parameter, RouteAutomationNode*>::iterator i = _automation_tracks.find (param);
- if (i != _automation_tracks.end())
+ if (i != _automation_tracks.end()) {
return i->second;
- else
- return NULL;
+ } else {
+ return 0;
+ }
}
/** Shorthand for GainAutomation, etc.
*/
RouteTimeAxisView::RouteAutomationNode*
-RouteTimeAxisView::automation_track(AutomationType type)
+RouteTimeAxisView::automation_track (AutomationType type)
{
- return automation_track(Evoral::Parameter(type));
+ return automation_track (Evoral::Parameter(type));
}
RouteGroup*