summaryrefslogtreecommitdiff
path: root/libs/evoral/src/Sequence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/evoral/src/Sequence.cpp')
-rw-r--r--libs/evoral/src/Sequence.cpp75
1 files changed, 15 insertions, 60 deletions
diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp
index 4ba64fb12d..32191982c2 100644
--- a/libs/evoral/src/Sequence.cpp
+++ b/libs/evoral/src/Sequence.cpp
@@ -46,36 +46,12 @@ using namespace std;
namespace Evoral {
-template<typename Time>
-void Sequence<Time>::write_lock() {
- _lock.writer_lock();
- _control_lock.lock();
-}
-
-template<typename Time>
-void Sequence<Time>::write_unlock() {
- _lock.writer_unlock();
- _control_lock.unlock();
-}
-
-template<typename Time>
-void Sequence<Time>::read_lock() const {
- _lock.reader_lock();
-}
-
-template<typename Time>
-void Sequence<Time>::read_unlock() const {
- _lock.reader_unlock();
-}
-
-
// Read iterator (const_iterator)
template<typename Time>
Sequence<Time>::const_iterator::const_iterator()
: _seq(NULL)
, _is_end(true)
- , _locked(false)
, _control_iter(_control_iters.end())
{
_event = boost::shared_ptr< Event<Time> >(new Event<Time>());
@@ -86,18 +62,19 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
: _seq(&seq)
, _type(NIL)
, _is_end((t == DBL_MAX) || seq.empty())
- , _locked(!_is_end)
, _note_iter(seq.notes().end())
, _sysex_iter(seq.sysexes().end())
, _control_iter(_control_iters.end())
{
DUMP(format("Created Iterator @ %1% (is end: %2%)\n)") % t % _is_end);
- if (_is_end) {
+ if (!_is_end) {
+ _lock = seq.read_lock();
+ } else {
return;
}
- seq.read_lock();
+ typename Sequence<Time>::ReadLock lock(seq.read_lock());
// Find first note which begins at or after t
_note_iter = seq.note_lower_bound(t);
@@ -199,8 +176,6 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
DUMP(format("Starting at end @ %1%\n") % t);
_type = NIL;
_is_end = true;
- _locked = false;
- _seq->read_unlock();
} else {
DUMP(printf("New iterator = 0x%x : 0x%x @ %f\n",
(int)_event->event_type(),
@@ -213,9 +188,6 @@ Sequence<Time>::const_iterator::const_iterator(const Sequence<Time>& seq, Time t
template<typename Time>
Sequence<Time>::const_iterator::~const_iterator()
{
- if (_locked) {
- _seq->read_unlock();
- }
}
template<typename Time>
@@ -232,10 +204,7 @@ Sequence<Time>::const_iterator::invalidate()
_sysex_iter = _seq->sysexes().end();
}
_control_iter = _control_iters.end();
- if (_locked) {
- _seq->read_unlock();
- _locked = false;
- }
+ _lock.reset();
}
template<typename Time>
@@ -386,27 +355,20 @@ template<typename Time>
typename Sequence<Time>::const_iterator&
Sequence<Time>::const_iterator::operator=(const const_iterator& other)
{
- if (_seq != other._seq) {
- if (_locked) {
- _seq->read_unlock();
- }
- if (other._locked) {
- other._seq->read_lock();
- }
- } else if (!_locked && other._locked) {
- _seq->read_lock();
- }
-
_seq = other._seq;
_event = other._event;
_active_notes = other._active_notes;
_type = other._type;
_is_end = other._is_end;
- _locked = other._locked;
_note_iter = other._note_iter;
_sysex_iter = other._sysex_iter;
_control_iters = other._control_iters;
+ if (other._lock)
+ _lock = _seq->read_lock();
+ else
+ _lock.reset();
+
if (other._control_iter == other._control_iters.end()) {
_control_iter = _control_iters.end();
} else {
@@ -431,7 +393,7 @@ Sequence<Time>::Sequence(const TypeMap& type_map)
{
DUMP(format("Sequence (size %1%) constructed: %2%\n") % size % this);
assert(_end_iter._is_end);
- assert( ! _end_iter._locked);
+ assert( ! _end_iter._lock);
}
/** Write the controller event pointed to by \a iter to \a ev.
@@ -516,11 +478,10 @@ template<typename Time>
void
Sequence<Time>::clear()
{
- _lock.writer_lock();
+ WriteLock lock(write_lock());
_notes.clear();
for (Controls::iterator li = _controls.begin(); li != _controls.end(); ++li)
li->second->list()->clear();
- _lock.writer_unlock();
}
/** Begin a write of events to the model.
@@ -535,13 +496,12 @@ void
Sequence<Time>::start_write()
{
DUMP(format("%1% : start_write (percussive = %2%)\n") % this % _percussive);
- write_lock();
+ WriteLock lock(write_lock());
_writing = true;
for (int i = 0; i < 16; ++i) {
_write_notes[i].clear();
}
_dirty_controls.clear();
- write_unlock();
}
/** Finish a write of events to the model.
@@ -554,10 +514,9 @@ template<typename Time>
void
Sequence<Time>::end_write(bool delete_stuck)
{
- write_lock();
+ WriteLock lock(write_lock());
if (!_writing) {
- write_unlock();
return;
}
@@ -588,7 +547,6 @@ Sequence<Time>::end_write(bool delete_stuck)
}
_writing = false;
- write_unlock();
}
/** Append \a ev to model. NOT realtime safe.
@@ -601,7 +559,7 @@ template<typename Time>
void
Sequence<Time>::append(const Event<Time>& event)
{
- write_lock();
+ WriteLock lock(write_lock());
_edited = true;
const MIDIEvent<Time>& ev = (const MIDIEvent<Time>&)event;
@@ -611,7 +569,6 @@ Sequence<Time>::append(const Event<Time>& event)
if (!midi_event_is_valid(ev.buffer(), ev.size())) {
cerr << "WARNING: Sequence ignoring illegal MIDI event" << endl;
- write_unlock();
return;
}
@@ -647,8 +604,6 @@ Sequence<Time>::append(const Event<Time>& event)
} else {
printf("WARNING: Sequence: Unknown MIDI event type %X\n", ev.type());
}
-
- write_unlock();
}
template<typename Time>