summaryrefslogtreecommitdiff
path: root/libs/evoral
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2015-09-19 00:38:32 +0200
committerRobin Gareus <robin@gareus.org>2015-09-19 00:38:32 +0200
commit7648824773ad3e0cd9ff2ed5bc36a390c7b47a0f (patch)
tree134d7daf8eb67f625f3fdcb8e932d0786a4e3445 /libs/evoral
parent2ef2ea0b59502db9cee500517190f3425478b88c (diff)
speed-up smf_track_delete() from O(N^2) to O(n)
Diffstat (limited to 'libs/evoral')
-rw-r--r--libs/evoral/src/libsmf/smf.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/libs/evoral/src/libsmf/smf.c b/libs/evoral/src/libsmf/smf.c
index 3fde1d831e..3b5eea1d60 100644
--- a/libs/evoral/src/libsmf/smf.c
+++ b/libs/evoral/src/libsmf/smf.c
@@ -133,15 +133,20 @@ smf_track_delete(smf_track_t *track)
assert(track);
assert(track->events_array);
- /* Remove all the events, from last to first. */
- while (track->events_array->len > 0)
- smf_event_delete((smf_event_t*)g_ptr_array_index(track->events_array, track->events_array->len - 1));
+ /* Remove all the events */
+ for (unsigned int i=0; i < track->events_array->len; ++i) {
+ smf_event_t* ev = g_ptr_array_index(track->events_array, i);
+ free (ev->midi_buffer);
+ free (ev);
+ }
+
+ g_ptr_array_remove_range(track->events_array, 0, track->events_array->len);
+ track->number_of_events = 0;
if (track->smf)
smf_track_remove_from_smf(track);
assert(track->events_array->len == 0);
- assert(track->number_of_events == 0);
g_ptr_array_free(track->events_array, TRUE);
memset(track, 0, sizeof(smf_track_t));