Merge windows+cc branch into cairocanvas branch. Not finished, need to now merge...
[ardour.git] / libs / evoral / src / libsmf / smf.c
index 88206511dc7c751e2633d910c43ab3b971cbd220..3fde1d831e7b021191360ff70908677a3b753e20 100644 (file)
 #include <assert.h>
 #include <math.h>
 #include <errno.h>
+#ifdef PLATFORM_WINDOWS
+#include <winsock2.h>
+#else
 #include <arpa/inet.h>
+#endif
 #include "smf.h"
 #include "smf_private.h"
 
@@ -52,7 +56,7 @@ smf_new(void)
 {
        int cantfail;
 
-       smf_t *smf = malloc(sizeof(smf_t));
+       smf_t *smf = (smf_t*)malloc(sizeof(smf_t));
        if (smf == NULL) {
                g_critical("Cannot allocate smf_t structure: %s", strerror(errno));
                return (NULL);
@@ -85,7 +89,7 @@ smf_delete(smf_t *smf)
 {
        /* Remove all the tracks, from last to first. */
        while (smf->tracks_array->len > 0)
-               smf_track_delete(g_ptr_array_index(smf->tracks_array, smf->tracks_array->len - 1));
+               smf_track_delete((smf_track_t*)g_ptr_array_index(smf->tracks_array, smf->tracks_array->len - 1));
 
        smf_fini_tempo(smf);
 
@@ -105,14 +109,14 @@ smf_delete(smf_t *smf)
 smf_track_t *
 smf_track_new(void)
 {
-       smf_track_t *track = malloc(sizeof(smf_track_t));
+       smf_track_t *track = (smf_track_t*)malloc(sizeof(smf_track_t));
        if (track == NULL) {
                g_critical("Cannot allocate smf_track_t structure: %s", strerror(errno));
                return (NULL);
        }
 
        memset(track, 0, sizeof(smf_track_t));
-       track->next_event_number = -1;
+       track->next_event_number = 0;
 
        track->events_array = g_ptr_array_new();
        assert(track->events_array);
@@ -131,7 +135,7 @@ smf_track_delete(smf_track_t *track)
 
        /* Remove all the events, from last to first. */
        while (track->events_array->len > 0)
-               smf_event_delete(g_ptr_array_index(track->events_array, track->events_array->len - 1));
+               smf_event_delete((smf_event_t*)g_ptr_array_index(track->events_array, track->events_array->len - 1));
 
        if (track->smf)
                smf_track_remove_from_smf(track);
@@ -151,7 +155,9 @@ smf_track_delete(smf_track_t *track)
 void
 smf_add_track(smf_t *smf, smf_track_t *track)
 {
+#ifndef NDEBUG
        int cantfail;
+#endif
 
        assert(track->smf == NULL);
 
@@ -162,8 +168,13 @@ smf_add_track(smf_t *smf, smf_track_t *track)
        track->track_number = smf->number_of_tracks;
 
        if (smf->number_of_tracks > 1) {
+#ifndef NDEBUG
                cantfail = smf_set_format(smf, 1);
                assert(!cantfail);
+#else
+               smf_set_format(smf, 1);
+#endif
+               
        }
 }
 
@@ -173,7 +184,8 @@ smf_add_track(smf_t *smf, smf_track_t *track)
 void
 smf_track_remove_from_smf(smf_track_t *track)
 {
-       int i, j;
+       int i;
+       size_t j;
        smf_track_t *tmp;
        smf_event_t *ev;
 
@@ -212,7 +224,7 @@ smf_track_remove_from_smf(smf_track_t *track)
 smf_event_t *
 smf_event_new(void)
 {
-       smf_event_t *event = malloc(sizeof(smf_event_t));
+       smf_event_t *event = (smf_event_t*)malloc(sizeof(smf_event_t));
        if (event == NULL) {
                g_critical("Cannot allocate smf_event_t structure: %s", strerror(errno));
                return (NULL);
@@ -236,7 +248,7 @@ smf_event_new(void)
  * \return Event containing MIDI data or NULL.
  */
 smf_event_t *
-smf_event_new_from_pointer(void *midi_data, int len)
+smf_event_new_from_pointer(const void *midi_data, size_t len)
 {
        smf_event_t *event;
 
@@ -245,12 +257,12 @@ smf_event_new_from_pointer(void *midi_data, int len)
                return (NULL);
 
        event->midi_buffer_length = len;
-       event->midi_buffer = malloc(event->midi_buffer_length);
+       event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
        if (event->midi_buffer == NULL) {
                g_critical("Cannot allocate MIDI buffer structure: %s", strerror(errno));
                smf_event_delete(event);
 
-               return (NULL); 
+               return (NULL);
        }
 
        memcpy(event->midi_buffer, midi_data, len);
@@ -268,7 +280,7 @@ smf_event_new_from_pointer(void *midi_data, int len)
  * like this:
  *
  * smf_event_new_from_bytes(0xC0, 0x42, -1);
- * 
+ *
  * \param first_byte First byte of MIDI message.  Must be valid status byte.
  * \param second_byte Second byte of MIDI message or -1, if message is one byte long.
  * \param third_byte Third byte of MIDI message or -1, if message is two bytes long.
@@ -277,7 +289,7 @@ smf_event_new_from_pointer(void *midi_data, int len)
 smf_event_t *
 smf_event_new_from_bytes(int first_byte, int second_byte, int third_byte)
 {
-       int len;
+       size_t len;
 
        smf_event_t *event;
 
@@ -335,12 +347,12 @@ smf_event_new_from_bytes(int first_byte, int second_byte, int third_byte)
        }
 
        event->midi_buffer_length = len;
-       event->midi_buffer = malloc(event->midi_buffer_length);
+       event->midi_buffer = (uint8_t*)malloc(event->midi_buffer_length);
        if (event->midi_buffer == NULL) {
                g_critical("Cannot allocate MIDI buffer structure: %s", strerror(errno));
                smf_event_delete(event);
 
-               return (NULL); 
+               return (NULL);
        }
 
        event->midi_buffer[0] = first_byte;
@@ -376,12 +388,12 @@ smf_event_delete(smf_event_t *event)
 static gint
 events_array_compare_function(gconstpointer aa, gconstpointer bb)
 {
-       smf_event_t *a, *b;
-       
+       const smf_event_t *a, *b;
+
        /* "The comparison function for g_ptr_array_sort() doesn't take the pointers
            from the array as arguments, it takes pointers to the pointers in the array." */
-       a = (smf_event_t *)*(gpointer *)aa;
-       b = (smf_event_t *)*(gpointer *)bb;
+       a = (const smf_event_t *)*(const gpointer *)aa;
+       b = (const smf_event_t *)*(const gpointer *)bb;
 
        if (a->time_pulses < b->time_pulses)
                return (-1);
@@ -408,7 +420,7 @@ events_array_compare_function(gconstpointer aa, gconstpointer bb)
  * An assumption here is that if there is an EOT event, it will be at the end of the track.
  */
 static void
-remove_eot_if_before_pulses(smf_track_t *track, int pulses)
+remove_eot_if_before_pulses(smf_track_t *track, size_t pulses)
 {
        smf_event_t *event;
 
@@ -436,12 +448,11 @@ remove_eot_if_before_pulses(smf_track_t *track, int pulses)
 void
 smf_track_add_event(smf_track_t *track, smf_event_t *event)
 {
-       int i, last_pulses = 0;
+       size_t i, last_pulses = 0;
 
        assert(track->smf != NULL);
        assert(event->track == NULL);
        assert(event->delta_time_pulses == -1);
-       assert(event->time_pulses >= 0);
        assert(event->time_seconds >= 0.0);
 
        remove_eot_if_before_pulses(track, event->time_pulses);
@@ -450,7 +461,7 @@ smf_track_add_event(smf_track_t *track, smf_event_t *event)
        event->track_number = track->track_number;
 
        if (track->number_of_events == 0) {
-               assert(track->next_event_number == -1);
+               assert(track->next_event_number == 0);
                track->next_event_number = 1;
        }
 
@@ -517,7 +528,7 @@ smf_track_add_event(smf_track_t *track, smf_event_t *event)
  * \return 0 if everything went ok, nonzero otherwise.
  */
 int
-smf_track_add_eot_delta_pulses(smf_track_t *track, int delta)
+smf_track_add_eot_delta_pulses(smf_track_t *track, uint32_t delta)
 {
        smf_event_t *event;
 
@@ -531,7 +542,7 @@ smf_track_add_eot_delta_pulses(smf_track_t *track, int delta)
 }
 
 int
-smf_track_add_eot_pulses(smf_track_t *track, int pulses)
+smf_track_add_eot_pulses(smf_track_t *track, size_t pulses)
 {
        smf_event_t *event, *last_event;
 
@@ -576,7 +587,8 @@ smf_track_add_eot_seconds(smf_track_t *track, double seconds)
 void
 smf_event_remove_from_track(smf_event_t *event)
 {
-       int i, was_last;
+       size_t i;
+       int was_last;
        smf_event_t *tmp;
        smf_track_t *track;
 
@@ -597,7 +609,7 @@ smf_event_remove_from_track(smf_event_t *event)
        g_ptr_array_remove(track->events_array, event);
 
        if (track->number_of_events == 0)
-               track->next_event_number = -1;
+               track->next_event_number = 0;
 
        /* Renumber the rest of the events, so they are consecutively numbered. */
        for (i = event->event_number; i <= track->number_of_events; i++) {
@@ -614,9 +626,9 @@ smf_event_remove_from_track(smf_event_t *event)
        }
 
        event->track = NULL;
-       event->event_number = -1;
+       event->event_number = 0;
        event->delta_time_pulses = -1;
-       event->time_pulses = -1;
+       event->time_pulses = 0;
        event->time_seconds = -1.0;
 }
 
@@ -667,10 +679,8 @@ smf_set_format(smf_t *smf, int format)
   * \param ppqn New PPQN.
   */
 int
-smf_set_ppqn(smf_t *smf, int ppqn)
+smf_set_ppqn(smf_t *smf, uint16_t ppqn)
 {
-       assert(ppqn > 0);
-
        smf->ppqn = ppqn;
 
        return (0);
@@ -689,12 +699,15 @@ smf_track_get_next_event(smf_track_t *track)
 {
        smf_event_t *event, *next_event;
 
+       /* Track is empty? */
+       if (track->number_of_events == 0)
+               return (NULL);
+
        /* End of track? */
-       if (track->next_event_number == -1)
+       if (track->next_event_number == 0)
                return (NULL);
 
        assert(track->next_event_number >= 1);
-       assert(track->number_of_events > 0);
 
        event = smf_track_get_event_by_number(track, track->next_event_number);
 
@@ -708,7 +721,7 @@ smf_track_get_next_event(smf_track_t *track)
                track->time_of_next_event = next_event->time_pulses;
                track->next_event_number++;
        } else {
-               track->next_event_number = -1;
+               track->next_event_number = 0;
        }
 
        return (event);
@@ -725,7 +738,7 @@ smf_peek_next_event_from_track(smf_track_t *track)
        smf_event_t *event;
 
        /* End of track? */
-       if (track->next_event_number == -1)
+       if (track->next_event_number == 0)
                return (NULL);
 
        assert(track->next_event_number >= 1);
@@ -762,7 +775,7 @@ smf_get_track_by_number(const smf_t *smf, int track_number)
  * Events are numbered consecutively starting from one.
  */
 smf_event_t *
-smf_track_get_event_by_number(const smf_track_t *track, int event_number)
+smf_track_get_event_by_number(const smf_track_t *track, size_t event_number)
 {
        smf_event_t *event;
 
@@ -771,7 +784,7 @@ smf_track_get_event_by_number(const smf_track_t *track, int event_number)
        if (event_number > track->number_of_events)
                return (NULL);
 
-       event = g_ptr_array_index(track->events_array, event_number - 1);
+       event = (smf_event_t*)g_ptr_array_index(track->events_array, event_number - 1);
 
        assert(event);
 
@@ -788,7 +801,7 @@ smf_track_get_last_event(const smf_track_t *track)
 
        if (track->number_of_events == 0)
                return (NULL);
-       
+
        event = smf_track_get_event_by_number(track, track->number_of_events);
 
        return (event);
@@ -802,7 +815,8 @@ smf_track_get_last_event(const smf_track_t *track)
 smf_track_t *
 smf_find_track_with_next_event(smf_t *smf)
 {
-       int i, min_time = 0;
+       int i;
+       size_t min_time = 0;
        smf_track_t *track = NULL, *min_time_track = NULL;
 
        /* Find track with event that should be played next. */
@@ -812,7 +826,7 @@ smf_find_track_with_next_event(smf_t *smf)
                assert(track);
 
                /* No more events in this track? */
-               if (track->next_event_number == -1)
+               if (track->next_event_number == 0)
                        continue;
 
                if (track->time_of_next_event < min_time || min_time_track == NULL) {
@@ -842,7 +856,7 @@ smf_get_next_event(smf_t *smf)
        }
 
        event = smf_track_get_next_event(track);
-       
+
        assert(event != NULL);
 
        event->track->smf->last_seek_position = -1.0;
@@ -857,9 +871,8 @@ smf_get_next_event(smf_t *smf)
 void
 smf_skip_next_event(smf_t *smf)
 {
-       void *notused;
-
-       notused = smf_get_next_event(smf);
+       smf_event_t *ignored = smf_get_next_event(smf);
+       (void) ignored;
 }
 
 /**
@@ -881,7 +894,7 @@ smf_peek_next_event(smf_t *smf)
        }
 
        event = smf_peek_next_event_from_track(track);
-       
+
        assert(event != NULL);
 
        return (event);
@@ -913,7 +926,7 @@ smf_rewind(smf_t *smf)
                        assert(event);
                        track->time_of_next_event = event->time_pulses;
                } else {
-                       track->next_event_number = -1;
+                       track->next_event_number = 0;
                        track->time_of_next_event = 0;
 #if 0
                        g_warning("Warning: empty track.");
@@ -947,7 +960,7 @@ smf_seek_to_event(smf_t *smf, const smf_event_t *target)
                        smf_skip_next_event(smf);
                else
                        break;
-       }       
+       }
 
        smf->last_seek_position = event->time_seconds;
 
@@ -1002,12 +1015,10 @@ smf_seek_to_seconds(smf_t *smf, double seconds)
   * smf_get_next_event will return first event that happens after the first ten pulses.
   */
 int
-smf_seek_to_pulses(smf_t *smf, int pulses)
+smf_seek_to_pulses(smf_t *smf, size_t pulses)
 {
        smf_event_t *event;
 
-       assert(pulses >= 0);
-
        smf_rewind(smf);
 
 #if 0
@@ -1036,16 +1047,17 @@ smf_seek_to_pulses(smf_t *smf, int pulses)
 /**
   * \return Length of SMF, in pulses.
   */
-int
+size_t
 smf_get_length_pulses(const smf_t *smf)
 {
-       int pulses = 0, i;
+       int i;
+       size_t pulses = 0;
 
        for (i = 1; i <= smf->number_of_tracks; i++) {
                smf_track_t *track;
                smf_event_t *event;
 
-               track = smf_get_track_by_number(smf, i);
+               track = smf_get_track_by_number(smf, i);
                assert(track);
 
                event = smf_track_get_last_event(track);