From c3a2f704c9226e2d871a91a3d9699b50ef82c7c8 Mon Sep 17 00:00:00 2001 From: David Robillard Date: Fri, 23 Oct 2009 20:11:56 +0000 Subject: [PATCH] Fix sketchy casts. git-svn-id: svn://localhost/ardour2/branches/3.0@5893 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/automatable.h | 4 ++-- libs/ardour/automatable.cc | 28 +++++++++++++++++++++++----- 2 files changed, 25 insertions(+), 7 deletions(-) diff --git a/libs/ardour/ardour/automatable.h b/libs/ardour/ardour/automatable.h index 90250abf52..7bfd43ec02 100644 --- a/libs/ardour/ardour/automatable.h +++ b/libs/ardour/ardour/automatable.h @@ -90,8 +90,8 @@ public: typedef Evoral::ControlSet::Controls Controls; - Evoral::ControlSet& data() { return *this; } - const Evoral::ControlSet& data() const { return *this; } + Evoral::ControlSet& data() { return *dynamic_cast(this); } + const Evoral::ControlSet& data() const { return *dynamic_cast(this); } int set_automation_state (const XMLNode&, Evoral::Parameter default_param); XMLNode& get_automation_state(); diff --git a/libs/ardour/automatable.cc b/libs/ardour/automatable.cc index 85f083ca37..1ef39a61f0 100644 --- a/libs/ardour/automatable.cc +++ b/libs/ardour/automatable.cc @@ -408,21 +408,39 @@ Automatable::control_factory(const Evoral::Parameter& param) boost::shared_ptr list(new AutomationList(param)); Evoral::Control* control = NULL; if (param.type() >= MidiCCAutomation && param.type() <= MidiChannelPressureAutomation) { - control = new MidiTrack::MidiControl((MidiTrack*)this, param); + MidiTrack* mt = dynamic_cast(this); + if (mt) { + control = new MidiTrack::MidiControl(mt, param); + } else { + warning << "MidiCCAutomation for non-MidiTrack" << endl; + } } else if (param.type() == PluginAutomation) { - control = new PluginInsert::PluginControl((PluginInsert*)this, param); + PluginInsert* pi = dynamic_cast(this); + if (pi) { + control = new PluginInsert::PluginControl(pi, param); + } else { + warning << "PluginAutomation for non-Plugin" << endl; + } } else if (param.type() == GainAutomation) { - control = new Amp::GainControl( X_("gaincontrol"), _a_session, (Amp*)this, param); + Amp* amp = dynamic_cast(this); + if (amp) { + control = new Amp::GainControl(X_("gaincontrol"), _a_session, amp, param); + } else { + warning << "GainAutomation for non-Amp" << endl; + } } else if (param.type() == PanAutomation) { Panner* me = dynamic_cast(this); if (me) { control = new Panner::PanControllable(me->session(), X_("panner"), *me, param); } else { - cerr << "ERROR: PanAutomation for non-Panner" << endl; + warning << "PanAutomation for non-Panner" << endl; } - } else { + } + + if (!control) { control = new AutomationControl(_a_session, param); } + control->set_list(list); return boost::shared_ptr(control); } -- 2.30.2