Mark Sequence as edited when one of its parent ControlSet's ControlLists is changed.
authorCarl Hetherington <carl@carlh.net>
Mon, 12 Jul 2010 00:41:45 +0000 (00:41 +0000)
committerCarl Hetherington <carl@carlh.net>
Mon, 12 Jul 2010 00:41:45 +0000 (00:41 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7404 d708f5d6-7413-0410-9779-e7cbd77b26cf

12 files changed:
libs/ardour/ardour/automatable.h
libs/ardour/ardour/automation_list.h
libs/ardour/automatable.cc
libs/ardour/automation_list.cc
libs/evoral/evoral/Control.hpp
libs/evoral/evoral/ControlList.hpp
libs/evoral/evoral/ControlSet.hpp
libs/evoral/evoral/Sequence.hpp
libs/evoral/src/Control.cpp
libs/evoral/src/ControlList.cpp
libs/evoral/src/ControlSet.cpp
libs/evoral/src/Sequence.cpp

index 79bbec51995ed359a1d6b919e6ae23932f5073d8..2f35fc6b42c1f97178a160fbcb2a0a2f3fd4ff53 100644 (file)
@@ -58,6 +58,7 @@ public:
        automation_control (const Evoral::Parameter& id) const;
 
        virtual void add_control(boost::shared_ptr<Evoral::Control>);
+       void clear_controls ();
 
        virtual void automation_snapshot(nframes_t now, bool force);
        virtual void transport_stopped (sframes_t now);
index 79acedebf39f4efe0e395f9a0785e7a14ea1c982..77b8d49dc71b6e5f9031a69cc277ee095f7b6f7c 100644 (file)
@@ -51,7 +51,6 @@ class AutomationList : public PBD::StatefulDestructible, public Evoral::ControlL
        bool operator== (const AutomationList&);
 
        void thaw ();
-       void mark_dirty () const;
 
        void set_automation_state (AutoState);
        AutoState automation_state() const { return _state; }
@@ -71,7 +70,6 @@ class AutomationList : public PBD::StatefulDestructible, public Evoral::ControlL
        PBD::Signal0<void> StateChanged;
 
        static PBD::Signal1<void,AutomationList*> AutomationListCreated;
-       mutable PBD::Signal0<void> Dirty;
 
        void start_touch ();
        void stop_touch ();
index 1e5b497bf7458901beb362a5e4c27f644e246505..bed99d56603abc5b31b5ae3d4f106c853d89532a 100644 (file)
@@ -484,3 +484,11 @@ Automatable::automation_state_changed (Evoral::Parameter const & p)
 {
        AutomationStateChanged (p); /* EMIT SIGNAL */
 }
+
+void
+Automatable::clear_controls ()
+{
+       _control_connections.drop_connections ();
+       ControlSet::clear_controls ();
+}
+       
index f34104ce2228a29b1a17f9688434f23f793eeadc..e785104367a1e7cd7939cd1837505aecb315d997 100644 (file)
@@ -218,13 +218,6 @@ AutomationList::thaw ()
        }
 }
 
-void
-AutomationList::mark_dirty () const
-{
-       ControlList::mark_dirty ();
-       Dirty (); /* EMIT SIGNAL */
-}
-
 XMLNode&
 AutomationList::get_state ()
 {
index d79ef25b5a1c1238d165b6f222168f5d67d90abd..210ee7c32221dc55a36b0aa53aada566bebf6cb1 100644 (file)
@@ -22,6 +22,7 @@
 #include <set>
 #include <map>
 #include <boost/shared_ptr.hpp>
+#include "pbd/signals.h"
 #include "evoral/types.hpp"
 #include "evoral/Parameter.hpp"
 
@@ -55,10 +56,17 @@ public:
 
        inline const Parameter& parameter() const { return _parameter; }
 
+       /** Emitted when the our ControlList is marked dirty */
+       PBD::Signal0<void> ListMarkedDirty;
+
 protected:
        Parameter                      _parameter;
        boost::shared_ptr<ControlList> _list;
        float                          _user_value;
+       PBD::ScopedConnection          _list_marked_dirty_connection;
+
+private:
+       void list_marked_dirty ();
 };
 
 } // namespace Evoral
index d68b6a3e5f9fe0e273d2cdc3b891266636400a9e..5f842775eea4a318a266864e03b3286954034b77 100644 (file)
@@ -24,6 +24,7 @@
 #include <boost/pool/pool.hpp>
 #include <boost/pool/pool_alloc.hpp>
 #include <glibmm/thread.h>
+#include "pbd/signals.h"
 #include "evoral/types.hpp"
 #include "evoral/Parameter.hpp"
 
@@ -224,7 +225,7 @@ public:
        Curve&       curve()       { assert(_curve); return *_curve; }
        const Curve& curve() const { assert(_curve); return *_curve; }
 
