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
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/*! }@ */
							 |