usbd_midi/packet/
reader.rs1use crate::class::{MAX_PACKET_SIZE, MIDI_PACKET_SIZE};
4use crate::packet::{UsbMidiEventPacket, UsbMidiEventPacketError};
5
6pub struct UsbMidiPacketReader<'a> {
8 buffer: &'a [u8; MAX_PACKET_SIZE],
9 position: usize,
10 raw_bytes_received: usize,
11}
12
13impl<'a> UsbMidiPacketReader<'a> {
14 pub fn new(buffer: &'a [u8; MAX_PACKET_SIZE], raw_bytes_received: usize) -> Self {
16 UsbMidiPacketReader {
17 buffer,
18 position: 0,
19 raw_bytes_received,
20 }
21 }
22}
23
24impl Iterator for UsbMidiPacketReader<'_> {
25 type Item = Result<UsbMidiEventPacket, UsbMidiEventPacketError>;
26
27 fn next(&mut self) -> Option<Self::Item> {
28 if self.position <= MAX_PACKET_SIZE && self.position < self.raw_bytes_received {
29 let packet = self
30 .buffer
31 .get(self.position..(self.position + MIDI_PACKET_SIZE))
32 .map(UsbMidiEventPacket::try_from);
33
34 self.position += MIDI_PACKET_SIZE;
35 return packet;
36 }
37 None
38 }
39}