Fix sketchy casts.
authorDavid Robillard <d@drobilla.net>
Fri, 23 Oct 2009 20:11:56 +0000 (20:11 +0000)
committerDavid Robillard <d@drobilla.net>
Fri, 23 Oct 2009 20:11:56 +0000 (20:11 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@5893 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/automatable.h
libs/ardour/automatable.cc

index 90250abf525214c78f02d5d02c2e434bb5606891..7bfd43ec022be6297152d96d64c29fd036054e08 100644 (file)
@@ -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<Evoral::ControlSet*>(this); }
+       const Evoral::ControlSet& data() const { return *dynamic_cast<const Evoral::ControlSet*>(this); }
 
        int set_automation_state (const XMLNode&, Evoral::Parameter default_param);
        XMLNode& get_automation_state();
index 85f083ca370c8035b9c1e2c980ebafc9d6c21206..1ef39a61f0df82dfd81f9481b214c1c336cd9641 100644 (file)
@@ -408,21 +408,39 @@ Automatable::control_factory(const Evoral::Parameter& param)
        boost::shared_ptr<AutomationList> 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<MidiTrack*>(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<PluginInsert*>(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<Amp*>(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<Panner*>(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<Evoral::Control>(control);
 }