debug flag for MTC; make ardour/timecode.h simply include the "authoritative" one...
[ardour.git] / libs / ardour / ardour / midi_model.h
index 46d4cf794c5e9153d6beef435b56e83ec7e64128..b099f575a16b3e6b761c705c2830542d0d4fd144 100644 (file)
@@ -18,7 +18,7 @@
 
 */
 
-#ifndef __ardour_midi_model_h__ 
+#ifndef __ardour_midi_model_h__
 #define __ardour_midi_model_h__
 
 #include <queue>
@@ -52,7 +52,7 @@ public:
        typedef double TimeType;
 
        MidiModel(MidiSource* s, size_t size=0);
-       
+
        NoteMode note_mode() const { return (percussive() ? Percussive : Sustained); }
        void set_note_mode(NoteMode mode) { set_percussive(mode == Percussive); };
 
@@ -66,11 +66,11 @@ public:
                DeltaCommand (boost::shared_ptr<MidiModel> m, const XMLNode& node);
 
                const std::string& name() const { return _name; }
-               
+
                void operator()();
                void undo();
-               
-               int set_state (const XMLNode&);
+
+               int set_state (const XMLNode&, int version);
                XMLNode& get_state ();
 
                void add(const boost::shared_ptr< Evoral::Note<TimeType> > note);
@@ -79,12 +79,12 @@ public:
        private:
                XMLNode &marshal_note(const boost::shared_ptr< Evoral::Note<TimeType> > note);
                boost::shared_ptr< Evoral::Note<TimeType> > unmarshal_note(XMLNode *xml_note);
-               
+
                boost::shared_ptr<MidiModel> _model;
                const std::string            _name;
-               
+
                typedef std::list< boost::shared_ptr< Evoral::Note<TimeType> > > NoteList;
-               
+
                NoteList _added_notes;
                NoteList _removed_notes;
        };
@@ -110,27 +110,35 @@ public:
                DiffCommand (boost::shared_ptr<MidiModel> m, const XMLNode& node);
 
                const std::string& name() const { return _name; }
-               
+
                void operator()();
                void undo();
-               
-               int set_state (const XMLNode&);
+
+               int set_state (const XMLNode&, int version);
                XMLNode& get_state ();
-               
-               void change (const boost::shared_ptr<Evoral::Note<TimeType> > note, 
-                            Property prop, uint8_t new_value);
-               
+
+               void change (const boost::shared_ptr<Evoral::Note<TimeType> > note,
+                               Property prop, uint8_t new_value);
+               void change (const boost::shared_ptr<Evoral::Note<TimeType> > note,
+                               Property prop, TimeType new_time);
+
        private:
                boost::shared_ptr<MidiModel> _model;
                const std::string            _name;
 
                struct NotePropertyChange {
-                   DiffCommand::Property property;
-                   boost::shared_ptr<Evoral::Note<TimeType> > note;
-                   uint8_t old_value;
-                   uint8_t new_value;
-               }; 
-               
+                       DiffCommand::Property property;
+                       boost::shared_ptr< Evoral::Note<TimeType> > note;
+                       union {
+                               uint8_t  old_value;
+                               TimeType old_time;
+                       };
+                       union {
+                               uint8_t  new_value;
+                               TimeType new_time;
+                       };
+               };
+
                typedef std::list<NotePropertyChange> ChangeList;
                ChangeList _changes;
 
@@ -143,25 +151,39 @@ public:
        void                     apply_command(Session& session, Command* cmd);
        void                     apply_command_as_subcommand(Session& session, Command* cmd);
 
-
-
        bool write_to(boost::shared_ptr<MidiSource> source);
-               
+
        // MidiModel doesn't use the normal AutomationList serialisation code
        // since controller data is stored in the .mid
        XMLNode& get_state();
        int set_state(const XMLNode&) { return 0; }
 
        sigc::signal<void> ContentsChanged;
-       
+
        const MidiSource* midi_source() const { return _midi_source; }
-       void set_midi_source(MidiSource* source) { _midi_source = source; } 
+       void set_midi_source(MidiSource* source) { _midi_source = source; }
 
        boost::shared_ptr<Evoral::Note<TimeType> > find_note (boost::shared_ptr<Evoral::Note<TimeType> >);
-       
+
+private:
+       struct WriteLockImpl : public AutomatableSequence<Evoral::MusicalTime>::WriteLockImpl {
+               WriteLockImpl(Glib::Mutex::Lock* source_lock, Glib::RWLock& s, Glib::Mutex& c)
+                       : AutomatableSequence<Evoral::MusicalTime>::WriteLockImpl(s, c)
+                       , source_lock(source_lock)
+               {}
+               ~WriteLockImpl() {
+                       delete source_lock;
+               }
+               Glib::Mutex::Lock* source_lock;
+       };
+
+public:
+       virtual WriteLock edit_lock();
+       virtual WriteLock write_lock();
+
 private:
        friend class DeltaCommand;
-       
+
        // We cannot use a boost::shared_ptr here to avoid a retain cycle
        MidiSource* _midi_source;
 };