Skip to content

Commit 814ebc6

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

File tree

3 files changed

+107
-10
lines changed

3 files changed

+107
-10
lines changed

shared-bindings/usb_midi/__init__.c

Lines changed: 69 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,76 @@ 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+
STATIC void set_name(mp_obj_t *arg_obj, qstr arg_name, char **custom_name) {
82+
if (*arg_obj == mp_const_none) {
83+
return;
84+
}
85+
86+
mp_buffer_info_t name;
87+
mp_get_buffer_raise(*arg_obj, &name, MP_BUFFER_READ);
88+
mp_arg_validate_length_range(name.len, 1, 126, arg_name);
89+
90+
if (*custom_name == NULL) {
91+
*custom_name = port_malloc(sizeof(char) * 128, false);
92+
}
93+
94+
memcpy(*custom_name, name.buf, name.len);
95+
*custom_name[name.len] = 0;
96+
}
97+
98+
//| def set_names(
99+
//| self,
100+
//| *,
101+
//| streaming_interface_name: Optional[str] = None,
102+
//| audio_control_interface_name: Optional[str] = None,
103+
//| in_jack_name: Optional[str] = None,
104+
//| out_jack_name: Optional[str] = None
105+
//| ) -> None:
106+
//| """Override the MIDI interface names in the USB Interface Descriptor.
107+
//|
108+
//| ``streaming_interface_name`` must be an ASCII string (or buffer) of at most 126 characters.
109+
//| ``audio_control_interface_name`` must be an ASCII string (or buffer) of at most 126 characters.
110+
//| ``in_jack_name`` must be an ASCII string (or buffer) of at most 126 characters.
111+
//| ``out_jack_name`` must be an ASCII string (or buffer) of at most 126 characters.
112+
//|
113+
//| This method must be called in boot.py to have any effect.
114+
//|
115+
//| Not available on boards without native USB support.
116+
//| """
117+
//| ...
118+
//|
119+
STATIC mp_obj_t usb_midi_set_names(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
120+
static const mp_arg_t allowed_args[] = {
121+
{ MP_QSTR_streaming_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
122+
{ MP_QSTR_audio_control_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
123+
{ MP_QSTR_in_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
124+
{ MP_QSTR_out_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
125+
};
126+
struct {
127+
mp_arg_val_t streaming_interface_name;
128+
mp_arg_val_t audio_control_interface_name;
129+
mp_arg_val_t in_jack_name;
130+
mp_arg_val_t out_jack_name;
131+
} args;
132+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&args);
133+
134+
set_name(&(args.streaming_interface_name.u_obj), MP_QSTR_streaming_interface_name, &custom_usb_midi_streaming_interface_name);
135+
set_name(&(args.audio_control_interface_name.u_obj), MP_QSTR_audio_control_interface_name, &custom_usb_midi_audio_control_interface_name);
136+
set_name(&(args.in_jack_name.u_obj), MP_QSTR_in_jack_name, &custom_usb_midi_in_jack_name);
137+
set_name(&(args.out_jack_name.u_obj), MP_QSTR_out_jack_name, &custom_usb_midi_out_jack_name);
138+
139+
return mp_const_none;
140+
}
141+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_names_obj, 0, usb_midi_set_names);
142+
81143
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) },
144+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) },
145+
{ MP_ROM_QSTR(MP_QSTR_disable), MP_OBJ_FROM_PTR(&usb_midi_disable_obj) },
146+
{ MP_ROM_QSTR(MP_QSTR_enable), MP_OBJ_FROM_PTR(&usb_midi_enable_obj) },
147+
{ MP_ROM_QSTR(MP_QSTR_set_names), MP_OBJ_FROM_PTR(&usb_midi_set_names_obj) },
148+
{ MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple },
149+
{ MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) },
150+
{ MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) },
88151
};
89152

90153
// 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)