disconnect method

bool disconnect()

Implementation

bool disconnect() {
  if (_disconnecting) {
    return true;
  }

  _disconnecting = true;
  int result;
  if (_midiInHandle != 0) {
    result = midiInStop(_hMidiIn);
    if (result != 0) {
      debugPrint("STOP ERROR($result): ${midiErrorMessage(result)}");
    }

    result = midiInReset(_hMidiIn);
    if (result != 0) {
      debugPrint("RESET ERROR($result): ${midiErrorMessage(result)}");
    }

    for (int i = 0; i < _numberOfBuffers; i++) {
      if (_midiInHeaders[i] != nullptr) {
        midiInUnprepareHeader(
          _hMidiIn,
          _midiInHeaders[i],
          sizeOf<MIDIHDR>(),
        );
        free(_midiInHeaders[i]);
        _midiInHeaders[i] = nullptr;
      }
      if (_midiInBuffers[i] != nullptr) {
        free(_midiInBuffers[i]);
        _midiInBuffers[i] = nullptr;
      }
    }

    result = midiInClose(_hMidiIn);
    if (result != 0) {
      debugPrint("CLOSE ERROR($result): ${midiErrorMessage(result)}");
    }
    _midiInHandle = 0;
    hMidiInDevicePtr.value = nullptr;
  }

  if (_midiOutHandle != 0) {
    result = midiOutReset(_hMidiOut);
    if (result != 0) {
      debugPrint("OUT RESET ERROR($result): ${midiErrorMessage(result)}");
    }

    result = midiOutClose(_hMidiOut);
    if (result != 0) {
      debugPrint("OUT CLOSE ERROR($result): ${midiErrorMessage(result)}");
    }
    _midiOutHandle = 0;
    hMidiOutDevicePtr.value = nullptr;
  }

  if (_midiOutBuffer != nullptr) {
    free(_midiOutBuffer);
    _midiOutBuffer = nullptr;
  }
  if (_midiOutHeader != nullptr) {
    free(_midiOutHeader);
    _midiOutHeader = nullptr;
  }

  connected = false;
  return true;
}