Skip to content

Commit af03685

Browse files
committed
Fixed descriptors when device has no input or output jacks
1 parent 4554296 commit af03685

File tree

1 file changed

+42
-32
lines changed

1 file changed

+42
-32
lines changed

src/class.rs

Lines changed: 42 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -150,10 +150,16 @@ impl<B: UsbBus> UsbClass<B> for UsbMidiClass<'_, B> {
150150
let midi_streaming_total_length = 7
151151
+ (self.n_in_jacks + self.n_out_jacks) as usize
152152
* (MIDI_IN_SIZE + MIDI_OUT_SIZE) as usize
153-
+ 9
154-
+ (4 + self.n_out_jacks as usize)
155-
+ 9
156-
+ (4 + self.n_in_jacks as usize);
153+
+ if self.n_out_jacks > 0 {
154+
9 + (4 + self.n_out_jacks as usize)
155+
} else {
156+
0
157+
}
158+
+ if self.n_in_jacks > 0 {
159+
9 + 4 + self.n_in_jacks as usize
160+
} else {
161+
0
162+
};
157163

158164
// Streaming extra info
159165
writer.write(
@@ -233,37 +239,41 @@ impl<B: UsbBus> UsbClass<B> for UsbMidiClass<'_, B> {
233239
0, // jack mappings. must be filled in and cropped.
234240
];
235241

236-
writer.endpoint_ex(&self.standard_bulkout, |data| {
237-
data[0] = 0; // bRefresh
238-
data[1] = 0; // bSynchAddress
239-
Ok(2)
240-
})?; // len = 9
241-
242-
endpoint_data[1] = self.n_out_jacks;
243-
for i in 0..self.n_out_jacks {
244-
endpoint_data[2 + i as usize] = self.in_jack_id_emb(i);
242+
if self.n_out_jacks > 0 {
243+
writer.endpoint_ex(&self.standard_bulkout, |data| {
244+
data[0] = 0; // bRefresh
245+
data[1] = 0; // bSynchAddress
246+
Ok(2)
247+
})?; // len = 9
248+
249+
endpoint_data[1] = self.n_out_jacks;
250+
for i in 0..self.n_out_jacks {
251+
endpoint_data[2 + i as usize] = self.in_jack_id_emb(i);
252+
}
253+
writer.write(
254+
// len = 4 + self.n_out_jacks
255+
CS_ENDPOINT,
256+
&endpoint_data[0..2 + self.n_out_jacks as usize],
257+
)?;
245258
}
246-
writer.write(
247-
// len = 4 + self.n_out_jacks
248-
CS_ENDPOINT,
249-
&endpoint_data[0..2 + self.n_out_jacks as usize],
250-
)?;
251259

252-
writer.endpoint_ex(&self.standard_bulkin, |data| {
253-
data[0] = 0; // bRefresh
254-
data[1] = 0; // bSynchAddress
255-
Ok(2)
256-
})?; // len = 9
257-
258-
endpoint_data[1] = self.n_in_jacks;
259-
for i in 0..self.n_in_jacks {
260-
endpoint_data[2 + i as usize] = self.out_jack_id_emb(i);
260+
if self.n_in_jacks > 0 {
261+
writer.endpoint_ex(&self.standard_bulkin, |data| {
262+
data[0] = 0; // bRefresh
263+
data[1] = 0; // bSynchAddress
264+
Ok(2)
265+
})?; // len = 9
266+
267+
endpoint_data[1] = self.n_in_jacks;
268+
for i in 0..self.n_in_jacks {
269+
endpoint_data[2 + i as usize] = self.out_jack_id_emb(i);
270+
}
271+
writer.write(
272+
// len = 4 + self.n_in_jacks
273+
CS_ENDPOINT,
274+
&endpoint_data[0..2 + self.n_in_jacks as usize],
275+
)?;
261276
}
262-
writer.write(
263-
// len = 4 + self.n_in_jacks
264-
CS_ENDPOINT,
265-
&endpoint_data[0..2 + self.n_in_jacks as usize],
266-
)?;
267277

268278
let midi_streaming_end_byte = writer.position();
269279
assert!(midi_streaming_end_byte - midi_streaming_start_byte == midi_streaming_total_length);

0 commit comments

Comments
 (0)