#pragma once

#if __cplusplus
extern "C" {
#endif

//! MIDI API specifier arguments.
//! To get information on which feature is supported by each back-end, check their backend file
//! in e.g. backends/winmm.hpp, etc.
typedef enum libremidi_api
{
  UNSPECIFIED = 0x0, /*!< Search for a working compiled API. */

  // MIDI 1.0 APIs
  COREMIDI = 0x1, /*!< macOS CoreMidi API. */
  ALSA_SEQ,       /*!< Linux ALSA Sequencer API. */
  ALSA_RAW,       /*!< Linux Raw ALSA API. */
  JACK_MIDI,      /*!< JACK Low-Latency MIDI Server API. */
  WINDOWS_MM,     /*!< Microsoft Multimedia MIDI API. */
  WINDOWS_UWP,    /*!< Microsoft WinRT MIDI API. */
  WEBMIDI,        /*!< Web MIDI API through Emscripten */
  PIPEWIRE,       /*!< PipeWire */
  KEYBOARD,       /*!< Computer keyboard input */
  NETWORK,        /*!< MIDI over IP */

  // MIDI 2.0 APIs
  ALSA_RAW_UMP = 0x1000, /*!< Raw ALSA API for MIDI 2.0 */
  ALSA_SEQ_UMP,          /*!< Linux ALSA Sequencer API for MIDI 2.0 */
  COREMIDI_UMP,          /*!< macOS CoreMidi API for MIDI 2.0. Requires macOS 11+ */
  WINDOWS_MIDI_SERVICES, /*!< Windows API for MIDI 2.0. Requires Windows 11 */
  KEYBOARD_UMP,          /*!< Computer keyboard input */
  NETWORK_UMP,           /*!< MIDI2 over IP */
  JACK_UMP,              /*!< MIDI2 over JACK, type "32 bit raw UMP". Requires PipeWire v1.4+. */
  PIPEWIRE_UMP,          /*!< MIDI2 over PipeWire. Requires v1.4+. */

  DUMMY = 0xFFFF /*!< A compilable but non-functional API. */
} libremidi_api;

#if __cplusplus
}
#endif
