Skip to content

Commit b5fd519

Browse files
KBone12ibmibmibm
authored andcommitted
Fix received data buffer size when using WinRT
1 parent ffe61d2 commit b5fd519

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

src/backend/winrt/mod.rs

+10-12
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,13 @@ winrt::import!(
1414
windows::foundation::*
1515
windows::devices::midi::*
1616
windows::devices::enumeration::DeviceInformation
17-
windows::storage::streams::{Buffer, DataWriter}
17+
windows::storage::streams::{DataReader, DataWriter}
1818
);
1919

2020
use self::windows::foundation::*;
2121
use self::windows::devices::midi::*;
2222
use self::windows::devices::enumeration::DeviceInformation;
23-
use self::windows::storage::streams::{Buffer, DataWriter};
23+
use self::windows::storage::streams::{DataReader, DataWriter};
2424

2525
#[derive(Clone, PartialEq)]
2626
pub struct MidiInputPort {
@@ -127,15 +127,13 @@ impl MidiInput {
127127
fn handle_input<T>(args: &MidiMessageReceivedEventArgs, handler_data: &mut HandlerData<T>) {
128128
let ignore = handler_data.ignore_flags;
129129
let data = &mut handler_data.user_data.as_mut().unwrap();
130-
let timestamp;
131-
let byte_access: IMemoryBufferByteAccess;
132-
let message_bytes;
133-
let message = args.message().expect("get_message failed");
134-
timestamp = message.timestamp().expect("get_timestamp failed").duration as u64 / 10;
135-
let buffer = message.raw_data().expect("get_raw_data failed");
136-
let membuffer = Buffer::create_memory_buffer_over_ibuffer(&buffer).expect("create_memory_buffer_over_ibuffer failed");
137-
byte_access = membuffer.create_reference().expect("create_reference failed").try_into().unwrap();
138-
message_bytes = unsafe { byte_access.get_buffer().expect("get_buffer failed") }; // TODO: somehow make sure that the buffer is not invalidated while we're reading from it ...
130+
let message = args.message().expect("Message failed");
131+
let timestamp = message.timestamp().expect("Timestamp failed").duration as u64 / 10;
132+
let buffer = message.raw_data().expect("raw_data failed");
133+
let length = buffer.length().expect("length failed") as usize;
134+
let data_reader = DataReader::from_buffer(&buffer).expect("from_buffer failed");
135+
let mut message_bytes = vec![0; length];
136+
data_reader.read_bytes(&mut message_bytes).expect("read_bytes failed");
139137

140138
// The first byte in the message is the status
141139
let status = message_bytes[0];
@@ -145,7 +143,7 @@ impl MidiInput {
145143
status == 0xF8 && ignore.contains(Ignore::Time) ||
146144
status == 0xFE && ignore.contains(Ignore::ActiveSense))
147145
{
148-
(handler_data.callback)(timestamp, message_bytes, data);
146+
(handler_data.callback)(timestamp, &message_bytes, data);
149147
}
150148
}
151149

0 commit comments

Comments
 (0)