diff options
Diffstat (limited to 'libs/evoral/evoral/Sequence.hpp')
-rw-r--r-- | libs/evoral/evoral/Sequence.hpp | 32 |
1 files changed, 23 insertions, 9 deletions
diff --git a/libs/evoral/evoral/Sequence.hpp b/libs/evoral/evoral/Sequence.hpp index b5737638e1..21db34eb68 100644 --- a/libs/evoral/evoral/Sequence.hpp +++ b/libs/evoral/evoral/Sequence.hpp @@ -63,11 +63,26 @@ class Sequence : virtual public ControlSet { public: Sequence(const TypeMap& type_map); - void write_lock(); - void write_unlock(); +protected: + struct WriteLockImpl { + WriteLockImpl(Glib::RWLock& s, Glib::Mutex& c) + : sequence_lock(new Glib::RWLock::WriterLock(s)) + , control_lock(new Glib::Mutex::Lock(c)) + { } + ~WriteLockImpl() { + delete sequence_lock; + delete control_lock; + } + Glib::RWLock::WriterLock* sequence_lock; + Glib::Mutex::Lock* control_lock; + }; + +public: + typedef boost::shared_ptr<Glib::RWLock::ReaderLock> ReadLock; + typedef boost::shared_ptr<WriteLockImpl> WriteLock; - void read_lock() const; - void read_unlock() const; + virtual ReadLock read_lock() const { return ReadLock(new Glib::RWLock::ReaderLock(_lock)); } + virtual WriteLock write_lock() { return WriteLock(new WriteLockImpl(_lock, _control_lock)); } void clear(); @@ -143,7 +158,7 @@ public: ~const_iterator(); inline bool valid() const { return !_is_end && _event; } - inline bool locked() const { return _locked; } + //inline bool locked() const { return _locked; } void invalidate(); @@ -169,7 +184,7 @@ public: mutable ActiveNotes _active_notes; MIDIMessageType _type; bool _is_end; - bool _locked; + typename Sequence::ReadLock _lock; typename Notes::const_iterator _note_iter; typename SysExes::const_iterator _sysex_iter; ControlIterators _control_iters; @@ -194,7 +209,8 @@ public: uint8_t highest_note() const { return _highest_note; } protected: - bool _edited; + bool _edited; + mutable Glib::RWLock _lock; private: friend class const_iterator; @@ -204,8 +220,6 @@ private: void append_control_unlocked(const Parameter& param, Time time, double value); void append_sysex_unlocked(const MIDIEvent<Time>& ev); - mutable Glib::RWLock _lock; - const TypeMap& _type_map; Notes _notes; |