summaryrefslogtreecommitdiff
path: root/libs/evoral/src/libsmf/smf_save.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/evoral/src/libsmf/smf_save.c')
-rw-r--r--libs/evoral/src/libsmf/smf_save.c68
1 files changed, 40 insertions, 28 deletions
diff --git a/libs/evoral/src/libsmf/smf_save.c b/libs/evoral/src/libsmf/smf_save.c
index 02cb2084bb..05c6641b03 100644
--- a/libs/evoral/src/libsmf/smf_save.c
+++ b/libs/evoral/src/libsmf/smf_save.c
@@ -547,58 +547,68 @@ smf_validate(smf_t *smf)
#ifndef NDEBUG
-static void
-assert_smf_event_is_identical(const smf_event_t *a, const smf_event_t *b)
+#define CHECK(cond) if (!(cond)) { return -1; }
+
+static int
+check_smf_event_is_identical(const smf_event_t *a, const smf_event_t *b)
{
- assert(a->event_number == b->event_number);
- assert(a->delta_time_pulses == b->delta_time_pulses);
- assert(abs((long)(a->time_pulses - b->time_pulses)) <= 2);
- assert(fabs(a->time_seconds - b->time_seconds) <= 0.01);
- assert(a->track_number == b->track_number);
- assert(a->midi_buffer_length == b->midi_buffer_length);
- assert(memcmp(a->midi_buffer, b->midi_buffer, a->midi_buffer_length) == 0);
+ CHECK(a->event_number == b->event_number);
+ CHECK(a->delta_time_pulses == b->delta_time_pulses);
+ CHECK(abs((long)(a->time_pulses - b->time_pulses)) <= 2);
+ CHECK(fabs(a->time_seconds - b->time_seconds) <= 0.01);
+ CHECK(a->track_number == b->track_number);
+ CHECK(a->midi_buffer_length == b->midi_buffer_length);
+ CHECK(memcmp(a->midi_buffer, b->midi_buffer, a->midi_buffer_length) == 0);
+ return 0;
}
-static void
-assert_smf_track_is_identical(const smf_track_t *a, const smf_track_t *b)
+static int
+check_smf_track_is_identical(const smf_track_t *a, const smf_track_t *b)
{
size_t i;
- assert(a->track_number == b->track_number);
- assert(a->number_of_events == b->number_of_events);
+ CHECK(a->track_number == b->track_number);
+ CHECK(a->number_of_events == b->number_of_events);
for (i = 1; i <= a->number_of_events; i++)
- assert_smf_event_is_identical(smf_track_get_event_by_number(a, i), smf_track_get_event_by_number(b, i));
+ check_smf_event_is_identical(smf_track_get_event_by_number(a, i), smf_track_get_event_by_number(b, i));
+
+ return 0;
}
-static void
-assert_smf_is_identical(const smf_t *a, const smf_t *b)
+static int
+check_smf_is_identical(const smf_t *a, const smf_t *b)
{
int i;
- assert(a->format == b->format);
- assert(a->ppqn == b->ppqn);
- assert(a->frames_per_second == b->frames_per_second);
- assert(a->resolution == b->resolution);
- assert(a->number_of_tracks == b->number_of_tracks);
+ CHECK(a->format == b->format);
+ CHECK(a->ppqn == b->ppqn);
+ CHECK(a->frames_per_second == b->frames_per_second);
+ CHECK(a->resolution == b->resolution);
+ CHECK(a->number_of_tracks == b->number_of_tracks);
for (i = 1; i <= a->number_of_tracks; i++)
- assert_smf_track_is_identical(smf_get_track_by_number(a, i), smf_get_track_by_number(b, i));
+ check_smf_track_is_identical(smf_get_track_by_number(a, i), smf_get_track_by_number(b, i));
/* We do not need to compare tempos explicitly, as tempo is always computed from track contents. */
+ return 0;
}
-static void
-assert_smf_saved_correctly(const smf_t *smf, FILE* file)
+static int
+check_smf_saved_correctly(const smf_t *smf, FILE* file)
{
smf_t *saved;
+ int ret;
saved = smf_load (file);
- assert(saved != NULL);
-
- assert_smf_is_identical(smf, saved);
+ if (!saved) {
+ ret = -1;
+ } else {
+ ret = check_smf_is_identical(smf, saved);
+ }
smf_delete(saved);
+ return (ret);
}
#endif /* !NDEBUG */
@@ -645,7 +655,9 @@ smf_save(smf_t *smf, FILE* file)
return (error);
#ifndef NDEBUG
- assert_smf_saved_correctly(smf, file);
+ if (check_smf_saved_correctly(smf, file)) {
+ g_warning("SMF warning: Did not save correctly, possible data loss.");
+ }
#endif
return (0);