#include "ardour/automation_list.h"
#include "ardour/control_group_member.h"
#include "ardour/parameter_descriptor.h"
+#include "ardour/session_handle.h"
#include "ardour/libardour_visibility.h"
, public Evoral::Control
, public boost::enable_shared_from_this<AutomationControl>
, public ControlGroupMember
+ , public SessionHandleRef
{
public:
AutomationControl(ARDOUR::Session&,
ControlList grouped_controls () const;
protected:
- ARDOUR::Session& _session;
boost::shared_ptr<ControlGroup> _group;
const ParameterDescriptor _desc;
/* this will be invoked in turn on behalf of the group or the control by itself */
virtual void do_pre_realtime_queue_stuff (double new_value) {}
+ void session_going_away ();
+
private:
/* I am unclear on why we have to make ControlGroup a friend in order
to get access to the ::set_group() method when it is already
friend class ControlGroup;
void set_group (boost::shared_ptr<ControlGroup>);
PBD::ScopedConnection _state_changed_connection;
+ bool _no_session;
};
: Controllable (name.empty() ? EventTypeMap::instance().to_symbol(parameter) : name, flags)
, Evoral::Control(parameter, desc, list)
- , _session(session)
+ , SessionHandleRef (session)
, _desc(desc)
+ , _no_session(false)
{
if (_desc.toggled) {
set_flags (Controllable::Toggle);
AutomationControl::~AutomationControl ()
{
- if (!_session.deletion_in_progress ()) {
+ if (!_no_session && !_session.deletion_in_progress ()) {
_session.selection().remove_control_by_id (id());
+ DropReferences (); /* EMIT SIGNAL */
}
+}
+
+void
+AutomationControl::session_going_away ()
+{
+ SessionHandleRef::session_going_away ();
DropReferences (); /* EMIT SIGNAL */
+ _no_session = true;
}
bool
double
AutomationControl::get_value() const
{
- bool from_list = _list && boost::dynamic_pointer_cast<AutomationList>(_list)->automation_playback();
+ bool from_list = alist() && alist()->automation_playback();
return Control::get_double (from_list, _session.transport_frame());
}
void
AutomationControl::actually_set_value (double value, PBD::Controllable::GroupControlDisposition gcd)
{
- boost::shared_ptr<AutomationList> al = boost::dynamic_pointer_cast<AutomationList> (_list);
+ boost::shared_ptr<AutomationList> al = alist ();
const framepos_t pos = _session.transport_frame();
bool to_list;
if (flags() & NotAutomatable) {
return;
}
- if (_list && as != alist()->automation_state()) {
+ if (alist() && as != alist()->automation_state()) {
const double val = get_value ();