static boolean ReadTrack(midi_track_t *track, FILE *stream) { midi_event_t *new_events; midi_event_t *event; unsigned int last_event_type; track->num_events = 0; track->events = NULL; // Read the header: if (!ReadTrackHeader(track, stream)) { return false; } // Then the events: last_event_type = 0; for (;;) { // Resize the track slightly larger to hold another event: new_events = realloc(track->events, sizeof(midi_event_t) * (track->num_events + 1)); if (new_events == NULL) { return false; } track->events = new_events; // Read the next event: event = &track->events[track->num_events]; if (!ReadEvent(event, &last_event_type, stream)) { return false; } ++track->num_events; // End of track? if (event->event_type == MIDI_EVENT_META && event->data.meta.type == MIDI_META_END_OF_TRACK) { break; } } return true; }
static dboolean ReadTrack(midi_track_t *track, FILE *stream) { midi_event_t *new_events = NULL; unsigned int last_event_type; track->num_events = 0; track->events = NULL; track->num_event_mem = 0; // NSM // Read the header: if (!ReadTrackHeader(track, stream)) return false; // Then the events: last_event_type = 0; for (;;) { midi_event_t *event; // Resize the track slightly larger to hold another event: if (track->num_events == track->num_event_mem) { // depending on the state of the heap and the malloc implementation, realloc() // one more event at a time can be VERY slow. 10sec+ in MSVC track->num_event_mem += 100; new_events = Z_Realloc(track->events, sizeof(midi_event_t) * track->num_event_mem); } if (!new_events) return false; track->events = new_events; // Read the next event: event = &track->events[track->num_events]; if (!ReadEvent(event, &last_event_type, stream)) return false; ++track->num_events; // End of track? if (event->event_type == MIDI_EVENT_META && event->data.meta.type == MIDI_META_END_OF_TRACK) break; } return true; }