Skip to content

Commit 0f66ecb

Browse files
authored
Merge pull request #9146 from brushmate/customizable_midi_interface_names
Make USB MIDI interface names customizable
2 parents fbd9a6e + 9d8eebc commit 0f66ecb

File tree

5 files changed

+114
-10
lines changed

5 files changed

+114
-10
lines changed

ports/atmel-samd/boards/pybadge/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ CIRCUITPY_AESIO = 0
1414
CIRCUITPY_FLOPPYIO = 0
1515
CIRCUITPY_FRAMEBUFFERIO = 0
1616
CIRCUITPY_GIFIO = 0
17+
CIRCUITPY_I2CDISPLAYBUS = 0
1718
CIRCUITPY_JPEGIO = 0
1819
CIRCUITPY_KEYPAD = 1
20+
CIRCUITPY_PARALLELDISPLAYBUS= 0
1921
CIRCUITPY_STAGE = 1
2022

2123
FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/pybadge

ports/atmel-samd/boards/pygamer/mpconfigboard.mk

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ CIRCUITPY_AESIO = 0
1414
CIRCUITPY_FLOPPYIO = 0
1515
CIRCUITPY_FRAMEBUFFERIO = 0
1616
CIRCUITPY_GIFIO = 0
17+
CIRCUITPY_I2CDISPLAYBUS = 0
1718
CIRCUITPY_JPEGIO = 0
1819
CIRCUITPY_KEYPAD = 1
20+
CIRCUITPY_PARALLELDISPLAYBUS= 0
1921
CIRCUITPY_STAGE = 1
2022

2123
FROZEN_MPY_DIRS += $(TOP)/frozen/circuitpython-stage/pygamer

shared-bindings/usb_midi/__init__.c

Lines changed: 72 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -78,13 +78,79 @@ 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+
82+
static void set_name(mp_obj_t name_obj, qstr arg_name_qstr, char **custom_name_p) {
83+
if (name_obj != mp_const_none) {
84+
mp_buffer_info_t name;
85+
mp_get_buffer_raise(name_obj, &name, MP_BUFFER_READ);
86+
mp_arg_validate_length_range(name.len, 1, 126, arg_name_qstr);
87+
88+
if (*custom_name_p == NULL) {
89+
*custom_name_p = port_malloc(sizeof(char) * 128, false);
90+
}
91+
92+
memcpy(*custom_name_p, name.buf, name.len);
93+
(*custom_name_p)[name.len] = 0;
94+
}
95+
}
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+
//| :param Optional[str] streaming_interface_name: an ASCII string (or buffer) of at most 126 characters, or ``None`` to use the default name.
109+
//| :param Optional[str] audio_control_interface_name: an ASCII string (or buffer) of at most 126 characters, or ``None`` to use the default name.
110+
//| :param Optional[str] in_jack_name: an ASCII string (or buffer) of at most 126 characters, or ``None`` to use the default name.
111+
//| :param Optional[str] out_jack_name: an ASCII string (or buffer) of at most 126 characters, or ``None`` to use the default name.
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+
enum { ARG_streaming_interface_name, ARG_audio_control_interface_name, ARG_in_jack_name, ARG_out_jack_name };
121+
static const mp_arg_t allowed_args[] = {
122+
{ MP_QSTR_streaming_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
123+
{ MP_QSTR_audio_control_interface_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
124+
{ MP_QSTR_in_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
125+
{ MP_QSTR_out_jack_name, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} },
126+
};
127+
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
128+
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, (mp_arg_val_t *)&args);
129+
130+
mp_obj_t streaming_interface_name_obj = args[ARG_streaming_interface_name].u_obj;
131+
set_name(streaming_interface_name_obj, MP_QSTR_streaming_interface_name, &custom_usb_midi_streaming_interface_name);
132+
133+
mp_obj_t audio_control_interface_name_obj = args[ARG_audio_control_interface_name].u_obj;
134+
set_name(audio_control_interface_name_obj, MP_QSTR_audio_control_interface_name, &custom_usb_midi_audio_control_interface_name);
135+
136+
mp_obj_t in_jack_name_obj = args[ARG_in_jack_name].u_obj;
137+
set_name(in_jack_name_obj, MP_QSTR_in_jack_name, &custom_usb_midi_in_jack_name);
138+
139+
mp_obj_t out_jack_name_obj = args[ARG_out_jack_name].u_obj;
140+
set_name(out_jack_name_obj, MP_QSTR_out_jack_name, &custom_usb_midi_out_jack_name);
141+
142+
return mp_const_none;
143+
}
144+
MP_DEFINE_CONST_FUN_OBJ_KW(usb_midi_set_names_obj, 0, usb_midi_set_names);
145+
81146
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) },
147+
{ MP_ROM_QSTR(MP_QSTR___name__), MP_ROM_QSTR(MP_QSTR_usb_midi) },
148+
{ MP_ROM_QSTR(MP_QSTR_disable), MP_OBJ_FROM_PTR(&usb_midi_disable_obj) },
149+
{ MP_ROM_QSTR(MP_QSTR_enable), MP_OBJ_FROM_PTR(&usb_midi_enable_obj) },
150+
{ MP_ROM_QSTR(MP_QSTR_set_names), MP_OBJ_FROM_PTR(&usb_midi_set_names_obj) },
151+
{ MP_ROM_QSTR(MP_QSTR_ports), mp_const_empty_tuple },
152+
{ MP_ROM_QSTR(MP_QSTR_PortIn), MP_OBJ_FROM_PTR(&usb_midi_portin_type) },
153+
{ MP_ROM_QSTR(MP_QSTR_PortOut), MP_OBJ_FROM_PTR(&usb_midi_portout_type) },
88154
};
89155

90156
// 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 = NULL;
181+
char *custom_usb_midi_audio_control_interface_name = NULL;
182+
char *custom_usb_midi_in_jack_name = NULL;
183+
char *custom_usb_midi_out_jack_name = NULL;
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)