// Create port ... let dest_port = matchself.client.as_mut().unwrap().register_midi_port(port_name, PortFlags::PortIsInput) {
Ok(p) => p,
Err(()) => { return Err(ConnectError::other("could not register JACK port", self)); }
};
// ... and connect it to the output iflet Err(_) = self.client.as_mut().unwrap().connect(&port.name, dest_port.get_name()) { return Err(ConnectError::new(ConnectErrorKind::InvalidPort, self));
}
// Create port let port = matchself.client.as_mut().unwrap().register_midi_port(port_name, PortFlags::PortIsInput) {
Ok(p) => p,
Err(()) => { return Err(ConnectError::other("could not register JACK port", self)); }
};
// Is port created? iflet Some(ref port) = data.port { let buff = port.get_midi_buffer(nframes);
letmut message = MidiMessage::new(); // TODO: create MidiMessage once and reuse its buffer for every handle_input call
// We have midi events in buffer let evcount = buff.get_event_count(); letmut event = mem::MaybeUninit::uninit();
for j in0..evcount {
message.bytes.clear(); unsafe { buff.get_event(event.as_mut_ptr(), j) }; let event = unsafe { event.assume_init() };
for i in0..event.size {
message.bytes.push(unsafe { *event.buffer.offset(i as isize) });
}
message.timestamp = Client::get_time(); // this is in microseconds
(data.callback)(message.timestamp, &message.bytes, data.user_data.as_mut().unwrap());
}
}
// Create port ... let source_port = matchself.client.as_mut().unwrap().register_midi_port(port_name, PortFlags::PortIsOutput) {
Ok(p) => p,
Err(()) => { return Err(ConnectError::other("could not register JACK port", self)); }
};
// ... and connect it to the input iflet Err(_) = self.client.as_mut().unwrap().connect(source_port.get_name(), &port.name) { return Err(ConnectError::new(ConnectErrorKind::InvalidPort, self));
}
// Create port let port = matchself.client.as_mut().unwrap().register_midi_port(port_name, PortFlags::PortIsOutput) {
Ok(p) => p,
Err(()) => { return Err(ConnectError::other("could not register JACK port", self)); }
};
// Write full message to buffer let written = self.handler_data.buff_message.write(message);
debug_assert!(written == nbytes, "not enough bytes written to ALSA ringbuffer `message`"); let nbytes_slice = unsafe { slice::from_raw_parts(&nbytes as *const usize as *const u8, mem::size_of_val(&nbytes)) }; let written = self.handler_data.buff_size.write(nbytes_slice);
debug_assert!(written == mem::size_of_val(&nbytes), "not enough bytes written to ALSA ringbuffer `size`");
Ok(())
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.