Skip to content

Commit ca881e1

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

File tree

3 files changed

+132
-10
lines changed

3 files changed

+132
-10
lines changed

shared-bindings/usb_midi/__init__.c

Lines changed: 94 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,101 @@ 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 mp_obj_t usb_midi_set_custom_name(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args, char **custom_name) {
82+
static const mp_arg_t allowed_args[] = {
83+
{ MP_QSTR_name, MP_ARG_OBJ | MP_ARG_REQUIRED, {.u_rom_obj = mp_const_none} }
84+
};
85+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
86+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&args);
87+
88+
mp_buffer_info_t name;
89+
mp_get_buffer_raise(args[0].u_obj, &name, MP_BUFFER_READ);
90+
mp_arg_validate_length_range(name.len, 1, 126, MP_QSTR_name);
91+
92+
if (*custom_name == NULL) {
93+
*custom_name = port_malloc(sizeof(char) * 128, false);
94+
}
95+
memcpy(*custom_name, name.buf, name.len);
96+
*custom_name[name.len] = 0;
97+
98+
return mp_const_none;
99+
}
100+
101+
//| def set_streaming_interface_name(name: str) -> None:
102+
//| """Override the MIDI interface name in the USB Interface Descriptor.
103+
//|
104+
//| ``name`` must be an ASCII string (or buffer) of at most 126 characters.
105+
//|
106+
//| This method must be called in boot.py to have any effect.
107+
//|
108+
//| Not available on boards without native USB support.
109+
//| """
110+
//| ...
111+
//|
112+
STATIC mp_obj_t usb_midi_set_streaming_interface_name(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
113+
return usb_midi_set_custom_name(n_args, pos_args, kw_args, &custom_usb_midi_streaming_interface_name);
114+
}
115+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_streaming_interface_name_obj, 1, usb_midi_set_streaming_interface_name);
116+
117+
//| def set_audio_control_interface_name(name: str) -> None:
118+
//| """Override the audio control interface name in the USB Interface Descriptor.
119+
//|
120+
//| ``name`` must be an ASCII string (or buffer) of at most 126 characters.
121+
//|
122+
//| This method must be called in boot.py to have any effect.
123+
//|
124+
//| Not available on boards without native USB support.
125+
//| """
126+
//| ...
127+
//|
128+
STATIC mp_obj_t usb_midi_set_audio_control_interface_name(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
129+
return usb_midi_set_custom_name(n_args, pos_args, kw_args, &custom_usb_midi_audio_control_interface_name);
130+
}
131+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_audio_control_interface_name_obj, 1, usb_midi_set_audio_control_interface_name);
132+
133+
//| def set_in_jack_name(name: str) -> None:
134+
//| """Override the MIDI IN jack name in the USB Interface Descriptor.
135+
//|
136+
//| ``name`` must be an ASCII string (or buffer) of at most 126 characters.
137+
//|
138+
//| This method must be called in boot.py to have any effect.
139+
//|
140+
//| Not available on boards without native USB support.
141+
//| """
142+
//| ...
143+
//|
144+
STATIC mp_obj_t usb_midi_set_in_jack_name(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
145+
return usb_midi_set_custom_name(n_args, pos_args, kw_args, &custom_usb_midi_in_jack_name);
146+
}
147+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_in_jack_name_obj, 1, usb_midi_set_in_jack_name);
148+
149+
//| def set_out_jack_name(name: str) -> None:
150+
//| """Override the MIDI OUT jack name in the USB Interface Descriptor.
151+
//|
152+
//| ``name`` must be an ASCII string (or buffer) of at most 126 characters.
153+
//|
154+
//| This method must be called in boot.py to have any effect.
155+
//|
156+
//| Not available on boards without native USB support.
157+
//| """
158+
//| ...
159+
//|
160+
STATIC mp_obj_t usb_midi_set_out_jack_name(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
161+
return usb_midi_set_custom_name(n_args, pos_args, kw_args, &custom_usb_midi_out_jack_name);
162+
}
163+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_out_jack_name_obj, 1, usb_midi_set_out_jack_name);
164+
81165
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) },
166+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) },
167+
{ MP_ROM_QSTR(MP_QSTR_disable), MP_OBJ_FROM_PTR(&usb_midi_disable_obj) },
168+
{ MP_ROM_QSTR(MP_QSTR_enable), MP_OBJ_FROM_PTR(&usb_midi_enable_obj) },
169+
{ MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple },
170+
{ MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) },
171+
{ MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) },
172+
{ MP_ROM_QSTR(MP_QSTR_set_streaming_interface_name), MP_OBJ_FROM_PTR(&usb_midi_set_streaming_interface_name_obj) },
173+
{ MP_ROM_QSTR(MP_QSTR_set_audio_control_interface_name), MP_OBJ_FROM_PTR(&usb_midi_set_audio_control_interface_name_obj) },
174+
{ MP_ROM_QSTR(MP_QSTR_set_in_jack_name), MP_OBJ_FROM_PTR(&usb_midi_set_in_jack_name_obj) },
175+
{ MP_ROM_QSTR(MP_QSTR_set_out_jack_name), MP_OBJ_FROM_PTR(&usb_midi_set_out_jack_name_obj) },
88176
};
89177

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