connect method

bool connect()

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;
}