Skip to content

Commit dd26225

Browse files
committed
synthio: Add MidiTrack.error_location to record errors
.. instead of just printing the unraiseable error on the repl
1 parent d8550f4 commit dd26225

File tree

4 files changed

+26
-1
lines changed

4 files changed

+26
-1
lines changed

shared-bindings/synthio/MidiTrack.c

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,23 @@ MP_DEFINE_CONST_FUN_OBJ_1(synthio_miditrack_get_sample_rate_obj, synthio_miditra
151151
MP_PROPERTY_GETTER(synthio_miditrack_sample_rate_obj,
152152
(mp_obj_t)&synthio_miditrack_get_sample_rate_obj);
153153

154+
//| error_location: Optional[int]
155+
//| """Offset, in bytes within the midi data, of a decoding error"""
156+
//|
157+
STATIC mp_obj_t synthio_miditrack_obj_get_error_location(mp_obj_t self_in) {
158+
synthio_miditrack_obj_t *self = MP_OBJ_TO_PTR(self_in);
159+
check_for_deinit(self);
160+
mp_int_t location = common_hal_synthio_miditrack_get_error_location(self);
161+
if (location >= 0) {
162+
return MP_OBJ_NEW_SMALL_INT(location);
163+
}
164+
return mp_const_none;
165+
}
166+
MP_DEFINE_CONST_FUN_OBJ_1(synthio_miditrack_get_error_location_obj, synthio_miditrack_obj_get_error_location);
167+
168+
MP_PROPERTY_GETTER(synthio_miditrack_error_location_obj,
169+
(mp_obj_t)&synthio_miditrack_get_error_location_obj);
170+
154171
STATIC const mp_rom_map_elem_t synthio_miditrack_locals_dict_table[] = {
155172
// Methods
156173
{ MP_ROM_QSTR(MP_QSTR_deinit), MP_ROM_PTR(&synthio_miditrack_deinit_obj) },
@@ -159,6 +176,7 @@ STATIC const mp_rom_map_elem_t synthio_miditrack_locals_dict_table[] = {
159176

160177
// Properties
161178
{ MP_ROM_QSTR(MP_QSTR_sample_rate), MP_ROM_PTR(&synthio_miditrack_sample_rate_obj) },
179+
{ MP_ROM_QSTR(MP_QSTR_error_location), MP_ROM_PTR(&synthio_miditrack_error_location_obj) },
162180
};
163181
STATIC MP_DEFINE_CONST_DICT(synthio_miditrack_locals_dict, synthio_miditrack_locals_dict_table);
164182

shared-bindings/synthio/MidiTrack.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,4 @@ bool common_hal_synthio_miditrack_deinited(synthio_miditrack_obj_t *self);
3939
uint32_t common_hal_synthio_miditrack_get_sample_rate(synthio_miditrack_obj_t *self);
4040
uint8_t common_hal_synthio_miditrack_get_bits_per_sample(synthio_miditrack_obj_t *self);
4141
uint8_t common_hal_synthio_miditrack_get_channel_count(synthio_miditrack_obj_t *self);
42+
mp_int_t common_hal_synthio_miditrack_get_error_location(synthio_miditrack_obj_t *self);

shared-module/synthio/MidiTrack.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929

3030

3131
STATIC void print_midi_stream_error(synthio_miditrack_obj_t *self) {
32-
mp_cprintf(&mp_plat_print, translate("Error in MIDI stream at position %d"), self->pos);
32+
self->error_location = self->pos;
3333
self->pos = self->track.len;
3434
}
3535

@@ -106,6 +106,7 @@ static void decode_until_pause(synthio_miditrack_obj_t *self) {
106106

107107
STATIC void start_parse(synthio_miditrack_obj_t *self) {
108108
self->pos = 0;
109+
self->error_location = -1;
109110
self->synth.span.dur = decode_duration(self);
110111
if (self->synth.span.dur == 0) {
111112
// the usual case: the file starts with some MIDI event, not a delay
@@ -135,6 +136,10 @@ bool common_hal_synthio_miditrack_deinited(synthio_miditrack_obj_t *self) {
135136
return synthio_synth_deinited(&self->synth);
136137
}
137138

139+
mp_int_t common_hal_synthio_miditrack_get_error_location(synthio_miditrack_obj_t *self) {
140+
return self->error_location;
141+
}
142+
138143
uint32_t common_hal_synthio_miditrack_get_sample_rate(synthio_miditrack_obj_t *self) {
139144
return self->synth.sample_rate;
140145
}

shared-module/synthio/MidiTrack.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ typedef struct {
3737
mp_buffer_info_t track;
3838
// invariant: after initial startup, pos always points just after an encoded duration, i.e., at a midi message (or at EOF)
3939
size_t pos;
40+
mp_int_t error_location;
4041
uint32_t tempo;
4142
} synthio_miditrack_obj_t;
4243

0 commit comments

Comments
 (0)