Skip to content

Commit 31a8cd7

Browse files
committed
avoid copying MIDI raw data before decoding it
1 parent 3d2cf2e commit 31a8cd7

File tree

2 files changed

+63
-79
lines changed

2 files changed

+63
-79
lines changed

kiro-midi-core/src/decoder.rs

Lines changed: 62 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,13 @@ impl<'a> Decoder<'a> {
9696
}
9797
}
9898

99-
pub fn decode<Source, Callbacks>(
99+
pub fn decode<'b, Source, Callbacks>(
100100
&mut self,
101101
source: &mut Source,
102102
callbacks: &mut Callbacks,
103103
) -> Result<()>
104104
where
105-
Source: Iterator<Item = u8>,
105+
Source: Iterator<Item = &'b u8>,
106106
Callbacks: DecoderCallbacks,
107107
{
108108
while !self.state.finished() {
@@ -114,13 +114,13 @@ impl<'a> Decoder<'a> {
114114
Ok(())
115115
}
116116

117-
fn decode_step<Source, Callbacks>(
117+
fn decode_step<'b, Source, Callbacks>(
118118
&mut self,
119119
source: &mut Source,
120120
callbacks: &mut Callbacks,
121121
) -> Result<()>
122122
where
123-
Source: Iterator<Item = u8>,
123+
Source: Iterator<Item = &'b u8>,
124124
Callbacks: DecoderCallbacks,
125125
{
126126
let mut state = self.state;
@@ -142,7 +142,10 @@ impl<'a> Decoder<'a> {
142142
Ok(())
143143
}
144144

145-
fn decode_start<Source: Iterator<Item = u8>>(&mut self, source: &mut Source) -> Result<()> {
145+
fn decode_start<'b, Source: Iterator<Item = &'b u8>>(
146+
&mut self,
147+
source: &mut Source,
148+
) -> Result<()> {
146149
self.state = match self.read_next(source) {
147150
Ok(status) => Self::next_state_for_status(status),
148151
Err(Error::MissingData) => Ok(State::Finished),
@@ -151,7 +154,7 @@ impl<'a> Decoder<'a> {
151154
Ok(())
152155
}
153156

154-
fn decode_partial<Source, Callbacks>(
157+
fn decode_partial<'b, Source, Callbacks>(
155158
&mut self,
156159
source: &mut Source,
157160
callbacks: &mut Callbacks,
@@ -160,7 +163,7 @@ impl<'a> Decoder<'a> {
160163
required: usize,
161164
) -> Result<()>
162165
where
163-
Source: Iterator<Item = u8>,
166+
Source: Iterator<Item = &'b u8>,
164167
Callbacks: DecoderCallbacks,
165168
{
166169
let limit = required.min(self.data_buffer.len());
@@ -205,14 +208,14 @@ impl<'a> Decoder<'a> {
205208
}
206209
}
207210

208-
fn decode_sysex<Source, Callbacks>(
211+
fn decode_sysex<'b, Source, Callbacks>(
209212
&mut self,
210213
source: &mut Source,
211214
callbacks: &mut Callbacks,
212215
mut len: usize,
213216
) -> Result<()>
214217
where
215-
Source: Iterator<Item = u8>,
218+
Source: Iterator<Item = &'b u8>,
216219
Callbacks: DecoderCallbacks,
217220
{
218221
while len < self.data_buffer.len()
@@ -255,13 +258,13 @@ impl<'a> Decoder<'a> {
255258
}
256259
}
257260

258-
fn decode_interleaved_realtime_messages<Source, Callbacks>(
261+
fn decode_interleaved_realtime_messages<'b, Source, Callbacks>(
259262
&mut self,
260263
source: &mut Source,
261264
callbacks: &mut Callbacks,
262265
) -> Result<()>
263266
where
264-
Source: Iterator<Item = u8>,
267+
Source: Iterator<Item = &'b u8>,
265268
Callbacks: DecoderCallbacks,
266269
{
267270
while self.next_is_status(source) {
@@ -275,23 +278,32 @@ impl<'a> Decoder<'a> {
275278
Ok(())
276279
}
277280

278-
pub fn source_is_empty<Source: Iterator<Item = u8>>(&mut self, source: &mut Source) -> bool {
281+
pub fn source_is_empty<'b, Source: Iterator<Item = &'b u8>>(
282+
&mut self,
283+
source: &mut Source,
284+
) -> bool {
279285
self.peek_next(source).is_none()
280286
}
281287

282-
pub fn next_is_status<Source: Iterator<Item = u8>>(&mut self, source: &mut Source) -> bool {
288+
pub fn next_is_status<'b, Source: Iterator<Item = &'b u8>>(
289+
&mut self,
290+
source: &mut Source,
291+
) -> bool {
283292
self.peek_next(source).map(is_midi_status).unwrap_or(false)
284293
}
285294

286-
pub fn read_next<Source: Iterator<Item = u8>>(&mut self, source: &mut Source) -> Result<u8> {
295+
pub fn read_next<'b, Source: Iterator<Item = &'b u8>>(
296+
&mut self,
297+
source: &mut Source,
298+
) -> Result<u8> {
287299
let maybe_byte = self.peek_next(source);
288-
self.source_buffer = source.next();
300+
self.source_buffer = source.next().cloned();
289301
maybe_byte.ok_or(Error::MissingData)
290302
}
291303

292-
fn peek_next<Source: Iterator<Item = u8>>(&mut self, source: &mut Source) -> Option<u8> {
304+
fn peek_next<'b, Source: Iterator<Item = &'b u8>>(&mut self, source: &mut Source) -> Option<u8> {
293305
if self.source_buffer.is_none() {
294-
self.source_buffer = source.next();
306+
self.source_buffer = source.next().cloned();
295307
}
296308
self.source_buffer
297309
}
@@ -555,7 +567,7 @@ mod tests {
555567
}
556568

557569
fn decodes_successfully(source: Vec<u8>, expected: Vec<Message>) {
558-
let mut source = source.into_iter();
570+
let mut source = source.iter();
559571
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
560572
assert_eq!(decoder.decode(&mut source, &mut callbacks), Ok(()));
561573
assert_eq!(callbacks.state().messages, expected);
@@ -565,7 +577,8 @@ mod tests {
565577
#[test]
566578
fn decode_empty_vec() {
567579
decoder_with_mocked_callbacks(&mut [], |mut callbacks, mut decoder| {
568-
let mut source = Vec::<u8>::new().into_iter();
580+
let data = Vec::<u8>::new();
581+
let mut source = data.iter();
569582
assert_eq!(decoder.decode(&mut source, &mut callbacks), Ok(()));
570583
assert_eq!(callbacks.state().num_events, 0);
571584
});
@@ -574,7 +587,8 @@ mod tests {
574587
#[test]
575588
fn reserved_status() {
576589
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
577-
let mut source = vec![0b1111_0100, 0b1111_0101, 0b1111_1001, 0b1111_1101].into_iter();
590+
let data = vec![0b1111_0100, 0b1111_0101, 0b1111_1001, 0b1111_1101];
591+
let mut source = data.iter();
578592

579593
assert_eq!(
580594
decoder.decode(&mut source, &mut callbacks),
@@ -598,7 +612,8 @@ mod tests {
598612
#[test]
599613
fn unexpected_status() {
600614
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
601-
let mut source = vec![0b1000_0000, 64, 0b1000_0001, 0b1000_0010, 12].into_iter();
615+
let data = vec![0b1000_0000, 64, 0b1000_0001, 0b1000_0010, 12];
616+
let mut source = data.iter();
602617

603618
assert_eq!(
604619
decoder.decode(&mut source, &mut callbacks),
@@ -668,7 +683,7 @@ mod tests {
668683
#[test]
669684
fn unexpected_channel_mode() {
670685
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
671-
let mut source = vec![
686+
let data = vec![
672687
0b1011_0101u8,
673688
120,
674689
1,
@@ -687,8 +702,8 @@ mod tests {
687702
0b1011_0101u8,
688703
127,
689704
1,
690-
]
691-
.into_iter();
705+
];
706+
let mut source = data.iter();
692707

693708
assert_eq!(
694709
decoder.decode(&mut source, &mut callbacks),
@@ -823,7 +838,8 @@ mod tests {
823838
#[test]
824839
fn decode_reserved() {
825840
decoder_with_mocked_callbacks(&mut [], |mut callbacks, mut decoder| {
826-
let mut source = vec![0b1111_0100u8, 0b1111_0101, 0b1111_1001, 0b1111_1101].into_iter();
841+
let data = vec![0b1111_0100u8, 0b1111_0101, 0b1111_1001, 0b1111_1101];
842+
let mut source = data.iter();
827843

828844
assert_eq!(
829845
decoder.decode(&mut source, &mut callbacks),
@@ -864,9 +880,9 @@ mod tests {
864880
#[test]
865881
fn sysex_buffer_overflow() {
866882
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
867-
let mut source = vec![0b1111_0000u8, 1, 2, 3, 4, 0b1111_0111].into_iter();
883+
let data = vec![0b1111_0000u8, 1, 2, 3, 4, 0b1111_0111];
868884
assert_eq!(
869-
decoder.decode(&mut source, &mut callbacks),
885+
decoder.decode(&mut data.iter(), &mut callbacks),
870886
Err(Error::DataBufferOverflow)
871887
);
872888
});
@@ -875,17 +891,17 @@ mod tests {
875891
#[test]
876892
fn decode_sysex_continuous() {
877893
decoder_with_mocked_callbacks(&mut [0u8; 4], |mut callbacks, mut decoder| {
878-
let mut source = vec![0b1111_0000u8, 1, 2, 3, 4, 0b1111_0111].into_iter();
894+
let data = vec![0b1111_0000u8, 1, 2, 3, 4, 0b1111_0111];
879895

880-
assert_eq!(decoder.decode(&mut source, &mut callbacks), Ok(()));
896+
assert_eq!(decoder.decode(&mut data.iter(), &mut callbacks), Ok(()));
881897
assert_eq!(callbacks.state().sysex, vec![1u8, 2, 3, 4]);
882898
});
883899
}
884900

885901
#[test]
886902
fn decode_sysex_interleaved() {
887903
decoder_with_mocked_callbacks(&mut [0u8; 4], |mut callbacks, mut decoder| {
888-
let mut source = vec![
904+
let data = vec![
889905
0b1111_0000u8,
890906
0b1111_1000u8,
891907
1,
@@ -896,10 +912,9 @@ mod tests {
896912
4,
897913
0b1111_1100,
898914
0b1111_0111,
899-
]
900-
.into_iter();
915+
];
901916

902-
assert_eq!(decoder.decode(&mut source, &mut callbacks), Ok(()));
917+
assert_eq!(decoder.decode(&mut data.iter(), &mut callbacks), Ok(()));
903918
assert_eq!(
904919
callbacks.state().messages,
905920
vec![
@@ -916,7 +931,7 @@ mod tests {
916931
#[test]
917932
fn decode_sysex_interleaved_split() {
918933
decoder_with_mocked_callbacks(&mut [0u8; 4], |mut callbacks, mut decoder| {
919-
let mut sources = vec![
934+
let dataset = vec![
920935
0b1111_0000u8,
921936
0b1111_1000u8,
922937
1,
@@ -926,51 +941,20 @@ mod tests {
926941
3,
927942
4,
928943
0b1111_1100,
929-
0b1111_0111,
930944
]
931945
.into_iter()
932-
.map(|value| vec![value].into_iter());
946+
.map(|value| vec![value])
947+
.collect::<Vec<Vec<u8>>>();
933948

934-
assert_eq!(
935-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
936-
Err(Error::MissingData)
937-
);
938-
assert_eq!(
939-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
940-
Err(Error::MissingData)
941-
);
942-
assert_eq!(
943-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
944-
Err(Error::MissingData)
945-
);
946-
assert_eq!(
947-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
948-
Err(Error::MissingData)
949-
);
950-
assert_eq!(
951-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
952-
Err(Error::MissingData)
953-
);
954-
assert_eq!(
955-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
956-
Err(Error::MissingData)
957-
);
958-
assert_eq!(
959-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
960-
Err(Error::MissingData)
961-
);
962-
assert_eq!(
963-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
964-
Err(Error::MissingData)
965-
);
966-
assert_eq!(
967-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
968-
Err(Error::MissingData)
969-
);
970-
assert_eq!(
971-
decoder.decode(&mut sources.next().unwrap(), &mut callbacks),
972-
Ok(())
973-
);
949+
dataset.iter().take(9).for_each(|data| {
950+
assert_eq!(
951+
decoder.decode(&mut data.iter(), &mut callbacks),
952+
Err(Error::MissingData)
953+
);
954+
});
955+
956+
let source = vec![0b1111_0111];
957+
assert_eq!(decoder.decode(&mut source.iter(), &mut callbacks), Ok(()));
974958

975959
assert_eq!(
976960
callbacks.state().messages,
@@ -988,8 +972,8 @@ mod tests {
988972
#[test]
989973
fn decode_stop() {
990974
decoder_with_mocked_callbacks(&mut [0u8; 2], |mut callbacks, mut decoder| {
991-
let mut source = vec![0b1000_0000, 64, 0b1111_1000u8, 12, 0b1111_1010u8].into_iter();
992-
975+
let data = vec![0b1000_0000, 64, 0b1111_1000u8, 12, 0b1111_1010u8];
976+
let mut source = data.iter();
993977
callbacks.state_mut().max_events = 1;
994978

995979
assert_eq!(decoder.decode(&mut source, &mut callbacks), Err(Stopped));

kiro-synth-host/src/midi/drivers/coremidi.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ impl CoreMidiDriver {
9393
// println!("{:?}", packet_list);
9494
for packet in packet_list.iter() {
9595
let timestamp = packet.timestamp();
96-
let mut source = packet.data().iter().copied();
96+
let mut source = packet.data().iter();
9797
let mut callbacks = MidiDecoderCallbacks { timestamp, handler };
9898
decoder.decode(&mut source, &mut callbacks).ok();
9999
}

0 commit comments

Comments
 (0)