Skip to content

Commit ae9197b

Browse files
committed
Make USB MIDI interface names customizable
1 parent 8027efe commit ae9197b

File tree

3 files changed

+141
-10
lines changed

3 files changed

+141
-10
lines changed

shared-bindings/usb_midi/__init__.c

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,110 @@ STATIC mp_obj_t usb_midi_enable(void) {
7878
}
7979
MP_DEFINE_CONST_FUN_OBJ_0(usb_midi_enable_obj, usb_midi_enable);
8080

81+
//| def set_names(
82+
//| self,
83+
//| *,
84+
//| streaming_interface_name: str = None,
85+
//| audio_control_interface_name: str = None,
86+
//| in_jack_name: str = None,
87+
//| out_jack_name: str = None
88+
//| ) -> None:
89+
//| """Override the MIDI interface names in the USB Interface Descriptor.
90+
//|
91+
//| ``streaming_interface_name`` must be an ASCII string (or buffer) of at most 126 characters.
92+
//| ``audio_control_interface_name`` must be an ASCII string (or buffer) of at most 126 characters.
93+
//| ``in_jack_name`` must be an ASCII string (or buffer) of at most 126 characters.
94+
//| ``out_jack_name`` must be an ASCII string (or buffer) of at most 126 characters.
95+
//|
96+
//| This method must be called in boot.py to have any effect.
97+
//|
98+
//| Not available on boards without native USB support.
99+
//| """
100+
//| ...
101+
//|
102+
STATIC mp_obj_t usb_midi_set_names(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
103+
enum { ARG_streaming_interface_name, ARG_audio_control_interface_name, ARG_in_jack_name, ARG_out_jack_name };
104+
static const mp_arg_t allowed_args[] = {
105+
{ MP_QSTR_streaming_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
106+
{ MP_QSTR_audio_control_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
107+
{ MP_QSTR_in_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
108+
{ MP_QSTR_out_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
109+
};
110+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
111+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&args);
112+
113+
mp_obj_t streaming_interface_name_obj = args[ARG_streaming_interface_name].u_obj;
114+
115+
if (streaming_interface_name_obj != mp_const_none) {
116+
mp_buffer_info_t streaming_interface_name;
117+
mp_get_buffer_raise(streaming_interface_name_obj, &streaming_interface_name, MP_BUFFER_READ);
118+
mp_arg_validate_length_range(streaming_interface_name.len, 1, 126, MP_QSTR_streaming_interface_name);
119+
120+
if (custom_usb_midi_streaming_interface_name == NULL) {
121+
custom_usb_midi_streaming_interface_name = port_malloc(sizeof(char) * 128, false);
122+
}
123+
124+
memcpy(custom_usb_midi_streaming_interface_name, streaming_interface_name.buf, streaming_interface_name.len);
125+
custom_usb_midi_streaming_interface_name[streaming_interface_name.len] = 0;
126+
}
127+
128+
mp_obj_t audio_control_interface_name_obj = args[ARG_audio_control_interface_name].u_obj;
129+
130+
if (audio_control_interface_name_obj != mp_const_none) {
131+
mp_buffer_info_t audio_control_interface_name;
132+
mp_get_buffer_raise(audio_control_interface_name_obj, &audio_control_interface_name, MP_BUFFER_READ);
133+
mp_arg_validate_length_range(audio_control_interface_name.len, 1, 126, MP_QSTR_audio_control_interface_name);
134+
135+
if (custom_usb_midi_audio_control_interface_name == NULL) {
136+
custom_usb_midi_audio_control_interface_name = port_malloc(sizeof(char) * 128, false);
137+
}
138+
139+
memcpy(custom_usb_midi_audio_control_interface_name, audio_control_interface_name.buf, audio_control_interface_name.len);
140+
custom_usb_midi_audio_control_interface_name[audio_control_interface_name.len] = 0;
141+
}
142+
143+
mp_obj_t in_jack_name_obj = args[ARG_in_jack_name].u_obj;
144+
145+
if (in_jack_name_obj != mp_const_none) {
146+
mp_buffer_info_t in_jack_name;
147+
mp_get_buffer_raise(in_jack_name_obj, &in_jack_name, MP_BUFFER_READ);
148+
mp_arg_validate_length_range(in_jack_name.len, 1, 126, MP_QSTR_in_jack_name);
149+
150+
if (custom_usb_midi_in_jack_name == NULL) {
151+
custom_usb_midi_in_jack_name = port_malloc(sizeof(char) * 128, false);
152+
}
153+
154+
memcpy(custom_usb_midi_in_jack_name, in_jack_name.buf, in_jack_name.len);
155+
custom_usb_midi_in_jack_name[in_jack_name.len] = 0;
156+
}
157+
158+
mp_obj_t out_jack_name_obj = args[ARG_out_jack_name].u_obj;
159+
160+
if (out_jack_name_obj != mp_const_none) {
161+
mp_buffer_info_t out_jack_name;
162+
mp_get_buffer_raise(out_jack_name_obj, &out_jack_name, MP_BUFFER_READ);
163+
mp_arg_validate_length_range(out_jack_name.len, 1, 126, MP_QSTR_out_jack_name);
164+
165+
if (custom_usb_midi_out_jack_name == NULL) {
166+
custom_usb_midi_out_jack_name = port_malloc(sizeof(char) * 128, false);
167+
}
168+
169+
memcpy(custom_usb_midi_out_jack_name, out_jack_name.buf, out_jack_name.len);
170+
custom_usb_midi_out_jack_name[out_jack_name.len] = 0;
171+
}
172+
173+
return mp_const_none;
174+
}
175+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_names_obj, 0, usb_midi_set_names);
176+
81177
mp_map_elem_t usb_midi_module_globals_table[] = {
82-
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) },
83-
{ MP_ROM_QSTR(MP_QSTR_disable), MP_OBJ_FROM_PTR(&usb_midi_disable_obj) },
84-
{ MP_ROM_QSTR(MP_QSTR_enable), MP_OBJ_FROM_PTR(&usb_midi_enable_obj) },
85-
{ MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple },
86-
{ MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) },
87-
{ MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) },
178+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) },
179+
{ MP_ROM_QSTR(MP_QSTR_disable), MP_OBJ_FROM_PTR(&usb_midi_disable_obj) },
180+
{ MP_ROM_QSTR(MP_QSTR_enable), MP_OBJ_FROM_PTR(&usb_midi_enable_obj) },
181+
{ MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple },
182+
{ MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) },
183+
{ MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) },
184+
{ MP_ROM_QSTR(MP_QSTR_set_names), MP_OBJ_FROM_PTR(&usb_midi_set_names_obj) },
88185
};
89186

