Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}