summaryrefslogtreecommitdiff
path: root/libs/evoral/src
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-09-18 17:34:12 +0200
committerRobin Gareus <robin@gareus.org>2015-09-18 17:36:15 +0200
commit8b2fb88f158dee9795923c31aadd4025310d6837 (patch)
tree5bafc22c3a19682e0f0b47a127338700064c69d9 /libs/evoral/src
parentc12e8cc47c8f3dcc6508a4e0734818c2a4fc38f1 (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.cpp27
-rw-r--r--libs/evoral/src/Sequence.cpp8
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;