pw-cat: improve midi errors

EINVAL for invalid events and file
ENOENT for unknown event
This commit is contained in:
Wim Taymans 2020-02-24 10:19:11 +01:00
parent 8ecef35e80
commit 9bec2e5d8a
2 changed files with 9 additions and 6 deletions

View file

@ -59,7 +59,7 @@ static int read_mthd(struct midi_file *mf)
{ {
if (mf_avail(mf) < 14 || if (mf_avail(mf) < 14 ||
memcmp(mf->p, "MThd", 4) != 0) memcmp(mf->p, "MThd", 4) != 0)
return -EIO; return -EINVAL;
mf->length = parse_be32(mf->p + 4); mf->length = parse_be32(mf->p + 4);
mf->format = parse_be16(mf->p + 8); mf->format = parse_be16(mf->p + 8);
@ -94,7 +94,7 @@ static int read_mtrk(struct midi_file *mf, struct midi_track *track)
{ {
if (mf_avail(mf) < 8 || if (mf_avail(mf) < 8 ||
memcmp(mf->p, "MTrk", 4) != 0) memcmp(mf->p, "MTrk", 4) != 0)
return -EIO; return -EINVAL;
track->data = track->p = mf->p + 8; track->data = track->p = mf->p + 8;
track->size = parse_be32(mf->p + 4); track->size = parse_be32(mf->p + 4);
@ -162,7 +162,7 @@ static int peek_event(struct midi_file *mf, struct midi_track *tr, struct midi_e
break; break;
case 0x51: case 0x51:
if (size < 3) if (size < 3)
return -EIO; return -EINVAL;
mf->tick_sec = event->sec; mf->tick_sec = event->sec;
mf->tick_start = tr->tick; mf->tick_start = tr->tick;
mf->tempo = (tr->p[0]<<16) | (tr->p[1]<<8) | tr->p[2]; mf->tempo = (tr->p[0]<<16) | (tr->p[1]<<8) | tr->p[2];
@ -176,7 +176,7 @@ static int peek_event(struct midi_file *mf, struct midi_track *tr, struct midi_e
return res; return res;
break; break;
default: default:
return -EIO; return -ENOENT;
} }
event->data = tr->p; event->data = tr->p;
tr->p = save; tr->p = save;

View file

@ -1031,8 +1031,11 @@ static int setup_midifile(struct data *data)
close(data->midi.fd); close(data->midi.fd);
return -errno; return -errno;
} }
if ((res = midi_file_init(&data->midi.mf, "r", data->midi.mem, data->midi.st.st_size)) < 0) if ((res = midi_file_init(&data->midi.mf, "r", data->midi.mem, data->midi.st.st_size)) < 0) {
return -errno; fprintf(stderr, "error: can't read midi file '%s': %s\n", data->filename, spa_strerror(res));
close(data->midi.fd);
return res;
}
if (data->verbose) if (data->verbose)
printf("opened file \"%s\" format %08x ntracks:%d div:%d\n", printf("opened file \"%s\" format %08x ntracks:%d div:%d\n",