summaryrefslogtreecommitdiff
path: root/libsmf
diff options
context:
space:
mode:
authorJeremiah Benham <jjbenham@chicagoguitar.com>2010-02-19 10:44:31 -0600
committerJeremiah Benham <jjbenham@chicagoguitar.com>2010-02-19 10:44:31 -0600
commit5ab01398d2bf3a7ae7b8f5349723f255147c877e (patch)
treeada089c2d457e21cc56daa2867240e198bb28f7a /libsmf
parentd719b0d082621067fc2e7893955ffaf4a6db830d (diff)
smf_load.c update from svn
Diffstat (limited to 'libsmf')
-rw-r--r--libsmf/smf_load.c17
1 files changed, 12 insertions, 5 deletions
diff --git a/libsmf/smf_load.c b/libsmf/smf_load.c
index dbcdaf91..fe8178fe 100644
--- a/libsmf/smf_load.c
+++ b/libsmf/smf_load.c
@@ -83,8 +83,8 @@ next_chunk(smf_t *smf)
smf->next_chunk_offset += sizeof(struct chunk_header_struct) + ntohl(chunk->length);
if (smf->next_chunk_offset > smf->file_buffer_length) {
- g_critical("SMF error: malformed chunk; truncated file?");
- return (NULL);
+ g_critical("SMF warning: malformed chunk; truncated file?");
+ smf->next_chunk_offset = smf->file_buffer_length;
}
return (chunk);
@@ -290,7 +290,8 @@ expected_sysex_length(const unsigned char status, const unsigned char *second_by
return (-1);
}
- extract_vlq(second_byte, buffer_length, &sysex_length, &len);
+ if (extract_vlq(second_byte, buffer_length, &sysex_length, &len))
+ return (-1);
if (consumed_bytes != NULL)
*consumed_bytes = len;
@@ -774,8 +775,14 @@ parse_mtrk_chunk(smf_track_t *track)
event = parse_next_event(track);
/* Couldn't parse an event? */
- if (event == NULL)
- return (-1);
+ if (event == NULL) {
+ g_critical("Unable to parse MIDI event; truncating track.");
+ if (smf_track_add_eot_delta_pulses(track, 0) != 0) {
+ g_critical("smf_track_add_eot_delta_pulses failed.");
+ return (-2);
+ }
+ break;
+ }
assert(smf_event_is_valid(event));