90187
// This isn't const so we can set ports dynamically.

shared-module/usb_midi/__init__.c

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -177,12 +177,17 @@ size_t usb_midi_descriptor_length(void) {
177177
return sizeof(usb_midi_descriptor_template);
178178
}
179179

180-
static const char midi_streaming_interface_name[] = USB_INTERFACE_NAME " MIDI";
181-
static const char midi_audio_control_interface_name[] = USB_INTERFACE_NAME " Audio";
182-
static const char midi_in_jack_name[] = USB_INTERFACE_NAME " usb_midi.ports[0]";
183-
static const char midi_out_jack_name[] = USB_INTERFACE_NAME " usb_midi.ports[0]";
180+
char *custom_usb_midi_streaming_interface_name;
181+
char *custom_usb_midi_audio_control_interface_name;
182+
char *custom_usb_midi_in_jack_name;
183+
char *custom_usb_midi_out_jack_name;
184184

185185
size_t usb_midi_add_descriptor(uint8_t *descriptor_buf, descriptor_counts_t *descriptor_counts, uint8_t *current_interface_string) {
186+
const char *midi_streaming_interface_name;
187+
const char *midi_audio_control_interface_name;
188+
const char *midi_in_jack_name;
189+
const char *midi_out_jack_name;
190+
186191
memcpy(descriptor_buf, usb_midi_descriptor_template, sizeof(usb_midi_descriptor_template));
187192

188193
descriptor_buf[MIDI_AUDIO_CONTROL_INTERFACE_NUMBER_INDEX] = descriptor_counts->current_interface;
@@ -200,18 +205,42 @@ size_t usb_midi_add_descriptor(uint8_t *descriptor_buf, descriptor_counts_t *des
200205
descriptor_buf[MIDI_STREAMING_INTERFACE_NUMBER_INDEX_2] = descriptor_counts->current_interface;
201206
descriptor_counts->current_interface++;
202207

208+
if (custom_usb_midi_streaming_interface_name == NULL) {
209+
midi_streaming_interface_name = USB_INTERFACE_NAME " MIDI";
210+
} else {
211+
midi_streaming_interface_name = custom_usb_midi_streaming_interface_name;
212+
}
213+
203214
usb_add_interface_string(*current_interface_string, midi_streaming_interface_name);
204215
descriptor_buf[MIDI_STREAMING_INTERFACE_STRING_INDEX] = *current_interface_string;
205216
(*current_interface_string)++;
206217

218+
if (custom_usb_midi_audio_control_interface_name == NULL) {
219+
midi_audio_control_interface_name = USB_INTERFACE_NAME " Audio";
220+
} else {
221+
midi_audio_control_interface_name = custom_usb_midi_audio_control_interface_name;
222+
}
223+
207224
usb_add_interface_string(*current_interface_string, midi_audio_control_interface_name);
208225
descriptor_buf[MIDI_AUDIO_CONTROL_INTERFACE_STRING_INDEX] = *current_interface_string;
209226
(*current_interface_string)++;
210227

228+
if (custom_usb_midi_in_jack_name == NULL) {
229+
midi_in_jack_name = USB_INTERFACE_NAME " usb_midi.ports[0]";
230+
} else {
231+
midi_in_jack_name = custom_usb_midi_in_jack_name;
232+
}
233+
211234
usb_add_interface_string(*current_interface_string, midi_in_jack_name);
212235
descriptor_buf[MIDI_IN_JACK_STRING_INDEX] = *current_interface_string;
213236
(*current_interface_string)++;
214237

238+
if (custom_usb_midi_out_jack_name == NULL) {
239+
midi_out_jack_name = USB_INTERFACE_NAME " usb_midi.ports[0]";
240+
} else {
241+
midi_out_jack_name = custom_usb_midi_out_jack_name;
242+
}
243+
215244
usb_add_interface_string(*current_interface_string, midi_out_jack_name);
216245
descriptor_buf[MIDI_OUT_JACK_STRING_INDEX] = *current_interface_string;
217246
(*current_interface_string)++;

shared-module/usb_midi/__init__.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,9 @@ void usb_midi_setup_ports(void);
3636
size_t usb_midi_descriptor_length(void);
3737
size_t usb_midi_add_descriptor(uint8_t *descriptor_buf, descriptor_counts_t *descriptor_counts, uint8_t *current_interface_string);
3838

39+
extern char *custom_usb_midi_streaming_interface_name;
40+
extern char *custom_usb_midi_audio_control_interface_name;
41+
extern char *custom_usb_midi_in_jack_name;
42+
extern char *custom_usb_midi_out_jack_name;
43+
3944
#endif /* SHARED_MODULE_USB_MIDI___INIT___H */

0 commit comments

Comments
 (0)