Selection::get_stripables() needs to recurse into an Automatable's child Automatables when looking for for an Automation Control
It also needs renaming (to come)
This commit is contained in:
parent
86149840a1
commit
bcbdd858fa
@ -55,10 +55,27 @@ public:
|
|||||||
boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
|
boost::shared_ptr<Evoral::Control> control_factory(const Evoral::Parameter& id);
|
||||||
|
|
||||||
boost::shared_ptr<AutomationControl> automation_control (PBD::ID const & id) const;
|
boost::shared_ptr<AutomationControl> automation_control (PBD::ID const & id) const;
|
||||||
|
/* derived classes need to provide some way to search their own child
|
||||||
|
automatable's for a control. normally, we'd just make the method
|
||||||
|
above virtual, and let them override it. But that wouldn't
|
||||||
|
differentiate the "check children" and "just your own" cases.
|
||||||
|
|
||||||
|
We could theoretically just overload the above method with an extra
|
||||||
|
"bool recurse = default", but the rules of name hiding for C++ mean
|
||||||
|
that making a method virtual will hide other overloaded versions of
|
||||||
|
the same name. This means that virtual automation_control (PBD::ID
|
||||||
|
const &) would hide automation_control (Evoral::Parameter const &
|
||||||
|
id).
|
||||||
|
|
||||||
|
So, skip around all that with a different name.
|
||||||
|
*/
|
||||||
|
virtual boost::shared_ptr<AutomationControl> automation_control_recurse (PBD::ID const & id) const {
|
||||||
|
return automation_control (id);
|
||||||
|
}
|
||||||
|
|
||||||
boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) {
|
boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id) {
|
||||||
return automation_control (id, false);
|
return automation_control (id, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id, bool create_if_missing);
|
boost::shared_ptr<AutomationControl> automation_control (const Evoral::Parameter& id, bool create_if_missing);
|
||||||
boost::shared_ptr<const AutomationControl> automation_control (const Evoral::Parameter& id) const;
|
boost::shared_ptr<const AutomationControl> automation_control (const Evoral::Parameter& id) const;
|
||||||
|
|
||||||
|
@ -220,6 +220,8 @@ public:
|
|||||||
RoutePinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
|
RoutePinWindowProxy * pinmgr_proxy () const { return _pinmgr_proxy; }
|
||||||
void set_pingmgr_proxy (RoutePinWindowProxy* wp) { _pinmgr_proxy = wp ; }
|
void set_pingmgr_proxy (RoutePinWindowProxy* wp) { _pinmgr_proxy = wp ; }
|
||||||
|
|
||||||
|
boost::shared_ptr<AutomationControl> automation_control_recurse (PBD::ID const & id) const;
|
||||||
|
|
||||||
/* special processors */
|
/* special processors */
|
||||||
|
|
||||||
boost::shared_ptr<InternalSend> monitor_send() const { return _monitor_send; }
|
boost::shared_ptr<InternalSend> monitor_send() const { return _monitor_send; }
|
||||||
|
@ -5450,3 +5450,23 @@ Route::clear_all_solo_state ()
|
|||||||
{
|
{
|
||||||
_solo_control->clear_all_solo_state ();
|
_solo_control->clear_all_solo_state ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
boost::shared_ptr<AutomationControl>
|
||||||
|
Route::automation_control_recurse (PBD::ID const & id) const
|
||||||
|
{
|
||||||
|
boost::shared_ptr<AutomationControl> ac = Automatable::automation_control (id);
|
||||||
|
|
||||||
|
if (ac) {
|
||||||
|
return ac;
|
||||||
|
}
|
||||||
|
|
||||||
|
Glib::Threads::RWLock::ReaderLock lm (_processor_lock);
|
||||||
|
|
||||||
|
for (ProcessorList::const_iterator i = _processors.begin(); i != _processors.end(); ++i) {
|
||||||
|
if ((ac = (*i)->automation_control (id))) {
|
||||||
|
return ac;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return boost::shared_ptr<AutomationControl> ();
|
||||||
|
}
|
||||||
|
@ -217,9 +217,11 @@ CoreSelection::get_stripables (StripableAutomationControls& sc) const
|
|||||||
boost::shared_ptr<AutomationControl> c;
|
boost::shared_ptr<AutomationControl> c;
|
||||||
|
|
||||||
if (!s) {
|
if (!s) {
|
||||||
|
/* some global automation control, not owned by a Stripable */
|
||||||
c = session.automation_control_by_id ((*x).controllable);
|
c = session.automation_control_by_id ((*x).controllable);
|
||||||
} else {
|
} else {
|
||||||
c = s->automation_control ((*x).controllable);
|
/* automation control owned by a Stripable or one of its children */
|
||||||
|
c = s->automation_control_recurse ((*x).controllable);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s || c) {
|
if (s || c) {
|
||||||
|
Loading…
Reference in New Issue
Block a user