mirror of
https://github.com/tildearrow/furnace.git
synced 2024-12-18 06:20:17 +00:00
252 lines
9.2 KiB
C
252 lines
9.2 KiB
C
|
/************************************************************************/
|
||
|
/*! \defgroup C-interface
|
||
|
@{
|
||
|
|
||
|
\brief C interface to realtime MIDI input/output C++ classes.
|
||
|
|
||
|
RtMidi offers a C-style interface, principally for use in binding
|
||
|
RtMidi to other programming languages. All structs, enums, and
|
||
|
functions listed here have direct analogs (and simply call to)
|
||
|
items in the C++ RtMidi class and its supporting classes and
|
||
|
types
|
||
|
*/
|
||
|
/************************************************************************/
|
||
|
|
||
|
/*!
|
||
|
\file rtmidi_c.h
|
||
|
*/
|
||
|
|
||
|
#include <stdbool.h>
|
||
|
#include <stddef.h>
|
||
|
#ifndef RTMIDI_C_H
|
||
|
#define RTMIDI_C_H
|
||
|
|
||
|
#if defined(RTMIDI_EXPORT)
|
||
|
#if defined _WIN32 || defined __CYGWIN__
|
||
|
#define RTMIDIAPI __declspec(dllexport)
|
||
|
#else
|
||
|
#define RTMIDIAPI __attribute__((visibility("default")))
|
||
|
#endif
|
||
|
#else
|
||
|
#define RTMIDIAPI //__declspec(dllimport)
|
||
|
#endif
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
//! \brief Wraps an RtMidi object for C function return statuses.
|
||
|
struct RtMidiWrapper {
|
||
|
//! The wrapped RtMidi object.
|
||
|
void* ptr;
|
||
|
void* data;
|
||
|
|
||
|
//! True when the last function call was OK.
|
||
|
bool ok;
|
||
|
|
||
|
//! If an error occured (ok != true), set to an error message.
|
||
|
const char* msg;
|
||
|
};
|
||
|
|
||
|
//! \brief Typedef for a generic RtMidi pointer.
|
||
|
typedef struct RtMidiWrapper* RtMidiPtr;
|
||
|
|
||
|
//! \brief Typedef for a generic RtMidiIn pointer.
|
||
|
typedef struct RtMidiWrapper* RtMidiInPtr;
|
||
|
|
||
|
//! \brief Typedef for a generic RtMidiOut pointer.
|
||
|
typedef struct RtMidiWrapper* RtMidiOutPtr;
|
||
|
|
||
|
//! \brief MIDI API specifier arguments. See \ref RtMidi::Api.
|
||
|
enum RtMidiApi {
|
||
|
RTMIDI_API_UNSPECIFIED, /*!< Search for a working compiled API. */
|
||
|
RTMIDI_API_MACOSX_CORE, /*!< Macintosh OS-X CoreMIDI API. */
|
||
|
RTMIDI_API_LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */
|
||
|
RTMIDI_API_UNIX_JACK, /*!< The Jack Low-Latency MIDI Server API. */
|
||
|
RTMIDI_API_WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */
|
||
|
RTMIDI_API_RTMIDI_DUMMY, /*!< A compilable but non-functional API. */
|
||
|
RTMIDI_API_NUM /*!< Number of values in this enum. */
|
||
|
};
|
||
|
|
||
|
//! \brief Defined RtMidiError types. See \ref RtMidiError::Type.
|
||
|
enum RtMidiErrorType {
|
||
|
RTMIDI_ERROR_WARNING, /*!< A non-critical error. */
|
||
|
RTMIDI_ERROR_DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */
|
||
|
RTMIDI_ERROR_UNSPECIFIED, /*!< The default, unspecified error type. */
|
||
|
RTMIDI_ERROR_NO_DEVICES_FOUND, /*!< No devices found on system. */
|
||
|
RTMIDI_ERROR_INVALID_DEVICE, /*!< An invalid device ID was specified. */
|
||
|
RTMIDI_ERROR_MEMORY_ERROR, /*!< An error occured during memory allocation. */
|
||
|
RTMIDI_ERROR_INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
|
||
|
RTMIDI_ERROR_INVALID_USE, /*!< The function was called incorrectly. */
|
||
|
RTMIDI_ERROR_DRIVER_ERROR, /*!< A system driver error occured. */
|
||
|
RTMIDI_ERROR_SYSTEM_ERROR, /*!< A system error occured. */
|
||
|
RTMIDI_ERROR_THREAD_ERROR /*!< A thread error occured. */
|
||
|
};
|
||
|
|
||
|
/*! \brief The type of a RtMidi callback function.
|
||
|
*
|
||
|
* \param timeStamp The time at which the message has been received.
|
||
|
* \param message The midi message.
|
||
|
* \param userData Additional user data for the callback.
|
||
|
*
|
||
|
* See \ref RtMidiIn::RtMidiCallback.
|
||
|
*/
|
||
|
typedef void(* RtMidiCCallback) (double timeStamp, const unsigned char* message,
|
||
|
size_t messageSize, void *userData);
|
||
|
|
||
|
|
||
|
/* RtMidi API */
|
||
|
|
||
|
/*! \brief Determine the available compiled MIDI APIs.
|
||
|
*
|
||
|
* If the given `apis` parameter is null, returns the number of available APIs.
|
||
|
* Otherwise, fill the given apis array with the RtMidi::Api values.
|
||
|
*
|
||
|
* \param apis An array or a null value.
|
||
|
* \param apis_size Number of elements pointed to by apis
|
||
|
* \return number of items needed for apis array if apis==NULL, or
|
||
|
* number of items written to apis array otherwise. A negative
|
||
|
* return value indicates an error.
|
||
|
*
|
||
|
* See \ref RtMidi::getCompiledApi().
|
||
|
*/
|
||
|
RTMIDIAPI int rtmidi_get_compiled_api (enum RtMidiApi *apis, unsigned int apis_size);
|
||
|
|
||
|
//! \brief Return the name of a specified compiled MIDI API.
|
||
|
//! See \ref RtMidi::getApiName().
|
||
|
RTMIDIAPI const char *rtmidi_api_name(enum RtMidiApi api);
|
||
|
|
||
|
//! \brief Return the display name of a specified compiled MIDI API.
|
||
|
//! See \ref RtMidi::getApiDisplayName().
|
||
|
RTMIDIAPI const char *rtmidi_api_display_name(enum RtMidiApi api);
|
||
|
|
||
|
//! \brief Return the compiled MIDI API having the given name.
|
||
|
//! See \ref RtMidi::getCompiledApiByName().
|
||
|
RTMIDIAPI enum RtMidiApi rtmidi_compiled_api_by_name(const char *name);
|
||
|
|
||
|
//! \internal Report an error.
|
||
|
RTMIDIAPI void rtmidi_error (enum RtMidiErrorType type, const char* errorString);
|
||
|
|
||
|
/*! \brief Open a MIDI port.
|
||
|
*
|
||
|
* \param port Must be greater than 0
|
||
|
* \param portName Name for the application port.
|
||
|
*
|
||
|
* See RtMidi::openPort().
|
||
|
*/
|
||
|
RTMIDIAPI void rtmidi_open_port (RtMidiPtr device, unsigned int portNumber, const char *portName);
|
||
|
|
||
|
/*! \brief Creates a virtual MIDI port to which other software applications can
|
||
|
* connect.
|
||
|
*
|
||
|
* \param portName Name for the application port.
|
||
|
*
|
||
|
* See RtMidi::openVirtualPort().
|
||
|
*/
|
||
|
RTMIDIAPI void rtmidi_open_virtual_port (RtMidiPtr device, const char *portName);
|
||
|
|
||
|
/*! \brief Close a MIDI connection.
|
||
|
* See RtMidi::closePort().
|
||
|
*/
|
||
|
RTMIDIAPI void rtmidi_close_port (RtMidiPtr device);
|
||
|
|
||
|
/*! \brief Return the number of available MIDI ports.
|
||
|
* See RtMidi::getPortCount().
|
||
|
*/
|
||
|
RTMIDIAPI unsigned int rtmidi_get_port_count (RtMidiPtr device);
|
||
|
|
||
|
/*! \brief Access a string identifier for the specified MIDI input port number.
|
||
|
*
|
||
|
* To prevent memory leaks a char buffer must be passed to this function.
|
||
|
* NULL can be passed as bufOut parameter, and that will write the required buffer length in the bufLen.
|
||
|
*
|
||
|
* See RtMidi::getPortName().
|
||
|
*/
|
||
|
RTMIDIAPI int rtmidi_get_port_name (RtMidiPtr device, unsigned int portNumber, char * bufOut, int * bufLen);
|
||
|
|
||
|
/* RtMidiIn API */
|
||
|
|
||
|
//! \brief Create a default RtMidiInPtr value, with no initialization.
|
||
|
RTMIDIAPI RtMidiInPtr rtmidi_in_create_default (void);
|
||
|
|
||
|
/*! \brief Create a RtMidiInPtr value, with given api, clientName and queueSizeLimit.
|
||
|
*
|
||
|
* \param api An optional API id can be specified.
|
||
|
* \param clientName An optional client name can be specified. This
|
||
|
* will be used to group the ports that are created
|
||
|
* by the application.
|
||
|
* \param queueSizeLimit An optional size of the MIDI input queue can be
|
||
|
* specified.
|
||
|
*
|
||
|
* See RtMidiIn::RtMidiIn().
|
||
|
*/
|
||
|
RTMIDIAPI RtMidiInPtr rtmidi_in_create (enum RtMidiApi api, const char *clientName, unsigned int queueSizeLimit);
|
||
|
|
||
|
//! \brief Free the given RtMidiInPtr.
|
||
|
RTMIDIAPI void rtmidi_in_free (RtMidiInPtr device);
|
||
|
|
||
|
//! \brief Returns the MIDI API specifier for the given instance of RtMidiIn.
|
||
|
//! See \ref RtMidiIn::getCurrentApi().
|
||
|
RTMIDIAPI enum RtMidiApi rtmidi_in_get_current_api (RtMidiPtr device);
|
||
|
|
||
|
//! \brief Set a callback function to be invoked for incoming MIDI messages.
|
||
|
//! See \ref RtMidiIn::setCallback().
|
||
|
RTMIDIAPI void rtmidi_in_set_callback (RtMidiInPtr device, RtMidiCCallback callback, void *userData);
|
||
|
|
||
|
//! \brief Cancel use of the current callback function (if one exists).
|
||
|
//! See \ref RtMidiIn::cancelCallback().
|
||
|
RTMIDIAPI void rtmidi_in_cancel_callback (RtMidiInPtr device);
|
||
|
|
||
|
//! \brief Specify whether certain MIDI message types should be queued or ignored during input.
|
||
|
//! See \ref RtMidiIn::ignoreTypes().
|
||
|
RTMIDIAPI void rtmidi_in_ignore_types (RtMidiInPtr device, bool midiSysex, bool midiTime, bool midiSense);
|
||
|
|
||
|
/*! Fill the user-provided array with the data bytes for the next available
|
||
|
* MIDI message in the input queue and return the event delta-time in seconds.
|
||
|
*
|
||
|
* \param message Must point to a char* that is already allocated.
|
||
|
* SYSEX messages maximum size being 1024, a statically
|
||
|
* allocated array could
|
||
|
* be sufficient.
|
||
|
* \param size Is used to return the size of the message obtained.
|
||
|
* Must be set to the size of \ref message when calling.
|
||
|
*
|
||
|
* See RtMidiIn::getMessage().
|
||
|
*/
|
||
|
RTMIDIAPI double rtmidi_in_get_message (RtMidiInPtr device, unsigned char *message, size_t *size);
|
||
|
|
||
|
/* RtMidiOut API */
|
||
|
|
||
|
//! \brief Create a default RtMidiInPtr value, with no initialization.
|
||
|
RTMIDIAPI RtMidiOutPtr rtmidi_out_create_default (void);
|
||
|
|
||
|
/*! \brief Create a RtMidiOutPtr value, with given and clientName.
|
||
|
*
|
||
|
* \param api An optional API id can be specified.
|
||
|
* \param clientName An optional client name can be specified. This
|
||
|
* will be used to group the ports that are created
|
||
|
* by the application.
|
||
|
*
|
||
|
* See RtMidiOut::RtMidiOut().
|
||
|
*/
|
||
|
RTMIDIAPI RtMidiOutPtr rtmidi_out_create (enum RtMidiApi api, const char *clientName);
|
||
|
|
||
|
//! \brief Free the given RtMidiOutPtr.
|
||
|
RTMIDIAPI void rtmidi_out_free (RtMidiOutPtr device);
|
||
|
|
||
|
//! \brief Returns the MIDI API specifier for the given instance of RtMidiOut.
|
||
|
//! See \ref RtMidiOut::getCurrentApi().
|
||
|
RTMIDIAPI enum RtMidiApi rtmidi_out_get_current_api (RtMidiPtr device);
|
||
|
|
||
|
//! \brief Immediately send a single message out an open MIDI output port.
|
||
|
//! See \ref RtMidiOut::sendMessage().
|
||
|
RTMIDIAPI int rtmidi_out_send_message (RtMidiOutPtr device, const unsigned char *message, int length);
|
||
|
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
#endif
|
||
|
|
||
|
/*! }@ */
|