diff options
author | Robin Gareus <robin@gareus.org> | 2015-09-18 17:34:12 +0200 |
---|---|---|
committer | Robin Gareus <robin@gareus.org> | 2015-09-18 17:36:15 +0200 |
commit | 8b2fb88f158dee9795923c31aadd4025310d6837 (patch) | |
tree | 5bafc22c3a19682e0f0b47a127338700064c69d9 /libs/evoral/src | |
parent | c12e8cc47c8f3dcc6508a4e0734818c2a4fc38f1 (diff) |
fix ever increasing MIDI event IDs
Iterating over a const Midi-Sequence calls Evoral::Sequence::set_event(),
which in turn used Evoral::Event::operator=() which always created
a new event-ID (create copy of the event).
Issues fixed:
- Saving *unmodified* MIDI produced new event-IDs on every save;
files changed with every save. - greetings to Deva.
- all [GUI] operations that use IDs to refer to notes e.g. undo.
invalid undo-history.
Also clarify assignment operator name. Prefer explicit assign() over =.
Diffstat (limited to 'libs/evoral/src')
-rw-r--r-- | libs/evoral/src/Event.cpp | 27 | ||||
-rw-r--r-- | libs/evoral/src/Sequence.cpp | 8 |
2 files changed, 17 insertions, 18 deletions
diff --git a/libs/evoral/src/Event.cpp b/libs/evoral/src/Event.cpp index 45935ccf8d..680f488596 100644 --- a/libs/evoral/src/Event.cpp +++ b/libs/evoral/src/Event.cpp @@ -107,30 +107,29 @@ Event<Timestamp>::~Event() { } template<typename Timestamp> -const Event<Timestamp>& -Event<Timestamp>::operator=(const Event& copy) +void +Event<Timestamp>::assign(const Event& other) { - _id = next_event_id (); - _type = copy._type; - _original_time = copy._original_time; - _nominal_time = copy._nominal_time; - _owns_buf = copy._owns_buf; + _id = other._id; + _type = other._type; + _original_time = other._original_time; + _nominal_time = other._nominal_time; + _owns_buf = other._owns_buf; if (_owns_buf) { - if (copy._buf) { - if (copy._size > _size) { - _buf = (uint8_t*)::realloc(_buf, copy._size); + if (other._buf) { + if (other._size > _size) { + _buf = (uint8_t*)::realloc(_buf, other._size); } - memcpy(_buf, copy._buf, copy._size); + memcpy(_buf, other._buf, other._size); } else { free(_buf); _buf = NULL; } } else { - _buf = copy._buf; + _buf = other._buf; } - _size = copy._size; - return *this; + _size = other._size; } template<typename Timestamp> diff --git a/libs/evoral/src/Sequence.cpp b/libs/evoral/src/Sequence.cpp index e153cea9b4..526256bf5e 100644 --- a/libs/evoral/src/Sequence.cpp +++ b/libs/evoral/src/Sequence.cpp @@ -284,18 +284,18 @@ Sequence<Time>::const_iterator::set_event() switch (_type) { case NOTE_ON: DEBUG_TRACE(DEBUG::Sequence, "iterator = note on\n"); - *_event = (*_note_iter)->on_event(); + _event->assign ((*_note_iter)->on_event()); _active_notes.push(*_note_iter); break; case NOTE_OFF: DEBUG_TRACE(DEBUG::Sequence, "iterator = note off\n"); assert(!_active_notes.empty()); - *_event = _active_notes.top()->off_event(); + _event->assign (_active_notes.top()->off_event()); // We don't pop the active note until we increment past it break; case SYSEX: DEBUG_TRACE(DEBUG::Sequence, "iterator = sysex\n"); - *_event = *(*_sysex_iter); + _event->assign (*(*_sysex_iter)); break; case CONTROL: DEBUG_TRACE(DEBUG::Sequence, "iterator = control\n"); @@ -303,7 +303,7 @@ Sequence<Time>::const_iterator::set_event() break; case PATCH_CHANGE: DEBUG_TRACE(DEBUG::Sequence, "iterator = program change\n"); - *_event = (*_patch_change_iter)->message (_active_patch_change_message); + _event->assign ((*_patch_change_iter)->message (_active_patch_change_message)); break; default: _is_end = true; |