-       virtual void mark_dirty () const;
+       void mark_dirty () const;
 
        enum InterpolationStyle {
                Discrete,
@@ -235,6 +236,9 @@ public:
        InterpolationStyle interpolation() const { return _interpolation; }
        void set_interpolation(InterpolationStyle style) { _interpolation = style; }
 
+       /** Emitted when mark_dirty() is called on this object */
+       mutable PBD::Signal0<void> Dirty;
+       
 protected:
 
        /** Called by unlocked_eval() to handle cases of 3 or more control points. */
index f0c6bd0807e2c564f72e4a9e30e8f936b8d19530..b775bb3b4bbf52e08a2d9d4dec9badb7a053409f 100644 (file)
@@ -24,6 +24,7 @@
 #include <boost/shared_ptr.hpp>
 #include <boost/utility.hpp>
 #include <glibmm/thread.h>
+#include "pbd/signals.h"
 #include "evoral/types.hpp"
 #include "evoral/Parameter.hpp"
 
@@ -67,8 +68,13 @@ public:
        Glib::Mutex& control_lock() const { return _control_lock; }
 
 protected:
+       virtual void control_list_marked_dirty () {}
+
        mutable Glib::Mutex _control_lock;
        Controls            _controls;
+
+private:
+       PBD::ScopedConnectionList _control_connections;
 };
 
 
index 1ad456b30274a33654f8f2ea3ad3d37c4dc0d866..3cddeb38cac2d92d582d9cb1f1d3e8227b1a0392 100644 (file)
@@ -79,6 +79,7 @@ protected:
        };
 
 public:
+
         typedef typename boost::shared_ptr<Evoral::Note<Time> >  NotePtr;
         typedef typename boost::shared_ptr<const Evoral::Note<Time> >  constNotePtr;
 
@@ -274,6 +275,8 @@ private:
         void get_notes_by_pitch (Notes&, NoteOperator, uint8_t val, int chan_mask = 0) const;
         void get_notes_by_velocity (Notes&, NoteOperator, uint8_t val, int chan_mask = 0) const;
 
+       void control_list_marked_dirty ();
+
        const TypeMap& _type_map;
 
         Notes   _notes;       // notes indexed by time
@@ -283,9 +286,6 @@ private:
        typedef std::multiset<NotePtr, EarlierNoteComparator> WriteNotes;
        WriteNotes _write_notes[16];
 
-       typedef std::vector< boost::shared_ptr<const ControlList> > ControlLists;
-       ControlLists _dirty_controls;
-
        const   const_iterator _end_iter;
        bool                   _percussive;
 
index 56277678baeae16012798c32c89cf911e3ebc717..985c7b13520aaf1ba4c0a809e7bb6688a203f54a 100644 (file)
@@ -26,9 +26,9 @@ Parameter::TypeMetadata Parameter::_type_metadata;
 
 Control::Control(const Parameter& parameter, boost::shared_ptr<ControlList> list)
        : _parameter(parameter)
-       , _list(list)
        , _user_value(list ? list->default_value() : parameter.normal())
 {
+       set_list (list);
 }
 
 
@@ -59,7 +59,19 @@ Control::set_float(float value, bool to_list, FrameTime frame)
 void
 Control::set_list(boost::shared_ptr<ControlList> list)
 {
+       _list_marked_dirty_connection.disconnect ();
+       
        _list = list;
+
+       if (_list) {
+               _list->Dirty.connect_same_thread (_list_marked_dirty_connection, boost::bind (&Control::list_marked_dirty, this));
+       }
+}
+
+void
+Control::list_marked_dirty ()
+{
+       ListMarkedDirty (); /* EMIT SIGNAL */
 }
 
 } // namespace Evoral
index 00b876d18a14a2097ac2197568e96d769a130b25..3eb6c7d4ce969db3520a1b148509ab15584e0e31 100644 (file)
@@ -558,8 +558,12 @@ ControlList::mark_dirty () const
 {
        _lookup_cache.left = -1;
        _search_cache.left = -1;
-       if (_curve)
+
+       if (_curve) {
                _curve->mark_dirty();
+       }
+
+       Dirty (); /* EMIT SIGNAL */
 }
 
 void
index e19acf7689fa8447ea7f731493b87121e3c7d02f..d985e347d74c86873fc6bfc27e037ae13367b24d 100644 (file)
@@ -41,6 +41,8 @@ void
 ControlSet::add_control(boost::shared_ptr<Control> ac)
 {
        _controls[ac->parameter()] = ac;
+
+       ac->ListMarkedDirty.connect_same_thread (_control_connections, boost::bind (&ControlSet::control_list_marked_dirty, this));
 }
 
 void
@@ -108,6 +110,8 @@ ControlSet::clear_controls ()
 {
        Glib::Mutex::Lock lm (_control_lock);
 
+       _control_connections.drop_connections ();
+
        for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li)
                li->second->list()->clear();
 }
index add32fb9bd6c700bfe150b0a4605ecd6e752e8e4..a67f32e993654e18c9e4112dd2d0d701b348757f 100644 (file)
@@ -534,7 +534,6 @@ Sequence<Time>::start_write()
        for (int i = 0; i < 16; ++i) {
                _write_notes[i].clear();
        }
-       _dirty_controls.clear();
 }
 
 /** Finish a write of events to the model.
@@ -576,10 +575,6 @@ Sequence<Time>::end_write (bool delete_stuck)
                _write_notes[i].clear();
        }
 
-       for (ControlLists::const_iterator i = _dirty_controls.begin(); i != _dirty_controls.end(); ++i) {
-               (*i)->mark_dirty();
-       }
-
        _writing = false;
 }
 
@@ -1036,6 +1031,13 @@ Sequence<Time>::set_overlap_pitch_resolution (OverlapPitchResolution opr)
         /* XXX todo: clean up existing overlaps in source data? */
 }
 
+template<typename Time>
+void
+Sequence<Time>::control_list_marked_dirty ()
+{
+       set_edited (true);
+}
+
 template class Sequence<Evoral::MusicalTime>;
 
 } // namespace Evoral