connect method
Connect to the device, ie. open input and output ports NOTE: Currently only the first input/output port is considered
Implementation
bool connect() {
_disconnecting = false;
// Open input
var mIn = _ins.firstOrNull;
if (mIn != null) {
var id = mIn;
int result = midiInOpen(
hMidiInDevicePtr,
id,
callbackAddress,
0,
CALLBACK_FUNCTION,
);
if (result != 0) {
debugPrint("OPEN ERROR($result): ${midiErrorMessage(result)}");
return false;
} else {
_midiInHandle = hMidiInDevicePtr.value.address;
// Setup buffer
for (int i = 0; i < _numberOfBuffers; i++) {
_midiInBuffers[i] = malloc<BYTE>(_bufferSize);
_midiInHeaders[i] = malloc<MIDIHDR>();
_midiInHeaders[i].ref.lpData = PSTR(_midiInBuffers[i].cast());
_midiInHeaders[i].ref.dwBufferLength = _bufferSize;
_midiInHeaders[i].ref.dwFlags = 0;
_midiInHeaders[i].ref.dwBytesRecorded = 0;
result = midiInPrepareHeader(
HMIDIIN(hMidiInDevicePtr.value),
_midiInHeaders[i],
sizeOf<MIDIHDR>(),
);
if (result != 0) {
debugPrint("HDR PREP ERROR: ${midiErrorMessage(result)}");
return false;
}
result = midiInAddBuffer(
HMIDIIN(hMidiInDevicePtr.value),
_midiInHeaders[i],
sizeOf<MIDIHDR>(),
);
if (result != 0) {
debugPrint("HDR ADD ERROR: ${midiErrorMessage(result)}");
return false;
}
}
result = midiInStart(HMIDIIN(hMidiInDevicePtr.value));
if (result != 0) {
debugPrint("START ERROR: ${midiErrorMessage(result)}");
return false;
}
}
}
// Open output
var mOut = _outs.firstOrNull;
if (mOut != null) {
var id = mOut;
int result = midiOutOpen(hMidiOutDevicePtr, id, 0, 0, CALLBACK_NULL);
if (result != 0) {
debugPrint("OUT OPEN ERROR: result");
return false;
}
_midiOutHandle = hMidiOutDevicePtr.value.address;
_midiOutBuffer = malloc<BYTE>(_bufferSize);
_midiOutHeader = malloc<MIDIHDR>();
}
connected = true;
_setupStreamController.add(MidiSetupChange.deviceConnected);
return true;
}