mirror of
https://github.com/thestk/stk
synced 2026-01-11 20:11:52 +00:00
Updated to new releases of RtAudio and RtMidi.
This commit is contained in:
@@ -5,12 +5,12 @@
|
||||
RtAudio provides a common API (Application Programming Interface)
|
||||
for realtime audio input/output across Linux (native ALSA, Jack,
|
||||
and OSS), Macintosh OS X (CoreAudio and Jack), and Windows
|
||||
(DirectSound and ASIO) operating systems.
|
||||
(DirectSound, ASIO and WASAPI) operating systems.
|
||||
|
||||
RtAudio WWW site: http://www.music.mcgill.ca/~gary/rtaudio/
|
||||
|
||||
RtAudio: realtime audio i/o C++ classes
|
||||
Copyright (c) 2001-2012 Gary P. Scavone
|
||||
Copyright (c) 2001-2014 Gary P. Scavone
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
@@ -42,14 +42,15 @@
|
||||
\file RtAudio.h
|
||||
*/
|
||||
|
||||
// RtAudio: Version 4.0.11
|
||||
|
||||
#ifndef __RTAUDIO_H
|
||||
#define __RTAUDIO_H
|
||||
|
||||
#define RTAUDIO_VERSION "4.1.0"
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include "RtError.h"
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
|
||||
/*! \typedef typedef unsigned long RtAudioFormat;
|
||||
\brief RtAudio data format type.
|
||||
@@ -59,12 +60,10 @@
|
||||
internal routines will automatically take care of any necessary
|
||||
byte-swapping between the host format and the soundcard. Thus,
|
||||
endian-ness is not a concern in the following format definitions.
|
||||
Note that 24-bit data is expected to be encapsulated in a 32-bit
|
||||
format.
|
||||
|
||||
- \e RTAUDIO_SINT8: 8-bit signed integer.
|
||||
- \e RTAUDIO_SINT16: 16-bit signed integer.
|
||||
- \e RTAUDIO_SINT24: Lower 3 bytes of 32-bit signed integer.
|
||||
- \e RTAUDIO_SINT24: 24-bit signed integer.
|
||||
- \e RTAUDIO_SINT32: 32-bit signed integer.
|
||||
- \e RTAUDIO_FLOAT32: Normalized between plus/minus 1.0.
|
||||
- \e RTAUDIO_FLOAT64: Normalized between plus/minus 1.0.
|
||||
@@ -72,7 +71,7 @@
|
||||
typedef unsigned long RtAudioFormat;
|
||||
static const RtAudioFormat RTAUDIO_SINT8 = 0x1; // 8-bit signed integer.
|
||||
static const RtAudioFormat RTAUDIO_SINT16 = 0x2; // 16-bit signed integer.
|
||||
static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // Lower 3 bytes of 32-bit signed integer.
|
||||
static const RtAudioFormat RTAUDIO_SINT24 = 0x4; // 24-bit signed integer.
|
||||
static const RtAudioFormat RTAUDIO_SINT32 = 0x8; // 32-bit signed integer.
|
||||
static const RtAudioFormat RTAUDIO_FLOAT32 = 0x10; // Normalized between plus/minus 1.0.
|
||||
static const RtAudioFormat RTAUDIO_FLOAT64 = 0x20; // Normalized between plus/minus 1.0.
|
||||
@@ -186,6 +185,63 @@ typedef int (*RtAudioCallback)( void *outputBuffer, void *inputBuffer,
|
||||
RtAudioStreamStatus status,
|
||||
void *userData );
|
||||
|
||||
/************************************************************************/
|
||||
/*! \class RtAudioError
|
||||
\brief Exception handling class for RtAudio.
|
||||
|
||||
The RtAudioError class is quite simple but it does allow errors to be
|
||||
"caught" by RtAudioError::Type. See the RtAudio documentation to know
|
||||
which methods can throw an RtAudioError.
|
||||
*/
|
||||
/************************************************************************/
|
||||
|
||||
class RtAudioError : public std::exception
|
||||
{
|
||||
public:
|
||||
//! Defined RtAudioError types.
|
||||
enum Type {
|
||||
WARNING, /*!< A non-critical error. */
|
||||
DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */
|
||||
UNSPECIFIED, /*!< The default, unspecified error type. */
|
||||
NO_DEVICES_FOUND, /*!< No devices found on system. */
|
||||
INVALID_DEVICE, /*!< An invalid device ID was specified. */
|
||||
MEMORY_ERROR, /*!< An error occured during memory allocation. */
|
||||
INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
|
||||
INVALID_USE, /*!< The function was called incorrectly. */
|
||||
DRIVER_ERROR, /*!< A system driver error occured. */
|
||||
SYSTEM_ERROR, /*!< A system error occured. */
|
||||
THREAD_ERROR /*!< A thread error occured. */
|
||||
};
|
||||
|
||||
//! The constructor.
|
||||
RtAudioError( const std::string& message, Type type = RtAudioError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
|
||||
|
||||
//! The destructor.
|
||||
virtual ~RtAudioError( void ) throw() {}
|
||||
|
||||
//! Prints thrown error message to stderr.
|
||||
virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
|
||||
|
||||
//! Returns the thrown error message type.
|
||||
virtual const Type& getType(void) const throw() { return type_; }
|
||||
|
||||
//! Returns the thrown error message string.
|
||||
virtual const std::string& getMessage(void) const throw() { return message_; }
|
||||
|
||||
//! Returns the thrown error message as a c-style string.
|
||||
virtual const char* what( void ) const throw() { return message_.c_str(); }
|
||||
|
||||
protected:
|
||||
std::string message_;
|
||||
Type type_;
|
||||
};
|
||||
|
||||
//! RtAudio error callback function prototype.
|
||||
/*!
|
||||
\param type Type of error.
|
||||
\param errorText Error description.
|
||||
*/
|
||||
typedef void (*RtAudioErrorCallback)( RtAudioError::Type type, const std::string &errorText );
|
||||
|
||||
// **************************************************************** //
|
||||
//
|
||||
@@ -214,6 +270,7 @@ class RtAudio
|
||||
LINUX_OSS, /*!< The Linux Open Sound System API. */
|
||||
UNIX_JACK, /*!< The Jack Low-Latency Audio Server API. */
|
||||
MACOSX_CORE, /*!< Macintosh OS-X Core Audio API. */
|
||||
WINDOWS_WASAPI, /*!< The Microsoft WASAPI API. */
|
||||
WINDOWS_ASIO, /*!< The Steinberg Audio Stream I/O API. */
|
||||
WINDOWS_DS, /*!< The Microsoft Direct Sound API. */
|
||||
RTAUDIO_DUMMY /*!< A compilable but non-functional API. */
|
||||
@@ -316,6 +373,9 @@ class RtAudio
|
||||
: flags(0), numberOfBuffers(0), priority(0) {}
|
||||
};
|
||||
|
||||
//! A static function to determine the current RtAudio version.
|
||||
static std::string getVersion( void ) throw();
|
||||
|
||||
//! A static function to determine the available compiled audio APIs.
|
||||
/*!
|
||||
The values returned in the std::vector can be compared against
|
||||
@@ -326,14 +386,14 @@ class RtAudio
|
||||
|
||||
//! The class constructor.
|
||||
/*!
|
||||
The constructor performs minor initialization tasks. No exceptions
|
||||
can be thrown.
|
||||
The constructor performs minor initialization tasks. An exception
|
||||
can be thrown if no API support is compiled.
|
||||
|
||||
If no API argument is specified and multiple API support has been
|
||||
compiled, the default order of use is JACK, ALSA, OSS (Linux
|
||||
systems) and ASIO, DS (Windows systems).
|
||||
*/
|
||||
RtAudio( RtAudio::Api api=UNSPECIFIED ) throw();
|
||||
RtAudio( RtAudio::Api api=UNSPECIFIED );
|
||||
|
||||
//! The destructor.
|
||||
/*!
|
||||
@@ -357,7 +417,7 @@ class RtAudio
|
||||
/*!
|
||||
|
||||
Any device integer between 0 and getDeviceCount() - 1 is valid.
|
||||
If an invalid argument is provided, an RtError (type = INVALID_USE)
|
||||
If an invalid argument is provided, an RtAudioError (type = INVALID_USE)
|
||||
will be thrown. If a device is busy or otherwise unavailable, the
|
||||
structure member "probed" will have a value of "false" and all
|
||||
other members are undefined. If the specified device is the
|
||||
@@ -388,9 +448,9 @@ class RtAudio
|
||||
|
||||
//! A public function for opening a stream with the specified parameters.
|
||||
/*!
|
||||
An RtError (type = SYSTEM_ERROR) is thrown if a stream cannot be
|
||||
An RtAudioError (type = SYSTEM_ERROR) is thrown if a stream cannot be
|
||||
opened with the specified parameters or an error occurs during
|
||||
processing. An RtError (type = INVALID_USE) is thrown if any
|
||||
processing. An RtAudioError (type = INVALID_USE) is thrown if any
|
||||
invalid device ID or channel number parameters are specified.
|
||||
|
||||
\param outputParameters Specifies output stream parameters to use
|
||||
@@ -423,12 +483,14 @@ class RtAudio
|
||||
chosen. If the RTAUDIO_MINIMIZE_LATENCY flag bit is set, the
|
||||
lowest allowable value is used. The actual value used is
|
||||
returned via the structure argument. The parameter is API dependent.
|
||||
\param errorCallback A client-defined function that will be invoked
|
||||
when an error has occured.
|
||||
*/
|
||||
void openStream( RtAudio::StreamParameters *outputParameters,
|
||||
RtAudio::StreamParameters *inputParameters,
|
||||
RtAudioFormat format, unsigned int sampleRate,
|
||||
unsigned int *bufferFrames, RtAudioCallback callback,
|
||||
void *userData = NULL, RtAudio::StreamOptions *options = NULL );
|
||||
void *userData = NULL, RtAudio::StreamOptions *options = NULL, RtAudioErrorCallback errorCallback = NULL );
|
||||
|
||||
//! A function that closes a stream and frees any associated stream memory.
|
||||
/*!
|
||||
@@ -439,8 +501,8 @@ class RtAudio
|
||||
|
||||
//! A function that starts a stream.
|
||||
/*!
|
||||
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtError (type = INVALID_USE) is thrown if a
|
||||
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtAudioError (type = INVALID_USE) is thrown if a
|
||||
stream is not open. A warning is issued if the stream is already
|
||||
running.
|
||||
*/
|
||||
@@ -448,8 +510,8 @@ class RtAudio
|
||||
|
||||
//! Stop a stream, allowing any samples remaining in the output queue to be played.
|
||||
/*!
|
||||
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtError (type = INVALID_USE) is thrown if a
|
||||
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtAudioError (type = INVALID_USE) is thrown if a
|
||||
stream is not open. A warning is issued if the stream is already
|
||||
stopped.
|
||||
*/
|
||||
@@ -457,8 +519,8 @@ class RtAudio
|
||||
|
||||
//! Stop a stream, discarding any samples remaining in the input/output queue.
|
||||
/*!
|
||||
An RtError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtError (type = INVALID_USE) is thrown if a
|
||||
An RtAudioError (type = SYSTEM_ERROR) is thrown if an error occurs
|
||||
during processing. An RtAudioError (type = INVALID_USE) is thrown if a
|
||||
stream is not open. A warning is issued if the stream is already
|
||||
stopped.
|
||||
*/
|
||||
@@ -472,7 +534,7 @@ class RtAudio
|
||||
|
||||
//! Returns the number of elapsed seconds since the stream was started.
|
||||
/*!
|
||||
If a stream is not open, an RtError (type = INVALID_USE) will be thrown.
|
||||
If a stream is not open, an RtAudioError (type = INVALID_USE) will be thrown.
|
||||
*/
|
||||
double getStreamTime( void );
|
||||
|
||||
@@ -482,7 +544,7 @@ class RtAudio
|
||||
caused by internal buffering by the audio system and/or hardware.
|
||||
For duplex streams, the returned value will represent the sum of
|
||||
the input and output latencies. If a stream is not open, an
|
||||
RtError (type = INVALID_USE) will be thrown. If the API does not
|
||||
RtAudioError (type = INVALID_USE) will be thrown. If the API does not
|
||||
report latency, the return value will be zero.
|
||||
*/
|
||||
long getStreamLatency( void );
|
||||
@@ -491,7 +553,7 @@ class RtAudio
|
||||
/*!
|
||||
On some systems, the sample rate used may be slightly different
|
||||
than that specified in the stream parameters. If a stream is not
|
||||
open, an RtError (type = INVALID_USE) will be thrown.
|
||||
open, an RtAudioError (type = INVALID_USE) will be thrown.
|
||||
*/
|
||||
unsigned int getStreamSampleRate( void );
|
||||
|
||||
@@ -505,11 +567,11 @@ class RtAudio
|
||||
};
|
||||
|
||||
// Operating system dependent thread functionality.
|
||||
#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__)
|
||||
#if defined(__WINDOWS_DS__) || defined(__WINDOWS_ASIO__) || defined(__WINDOWS_WASAPI__)
|
||||
#include <windows.h>
|
||||
#include <process.h>
|
||||
|
||||
typedef unsigned long ThreadHandle;
|
||||
typedef ULONG_PTR ThreadHandle;
|
||||
typedef CRITICAL_SECTION StreamMutex;
|
||||
|
||||
#elif defined(__LINUX_ALSA__) || defined(__LINUX_PULSE__) || defined(__UNIX_JACK__) || defined(__LINUX_OSS__) || defined(__MACOSX_CORE__)
|
||||
@@ -535,12 +597,15 @@ struct CallbackInfo {
|
||||
ThreadHandle thread;
|
||||
void *callback;
|
||||
void *userData;
|
||||
void *errorCallback;
|
||||
void *apiInfo; // void pointer for API specific callback information
|
||||
bool isRunning;
|
||||
bool doRealtime;
|
||||
int priority;
|
||||
|
||||
// Default constructor.
|
||||
CallbackInfo()
|
||||
:object(0), callback(0), userData(0), apiInfo(0), isRunning(false) {}
|
||||
:object(0), callback(0), userData(0), errorCallback(0), apiInfo(0), isRunning(false), doRealtime(false) {}
|
||||
};
|
||||
|
||||
// **************************************************************** //
|
||||
@@ -557,6 +622,36 @@ struct CallbackInfo {
|
||||
//
|
||||
// **************************************************************** //
|
||||
|
||||
#pragma pack(push, 1)
|
||||
class S24 {
|
||||
|
||||
protected:
|
||||
unsigned char c3[3];
|
||||
|
||||
public:
|
||||
S24() {}
|
||||
|
||||
S24& operator = ( const int& i ) {
|
||||
c3[0] = (i & 0x000000ff);
|
||||
c3[1] = (i & 0x0000ff00) >> 8;
|
||||
c3[2] = (i & 0x00ff0000) >> 16;
|
||||
return *this;
|
||||
}
|
||||
|
||||
S24( const S24& v ) { *this = v; }
|
||||
S24( const double& d ) { *this = (int) d; }
|
||||
S24( const float& f ) { *this = (int) f; }
|
||||
S24( const signed short& s ) { *this = (int) s; }
|
||||
S24( const char& c ) { *this = (int) c; }
|
||||
|
||||
int asInt() {
|
||||
int i = c3[0] | (c3[1] << 8) | (c3[2] << 16);
|
||||
if (i & 0x800000) i |= ~0xffffff;
|
||||
return i;
|
||||
}
|
||||
};
|
||||
#pragma pack(pop)
|
||||
|
||||
#if defined( HAVE_GETTIMEOFDAY )
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
@@ -578,7 +673,8 @@ public:
|
||||
RtAudio::StreamParameters *inputParameters,
|
||||
RtAudioFormat format, unsigned int sampleRate,
|
||||
unsigned int *bufferFrames, RtAudioCallback callback,
|
||||
void *userData, RtAudio::StreamOptions *options );
|
||||
void *userData, RtAudio::StreamOptions *options,
|
||||
RtAudioErrorCallback errorCallback );
|
||||
virtual void closeStream( void );
|
||||
virtual void startStream( void ) = 0;
|
||||
virtual void stopStream( void ) = 0;
|
||||
@@ -586,9 +682,9 @@ public:
|
||||
long getStreamLatency( void );
|
||||
unsigned int getStreamSampleRate( void );
|
||||
virtual double getStreamTime( void );
|
||||
bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; };
|
||||
bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; };
|
||||
void showWarnings( bool value ) { showWarnings_ = value; };
|
||||
bool isStreamOpen( void ) const { return stream_.state != STREAM_CLOSED; }
|
||||
bool isStreamRunning( void ) const { return stream_.state == STREAM_RUNNING; }
|
||||
void showWarnings( bool value ) { showWarnings_ = value; }
|
||||
|
||||
|
||||
protected:
|
||||
@@ -655,6 +751,7 @@ protected:
|
||||
:apiHandle(0), deviceBuffer(0) { device[0] = 11111; device[1] = 11111; }
|
||||
};
|
||||
|
||||
typedef S24 Int24;
|
||||
typedef signed short Int16;
|
||||
typedef signed int Int32;
|
||||
typedef float Float32;
|
||||
@@ -664,6 +761,7 @@ protected:
|
||||
std::string errorText_;
|
||||
bool showWarnings_;
|
||||
RtApiStream stream_;
|
||||
bool firstErrorOccurred_;
|
||||
|
||||
/*!
|
||||
Protected, api-specific method that attempts to open a device
|
||||
@@ -684,13 +782,13 @@ protected:
|
||||
void clearStreamInfo();
|
||||
|
||||
/*!
|
||||
Protected common method that throws an RtError (type =
|
||||
Protected common method that throws an RtAudioError (type =
|
||||
INVALID_USE) if a stream is not open.
|
||||
*/
|
||||
void verifyStream( void );
|
||||
|
||||
//! Protected common error method to allow global control over error handling.
|
||||
void error( RtError::Type type );
|
||||
void error( RtAudioError::Type type );
|
||||
|
||||
/*!
|
||||
Protected method used to perform format, channel number, and/or interleaving
|
||||
@@ -726,7 +824,7 @@ inline void RtAudio :: abortStream( void ) { return rtapi_->abortStream(); }
|
||||
inline bool RtAudio :: isStreamOpen( void ) const throw() { return rtapi_->isStreamOpen(); }
|
||||
inline bool RtAudio :: isStreamRunning( void ) const throw() { return rtapi_->isStreamRunning(); }
|
||||
inline long RtAudio :: getStreamLatency( void ) { return rtapi_->getStreamLatency(); }
|
||||
inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); };
|
||||
inline unsigned int RtAudio :: getStreamSampleRate( void ) { return rtapi_->getStreamSampleRate(); }
|
||||
inline double RtAudio :: getStreamTime( void ) { return rtapi_->getStreamTime(); }
|
||||
inline void RtAudio :: showWarnings( bool value ) throw() { rtapi_->showWarnings( value ); }
|
||||
|
||||
@@ -742,7 +840,7 @@ public:
|
||||
|
||||
RtApiCore();
|
||||
~RtApiCore();
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; };
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::MACOSX_CORE; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
unsigned int getDefaultOutputDevice( void );
|
||||
@@ -780,7 +878,7 @@ public:
|
||||
|
||||
RtApiJack();
|
||||
~RtApiJack();
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; };
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::UNIX_JACK; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
void closeStream( void );
|
||||
@@ -813,7 +911,7 @@ public:
|
||||
|
||||
RtApiAsio();
|
||||
~RtApiAsio();
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; };
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_ASIO; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
void closeStream( void );
|
||||
@@ -849,7 +947,7 @@ public:
|
||||
|
||||
RtApiDs();
|
||||
~RtApiDs();
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; };
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_DS; }
|
||||
unsigned int getDeviceCount( void );
|
||||
unsigned int getDefaultOutputDevice( void );
|
||||
unsigned int getDefaultInputDevice( void );
|
||||
@@ -871,6 +969,7 @@ public:
|
||||
bool coInitialized_;
|
||||
bool buffersRolling;
|
||||
long duplexPrerollBytes;
|
||||
std::vector<struct DsDevice> dsDevices;
|
||||
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
|
||||
unsigned int firstChannel, unsigned int sampleRate,
|
||||
RtAudioFormat format, unsigned int *bufferSize,
|
||||
@@ -879,6 +978,43 @@ public:
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__WINDOWS_WASAPI__)
|
||||
|
||||
struct IMMDeviceEnumerator;
|
||||
|
||||
class RtApiWasapi : public RtApi
|
||||
{
|
||||
public:
|
||||
RtApiWasapi();
|
||||
~RtApiWasapi();
|
||||
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::WINDOWS_WASAPI; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
unsigned int getDefaultOutputDevice( void );
|
||||
unsigned int getDefaultInputDevice( void );
|
||||
void closeStream( void );
|
||||
void startStream( void );
|
||||
void stopStream( void );
|
||||
void abortStream( void );
|
||||
|
||||
private:
|
||||
bool coInitialized_;
|
||||
IMMDeviceEnumerator* deviceEnumerator_;
|
||||
|
||||
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
|
||||
unsigned int firstChannel, unsigned int sampleRate,
|
||||
RtAudioFormat format, unsigned int* bufferSize,
|
||||
RtAudio::StreamOptions* options );
|
||||
|
||||
static DWORD WINAPI runWasapiThread( void* wasapiPtr );
|
||||
static DWORD WINAPI stopWasapiThread( void* wasapiPtr );
|
||||
static DWORD WINAPI abortWasapiThread( void* wasapiPtr );
|
||||
void wasapiThread();
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__LINUX_ALSA__)
|
||||
|
||||
class RtApiAlsa: public RtApi
|
||||
@@ -887,7 +1023,7 @@ public:
|
||||
|
||||
RtApiAlsa();
|
||||
~RtApiAlsa();
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; };
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_ALSA; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
void closeStream( void );
|
||||
@@ -919,7 +1055,7 @@ class RtApiPulse: public RtApi
|
||||
{
|
||||
public:
|
||||
~RtApiPulse();
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; };
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_PULSE; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
void closeStream( void );
|
||||
@@ -953,7 +1089,7 @@ public:
|
||||
|
||||
RtApiOss();
|
||||
~RtApiOss();
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; };
|
||||
RtAudio::Api getCurrentApi() { return RtAudio::LINUX_OSS; }
|
||||
unsigned int getDeviceCount( void );
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device );
|
||||
void closeStream( void );
|
||||
@@ -983,21 +1119,21 @@ class RtApiDummy: public RtApi
|
||||
{
|
||||
public:
|
||||
|
||||
RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtError::WARNING ); };
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; };
|
||||
unsigned int getDeviceCount( void ) { return 0; };
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int device ) { RtAudio::DeviceInfo info; return info; };
|
||||
void closeStream( void ) {};
|
||||
void startStream( void ) {};
|
||||
void stopStream( void ) {};
|
||||
void abortStream( void ) {};
|
||||
RtApiDummy() { errorText_ = "RtApiDummy: This class provides no functionality."; error( RtAudioError::WARNING ); }
|
||||
RtAudio::Api getCurrentApi( void ) { return RtAudio::RTAUDIO_DUMMY; }
|
||||
unsigned int getDeviceCount( void ) { return 0; }
|
||||
RtAudio::DeviceInfo getDeviceInfo( unsigned int /*device*/ ) { RtAudio::DeviceInfo info; return info; }
|
||||
void closeStream( void ) {}
|
||||
void startStream( void ) {}
|
||||
void stopStream( void ) {}
|
||||
void abortStream( void ) {}
|
||||
|
||||
private:
|
||||
|
||||
bool probeDeviceOpen( unsigned int device, StreamMode mode, unsigned int channels,
|
||||
unsigned int firstChannel, unsigned int sampleRate,
|
||||
RtAudioFormat format, unsigned int *bufferSize,
|
||||
RtAudio::StreamOptions *options ) { return false; };
|
||||
bool probeDeviceOpen( unsigned int /*device*/, StreamMode /*mode*/, unsigned int /*channels*/,
|
||||
unsigned int /*firstChannel*/, unsigned int /*sampleRate*/,
|
||||
RtAudioFormat /*format*/, unsigned int * /*bufferSize*/,
|
||||
RtAudio::StreamOptions * /*options*/ ) { return false; }
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
/************************************************************************/
|
||||
/*! \class RtError
|
||||
\brief Exception handling class for RtAudio & RtMidi.
|
||||
|
||||
The RtError class is quite simple but it does allow errors to be
|
||||
"caught" by RtError::Type. See the RtAudio and RtMidi
|
||||
documentation to know which methods can throw an RtError.
|
||||
|
||||
*/
|
||||
/************************************************************************/
|
||||
|
||||
#ifndef RTERROR_H
|
||||
#define RTERROR_H
|
||||
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
|
||||
class RtError : public std::exception
|
||||
{
|
||||
public:
|
||||
//! Defined RtError types.
|
||||
enum Type {
|
||||
WARNING, /*!< A non-critical error. */
|
||||
DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */
|
||||
UNSPECIFIED, /*!< The default, unspecified error type. */
|
||||
NO_DEVICES_FOUND, /*!< No devices found on system. */
|
||||
INVALID_DEVICE, /*!< An invalid device ID was specified. */
|
||||
MEMORY_ERROR, /*!< An error occured during memory allocation. */
|
||||
INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
|
||||
INVALID_USE, /*!< The function was called incorrectly. */
|
||||
DRIVER_ERROR, /*!< A system driver error occured. */
|
||||
SYSTEM_ERROR, /*!< A system error occured. */
|
||||
THREAD_ERROR /*!< A thread error occured. */
|
||||
};
|
||||
|
||||
//! The constructor.
|
||||
RtError( const std::string& message, Type type = RtError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
|
||||
|
||||
//! The destructor.
|
||||
virtual ~RtError( void ) throw() {}
|
||||
|
||||
//! Prints thrown error message to stderr.
|
||||
virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
|
||||
|
||||
//! Returns the thrown error message type.
|
||||
virtual const Type& getType(void) const throw() { return type_; }
|
||||
|
||||
//! Returns the thrown error message string.
|
||||
virtual const std::string& getMessage(void) const throw() { return message_; }
|
||||
|
||||
//! Returns the thrown error message as a c-style string.
|
||||
virtual const char* what( void ) const throw() { return message_.c_str(); }
|
||||
|
||||
protected:
|
||||
std::string message_;
|
||||
Type type_;
|
||||
};
|
||||
|
||||
#endif
|
||||
348
include/RtMidi.h
348
include/RtMidi.h
@@ -8,7 +8,7 @@
|
||||
RtMidi WWW site: http://music.mcgill.ca/~gary/rtmidi/
|
||||
|
||||
RtMidi: realtime MIDI i/o C++ classes
|
||||
Copyright (c) 2003-2012 Gary P. Scavone
|
||||
Copyright (c) 2003-2014 Gary P. Scavone
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation files
|
||||
@@ -40,15 +40,79 @@
|
||||
\file RtMidi.h
|
||||
*/
|
||||
|
||||
// RtMidi: Version 2.0.1
|
||||
|
||||
#ifndef RTMIDI_H
|
||||
#define RTMIDI_H
|
||||
|
||||
#include "RtError.h"
|
||||
#define RTMIDI_VERSION "2.1.0"
|
||||
|
||||
#include <exception>
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
/************************************************************************/
|
||||
/*! \class RtMidiError
|
||||
\brief Exception handling class for RtMidi.
|
||||
|
||||
The RtMidiError class is quite simple but it does allow errors to be
|
||||
"caught" by RtMidiError::Type. See the RtMidi documentation to know
|
||||
which methods can throw an RtMidiError.
|
||||
*/
|
||||
/************************************************************************/
|
||||
|
||||
class RtMidiError : public std::exception
|
||||
{
|
||||
public:
|
||||
//! Defined RtMidiError types.
|
||||
enum Type {
|
||||
WARNING, /*!< A non-critical error. */
|
||||
DEBUG_WARNING, /*!< A non-critical error which might be useful for debugging. */
|
||||
UNSPECIFIED, /*!< The default, unspecified error type. */
|
||||
NO_DEVICES_FOUND, /*!< No devices found on system. */
|
||||
INVALID_DEVICE, /*!< An invalid device ID was specified. */
|
||||
MEMORY_ERROR, /*!< An error occured during memory allocation. */
|
||||
INVALID_PARAMETER, /*!< An invalid parameter was specified to a function. */
|
||||
INVALID_USE, /*!< The function was called incorrectly. */
|
||||
DRIVER_ERROR, /*!< A system driver error occured. */
|
||||
SYSTEM_ERROR, /*!< A system error occured. */
|
||||
THREAD_ERROR /*!< A thread error occured. */
|
||||
};
|
||||
|
||||
//! The constructor.
|
||||
RtMidiError( const std::string& message, Type type = RtMidiError::UNSPECIFIED ) throw() : message_(message), type_(type) {}
|
||||
|
||||
//! The destructor.
|
||||
virtual ~RtMidiError( void ) throw() {}
|
||||
|
||||
//! Prints thrown error message to stderr.
|
||||
virtual void printMessage( void ) const throw() { std::cerr << '\n' << message_ << "\n\n"; }
|
||||
|
||||
//! Returns the thrown error message type.
|
||||
virtual const Type& getType(void) const throw() { return type_; }
|
||||
|
||||
//! Returns the thrown error message string.
|
||||
virtual const std::string& getMessage(void) const throw() { return message_; }
|
||||
|
||||
//! Returns the thrown error message as a c-style string.
|
||||
virtual const char* what( void ) const throw() { return message_.c_str(); }
|
||||
|
||||
protected:
|
||||
std::string message_;
|
||||
Type type_;
|
||||
};
|
||||
|
||||
//! RtMidi error callback function prototype.
|
||||
/*!
|
||||
\param type Type of error.
|
||||
\param errorText Error description.
|
||||
|
||||
Note that class behaviour is undefined after a critical error (not
|
||||
a warning) is reported.
|
||||
*/
|
||||
typedef void (*RtMidiErrorCallback)( RtMidiError::Type type, const std::string &errorText );
|
||||
|
||||
class MidiApi;
|
||||
|
||||
class RtMidi
|
||||
{
|
||||
public:
|
||||
@@ -58,12 +122,14 @@ class RtMidi
|
||||
UNSPECIFIED, /*!< Search for a working compiled API. */
|
||||
MACOSX_CORE, /*!< Macintosh OS-X Core Midi API. */
|
||||
LINUX_ALSA, /*!< The Advanced Linux Sound Architecture API. */
|
||||
UNIX_JACK, /*!< The Jack Low-Latency MIDI Server API. */
|
||||
UNIX_JACK, /*!< The JACK Low-Latency MIDI Server API. */
|
||||
WINDOWS_MM, /*!< The Microsoft Multimedia MIDI API. */
|
||||
WINDOWS_KS, /*!< The Microsoft Kernel Streaming MIDI API. */
|
||||
RTMIDI_DUMMY /*!< A compilable but non-functional API. */
|
||||
};
|
||||
|
||||
//! A static function to determine the current RtMidi version.
|
||||
static std::string getVersion( void ) throw();
|
||||
|
||||
//! A static function to determine the available compiled MIDI APIs.
|
||||
/*!
|
||||
The values returned in the std::vector can be compared against
|
||||
@@ -87,13 +153,22 @@ class RtMidi
|
||||
//! Pure virtual closePort() function.
|
||||
virtual void closePort( void ) = 0;
|
||||
|
||||
//! A basic error reporting function for RtMidi classes.
|
||||
static void error( RtError::Type type, std::string errorString );
|
||||
//! Returns true if a port is open and false if not.
|
||||
virtual bool isPortOpen( void ) const = 0;
|
||||
|
||||
//! Set an error callback function to be invoked when an error has occured.
|
||||
/*!
|
||||
The callback function will be called whenever an error has occured. It is best
|
||||
to set the error callback function before opening a port.
|
||||
*/
|
||||
virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL ) = 0;
|
||||
|
||||
protected:
|
||||
|
||||
RtMidi() {};
|
||||
virtual ~RtMidi() {};
|
||||
RtMidi();
|
||||
virtual ~RtMidi();
|
||||
|
||||
MidiApi *rtapi_;
|
||||
};
|
||||
|
||||
/**********************************************************************/
|
||||
@@ -106,11 +181,11 @@ class RtMidi
|
||||
retrieval using the getMessage() function or immediately passed to
|
||||
a user-specified callback function. Create multiple instances of
|
||||
this class to connect to more than one MIDI device at the same
|
||||
time. With the OS-X and Linux ALSA MIDI APIs, it is also possible
|
||||
to open a virtual input port to which other MIDI software clients
|
||||
can connect.
|
||||
time. With the OS-X, Linux ALSA, and JACK MIDI APIs, it is also
|
||||
possible to open a virtual input port to which other MIDI software
|
||||
clients can connect.
|
||||
|
||||
by Gary P. Scavone, 2003-2012.
|
||||
by Gary P. Scavone, 2003-2014.
|
||||
*/
|
||||
/**********************************************************************/
|
||||
|
||||
@@ -128,9 +203,6 @@ class RtMidi
|
||||
//
|
||||
// **************************************************************** //
|
||||
|
||||
class MidiInApi;
|
||||
class MidiOutApi;
|
||||
|
||||
class RtMidiIn : public RtMidi
|
||||
{
|
||||
public:
|
||||
@@ -147,8 +219,14 @@ class RtMidiIn : public RtMidi
|
||||
incoming messages will be ignored.
|
||||
|
||||
If no API argument is specified and multiple API support has been
|
||||
compiled, the default order of use is JACK, ALSA (Linux) and CORE,
|
||||
Jack (OS-X).
|
||||
compiled, the default order of use is ALSA, JACK (Linux) and CORE,
|
||||
JACK (OS-X).
|
||||
|
||||
\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.
|
||||
*/
|
||||
RtMidiIn( RtMidi::Api api=UNSPECIFIED,
|
||||
const std::string clientName = std::string( "RtMidi Input Client"),
|
||||
@@ -160,19 +238,23 @@ class RtMidiIn : public RtMidi
|
||||
//! Returns the MIDI API specifier for the current instance of RtMidiIn.
|
||||
RtMidi::Api getCurrentApi( void ) throw();
|
||||
|
||||
//! Open a MIDI input connection.
|
||||
//! Open a MIDI input connection given by enumeration number.
|
||||
/*!
|
||||
An optional port number greater than 0 can be specified.
|
||||
Otherwise, the default or first port found is opened.
|
||||
\param portNumber An optional port number greater than 0 can be specified.
|
||||
Otherwise, the default or first port found is opened.
|
||||
\param portName An optional name for the application port that is used to connect to portId can be specified.
|
||||
*/
|
||||
void openPort( unsigned int portNumber = 0, const std::string portName = std::string( "RtMidi Input" ) );
|
||||
|
||||
//! Create a virtual input port, with optional name, to allow software connections (OS X and ALSA only).
|
||||
//! Create a virtual input port, with optional name, to allow software connections (OS X, JACK and ALSA only).
|
||||
/*!
|
||||
This function creates a virtual MIDI input port to which other
|
||||
software applications can connect. This type of functionality
|
||||
is currently only supported by the Macintosh OS-X and Linux ALSA
|
||||
APIs (the function does nothing for the other APIs).
|
||||
is currently only supported by the Macintosh OS-X, any JACK,
|
||||
and Linux ALSA APIs (the function returns an error for the other APIs).
|
||||
|
||||
\param portName An optional name for the application port that is
|
||||
used to connect to portId can be specified.
|
||||
*/
|
||||
void openVirtualPort( const std::string portName = std::string( "RtMidi Input" ) );
|
||||
|
||||
@@ -182,6 +264,10 @@ class RtMidiIn : public RtMidi
|
||||
message is received. While not absolutely necessary, it is best
|
||||
to set the callback function before opening a MIDI port to avoid
|
||||
leaving some messages in the queue.
|
||||
|
||||
\param callback A callback function must be given.
|
||||
\param userData Optionally, a pointer to additional data can be
|
||||
passed to the callback function whenever it is called.
|
||||
*/
|
||||
void setCallback( RtMidiCallback callback, void *userData = 0 );
|
||||
|
||||
@@ -195,18 +281,25 @@ class RtMidiIn : public RtMidi
|
||||
//! Close an open MIDI connection (if one exists).
|
||||
void closePort( void );
|
||||
|
||||
//! Returns true if a port is open and false if not.
|
||||
virtual bool isPortOpen() const;
|
||||
|
||||
//! Return the number of available MIDI input ports.
|
||||
/*!
|
||||
\return This function returns the number of MIDI ports of the selected API.
|
||||
*/
|
||||
unsigned int getPortCount();
|
||||
|
||||
//! Return a string identifier for the specified MIDI input port number.
|
||||
/*!
|
||||
An empty string is returned if an invalid port specifier is provided.
|
||||
\return The name of the port with the given Id is returned.
|
||||
\retval An empty string is returned if an invalid port specifier is provided.
|
||||
*/
|
||||
std::string getPortName( unsigned int portNumber = 0 );
|
||||
|
||||
//! Specify whether certain MIDI message types should be queued or ignored during input.
|
||||
/*!
|
||||
o By default, MIDI timing and active sensing messages are ignored
|
||||
By default, MIDI timing and active sensing messages are ignored
|
||||
during message input because of their relative high data rates.
|
||||
MIDI sysex messages are ignored by default as well. Variable
|
||||
values of "true" imply that the respective message type will be
|
||||
@@ -224,9 +317,15 @@ class RtMidiIn : public RtMidi
|
||||
*/
|
||||
double getMessage( std::vector<unsigned char> *message );
|
||||
|
||||
//! Set an error callback function to be invoked when an error has occured.
|
||||
/*!
|
||||
The callback function will be called whenever an error has occured. It is best
|
||||
to set the error callback function before opening a port.
|
||||
*/
|
||||
virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
|
||||
|
||||
protected:
|
||||
void openMidiApi( RtMidi::Api api, const std::string clientName, unsigned int queueSizeLimit );
|
||||
MidiInApi *rtapi_;
|
||||
|
||||
};
|
||||
|
||||
@@ -239,10 +338,10 @@ class RtMidiIn : public RtMidi
|
||||
connect to one such port, and to send MIDI bytes immediately over
|
||||
the connection. Create multiple instances of this class to
|
||||
connect to more than one MIDI device at the same time. With the
|
||||
OS-X and Linux ALSA MIDI APIs, it is also possible to open a
|
||||
OS-X, Linux ALSA and JACK MIDI APIs, it is also possible to open a
|
||||
virtual port to which other MIDI software clients can connect.
|
||||
|
||||
by Gary P. Scavone, 2003-2012.
|
||||
by Gary P. Scavone, 2003-2014.
|
||||
*/
|
||||
/**********************************************************************/
|
||||
|
||||
@@ -255,8 +354,8 @@ class RtMidiOut : public RtMidi
|
||||
An exception will be thrown if a MIDI system initialization error occurs.
|
||||
|
||||
If no API argument is specified and multiple API support has been
|
||||
compiled, the default order of use is JACK, ALSA (Linux) and CORE,
|
||||
Jack (OS-X).
|
||||
compiled, the default order of use is ALSA, JACK (Linux) and CORE,
|
||||
JACK (OS-X).
|
||||
*/
|
||||
RtMidiOut( RtMidi::Api api=UNSPECIFIED,
|
||||
const std::string clientName = std::string( "RtMidi Output Client") );
|
||||
@@ -279,14 +378,17 @@ class RtMidiOut : public RtMidi
|
||||
//! Close an open MIDI connection (if one exists).
|
||||
void closePort( void );
|
||||
|
||||
//! Create a virtual output port, with optional name, to allow software connections (OS X and ALSA only).
|
||||
//! Returns true if a port is open and false if not.
|
||||
virtual bool isPortOpen() const;
|
||||
|
||||
//! Create a virtual output port, with optional name, to allow software connections (OS X, JACK and ALSA only).
|
||||
/*!
|
||||
This function creates a virtual MIDI output port to which other
|
||||
software applications can connect. This type of functionality
|
||||
is currently only supported by the Macintosh OS-X and Linux ALSA
|
||||
APIs (the function does nothing with the other APIs). An
|
||||
exception is thrown if an error occurs while attempting to create
|
||||
the virtual port.
|
||||
is currently only supported by the Macintosh OS-X, Linux ALSA
|
||||
and JACK APIs (the function does nothing with the other APIs).
|
||||
An exception is thrown if an error occurs while attempting to
|
||||
create the virtual port.
|
||||
*/
|
||||
void openVirtualPort( const std::string portName = std::string( "RtMidi Output" ) );
|
||||
|
||||
@@ -306,9 +408,15 @@ class RtMidiOut : public RtMidi
|
||||
*/
|
||||
void sendMessage( std::vector<unsigned char> *message );
|
||||
|
||||
//! Set an error callback function to be invoked when an error has occured.
|
||||
/*!
|
||||
The callback function will be called whenever an error has occured. It is best
|
||||
to set the error callback function before opening a port.
|
||||
*/
|
||||
virtual void setErrorCallback( RtMidiErrorCallback errorCallback = NULL );
|
||||
|
||||
protected:
|
||||
void openMidiApi( RtMidi::Api api, const std::string clientName );
|
||||
MidiOutApi *rtapi_;
|
||||
};
|
||||
|
||||
|
||||
@@ -325,20 +433,43 @@ class RtMidiOut : public RtMidi
|
||||
//
|
||||
// **************************************************************** //
|
||||
|
||||
class MidiInApi
|
||||
class MidiApi
|
||||
{
|
||||
public:
|
||||
|
||||
MidiApi();
|
||||
virtual ~MidiApi();
|
||||
virtual RtMidi::Api getCurrentApi( void ) = 0;
|
||||
virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
|
||||
virtual void openVirtualPort( const std::string portName ) = 0;
|
||||
virtual void closePort( void ) = 0;
|
||||
|
||||
virtual unsigned int getPortCount( void ) = 0;
|
||||
virtual std::string getPortName( unsigned int portNumber ) = 0;
|
||||
|
||||
inline bool isPortOpen() const { return connected_; }
|
||||
void setErrorCallback( RtMidiErrorCallback errorCallback );
|
||||
|
||||
//! A basic error reporting function for RtMidi classes.
|
||||
void error( RtMidiError::Type type, std::string errorString );
|
||||
|
||||
protected:
|
||||
virtual void initialize( const std::string& clientName ) = 0;
|
||||
|
||||
void *apiData_;
|
||||
bool connected_;
|
||||
std::string errorString_;
|
||||
RtMidiErrorCallback errorCallback_;
|
||||
};
|
||||
|
||||
class MidiInApi : public MidiApi
|
||||
{
|
||||
public:
|
||||
|
||||
MidiInApi( unsigned int queueSizeLimit );
|
||||
virtual ~MidiInApi( void );
|
||||
virtual RtMidi::Api getCurrentApi( void ) = 0;
|
||||
virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
|
||||
virtual void openVirtualPort( const std::string portName ) = 0;
|
||||
virtual void closePort( void ) = 0;
|
||||
void setCallback( RtMidiIn::RtMidiCallback callback, void *userData );
|
||||
void cancelCallback( void );
|
||||
virtual unsigned int getPortCount( void ) = 0;
|
||||
virtual std::string getPortName( unsigned int portNumber ) = 0;
|
||||
virtual void ignoreTypes( bool midiSysex, bool midiTime, bool midiSense );
|
||||
double getMessage( std::vector<unsigned char> *message );
|
||||
|
||||
@@ -375,7 +506,7 @@ class MidiInApi
|
||||
bool firstMessage;
|
||||
void *apiData;
|
||||
bool usingCallback;
|
||||
void *userCallback;
|
||||
RtMidiIn::RtMidiCallback userCallback;
|
||||
void *userData;
|
||||
bool continueSysex;
|
||||
|
||||
@@ -387,34 +518,16 @@ class MidiInApi
|
||||
};
|
||||
|
||||
protected:
|
||||
virtual void initialize( const std::string& clientName ) = 0;
|
||||
RtMidiInData inputData_;
|
||||
|
||||
void *apiData_;
|
||||
bool connected_;
|
||||
std::string errorString_;
|
||||
};
|
||||
|
||||
class MidiOutApi
|
||||
class MidiOutApi : public MidiApi
|
||||
{
|
||||
public:
|
||||
|
||||
MidiOutApi( void );
|
||||
virtual ~MidiOutApi( void );
|
||||
virtual RtMidi::Api getCurrentApi( void ) = 0;
|
||||
virtual void openPort( unsigned int portNumber, const std::string portName ) = 0;
|
||||
virtual void openVirtualPort( const std::string portName ) = 0;
|
||||
virtual void closePort( void ) = 0;
|
||||
virtual unsigned int getPortCount( void ) = 0;
|
||||
virtual std::string getPortName( unsigned int portNumber ) = 0;
|
||||
virtual void sendMessage( std::vector<unsigned char> *message ) = 0;
|
||||
|
||||
protected:
|
||||
virtual void initialize( const std::string& clientName ) = 0;
|
||||
|
||||
void *apiData_;
|
||||
bool connected_;
|
||||
std::string errorString_;
|
||||
};
|
||||
|
||||
// **************************************************************** //
|
||||
@@ -424,23 +537,27 @@ class MidiOutApi
|
||||
// **************************************************************** //
|
||||
|
||||
inline RtMidi::Api RtMidiIn :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
|
||||
inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { return rtapi_->openPort( portNumber, portName ); }
|
||||
inline void RtMidiIn :: openVirtualPort( const std::string portName ) { return rtapi_->openVirtualPort( portName ); }
|
||||
inline void RtMidiIn :: closePort( void ) { return rtapi_->closePort(); }
|
||||
inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { return rtapi_->setCallback( callback, userData ); }
|
||||
inline void RtMidiIn :: cancelCallback( void ) { return rtapi_->cancelCallback(); }
|
||||
inline void RtMidiIn :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
|
||||
inline void RtMidiIn :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
|
||||
inline void RtMidiIn :: closePort( void ) { rtapi_->closePort(); }
|
||||
inline bool RtMidiIn :: isPortOpen() const { return rtapi_->isPortOpen(); }
|
||||
inline void RtMidiIn :: setCallback( RtMidiCallback callback, void *userData ) { ((MidiInApi *)rtapi_)->setCallback( callback, userData ); }
|
||||
inline void RtMidiIn :: cancelCallback( void ) { ((MidiInApi *)rtapi_)->cancelCallback(); }
|
||||
inline unsigned int RtMidiIn :: getPortCount( void ) { return rtapi_->getPortCount(); }
|
||||
inline std::string RtMidiIn :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
|
||||
inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { return rtapi_->ignoreTypes( midiSysex, midiTime, midiSense ); }
|
||||
inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) { return rtapi_->getMessage( message ); }
|
||||
inline void RtMidiIn :: ignoreTypes( bool midiSysex, bool midiTime, bool midiSense ) { ((MidiInApi *)rtapi_)->ignoreTypes( midiSysex, midiTime, midiSense ); }
|
||||
inline double RtMidiIn :: getMessage( std::vector<unsigned char> *message ) { return ((MidiInApi *)rtapi_)->getMessage( message ); }
|
||||
inline void RtMidiIn :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
|
||||
|
||||
inline RtMidi::Api RtMidiOut :: getCurrentApi( void ) throw() { return rtapi_->getCurrentApi(); }
|
||||
inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { return rtapi_->openPort( portNumber, portName ); }
|
||||
inline void RtMidiOut :: openVirtualPort( const std::string portName ) { return rtapi_->openVirtualPort( portName ); }
|
||||
inline void RtMidiOut :: closePort( void ) { return rtapi_->closePort(); }
|
||||
inline void RtMidiOut :: openPort( unsigned int portNumber, const std::string portName ) { rtapi_->openPort( portNumber, portName ); }
|
||||
inline void RtMidiOut :: openVirtualPort( const std::string portName ) { rtapi_->openVirtualPort( portName ); }
|
||||
inline void RtMidiOut :: closePort( void ) { rtapi_->closePort(); }
|
||||
inline bool RtMidiOut :: isPortOpen() const { return rtapi_->isPortOpen(); }
|
||||
inline unsigned int RtMidiOut :: getPortCount( void ) { return rtapi_->getPortCount(); }
|
||||
inline std::string RtMidiOut :: getPortName( unsigned int portNumber ) { return rtapi_->getPortName( portNumber ); }
|
||||
inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { return rtapi_->sendMessage( message ); }
|
||||
inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { ((MidiOutApi *)rtapi_)->sendMessage( message ); }
|
||||
inline void RtMidiOut :: setErrorCallback( RtMidiErrorCallback errorCallback ) { rtapi_->setErrorCallback(errorCallback); }
|
||||
|
||||
// **************************************************************** //
|
||||
//
|
||||
@@ -448,7 +565,7 @@ inline void RtMidiOut :: sendMessage( std::vector<unsigned char> *message ) { re
|
||||
//
|
||||
// **************************************************************** //
|
||||
|
||||
#if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__) && !defined(__WINDOWS_KS__)
|
||||
#if !defined(__LINUX_ALSA__) && !defined(__UNIX_JACK__) && !defined(__MACOSX_CORE__) && !defined(__WINDOWS_MM__)
|
||||
#define __RTMIDI_DUMMY__
|
||||
#endif
|
||||
|
||||
@@ -504,6 +621,9 @@ class MidiInJack: public MidiInApi
|
||||
std::string getPortName( unsigned int portNumber );
|
||||
|
||||
protected:
|
||||
std::string clientName;
|
||||
|
||||
void connect( void );
|
||||
void initialize( const std::string& clientName );
|
||||
};
|
||||
|
||||
@@ -521,6 +641,9 @@ class MidiOutJack: public MidiOutApi
|
||||
void sendMessage( std::vector<unsigned char> *message );
|
||||
|
||||
protected:
|
||||
std::string clientName;
|
||||
|
||||
void connect( void );
|
||||
void initialize( const std::string& clientName );
|
||||
};
|
||||
|
||||
@@ -600,74 +723,37 @@ class MidiOutWinMM: public MidiOutApi
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__WINDOWS_KS__)
|
||||
|
||||
class MidiInWinKS: public MidiInApi
|
||||
{
|
||||
public:
|
||||
MidiInWinKS( const std::string clientName, unsigned int queueSizeLimit );
|
||||
~MidiInWinKS( void );
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_KS; };
|
||||
void openPort( unsigned int portNumber, const std::string portName );
|
||||
void openVirtualPort( const std::string portName );
|
||||
void closePort( void );
|
||||
unsigned int getPortCount( void );
|
||||
std::string getPortName( unsigned int portNumber );
|
||||
|
||||
protected:
|
||||
void initialize( const std::string& clientName );
|
||||
};
|
||||
|
||||
class MidiOutWinKS: public MidiOutApi
|
||||
{
|
||||
public:
|
||||
MidiOutWinKS( const std::string clientName );
|
||||
~MidiOutWinKS( void );
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::WINDOWS_KS; };
|
||||
void openPort( unsigned int portNumber, const std::string portName );
|
||||
void openVirtualPort( const std::string portName );
|
||||
void closePort( void );
|
||||
unsigned int getPortCount( void );
|
||||
std::string getPortName( unsigned int portNumber );
|
||||
void sendMessage( std::vector<unsigned char> *message );
|
||||
|
||||
protected:
|
||||
void initialize( const std::string& clientName );
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__RTMIDI_DUMMY__)
|
||||
|
||||
class MidiInDummy: public MidiInApi
|
||||
{
|
||||
public:
|
||||
MidiInDummy( const std::string clientName, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); };
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; };
|
||||
void openPort( unsigned int portNumber, const std::string portName ) {};
|
||||
void openVirtualPort( const std::string portName ) {};
|
||||
void closePort( void ) {};
|
||||
unsigned int getPortCount( void ) { return 0; };
|
||||
std::string getPortName( unsigned int portNumber ) { return ""; };
|
||||
MidiInDummy( const std::string /*clientName*/, unsigned int queueSizeLimit ) : MidiInApi( queueSizeLimit ) { errorString_ = "MidiInDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); }
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }
|
||||
void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {}
|
||||
void openVirtualPort( const std::string /*portName*/ ) {}
|
||||
void closePort( void ) {}
|
||||
unsigned int getPortCount( void ) { return 0; }
|
||||
std::string getPortName( unsigned int portNumber ) { return ""; }
|
||||
|
||||
protected:
|
||||
void initialize( const std::string& clientName ) {};
|
||||
void initialize( const std::string& /*clientName*/ ) {}
|
||||
};
|
||||
|
||||
class MidiOutDummy: public MidiOutApi
|
||||
{
|
||||
public:
|
||||
MidiOutDummy( const std::string clientName ) { errorString_ = "MidiOutDummy: This class provides no functionality."; RtMidi::error( RtError::WARNING, errorString_ ); };
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; };
|
||||
void openPort( unsigned int portNumber, const std::string portName ) {};
|
||||
void openVirtualPort( const std::string portName ) {};
|
||||
void closePort( void ) {};
|
||||
unsigned int getPortCount( void ) { return 0; };
|
||||
std::string getPortName( unsigned int portNumber ) { return ""; };
|
||||
void sendMessage( std::vector<unsigned char> *message ) {};
|
||||
MidiOutDummy( const std::string /*clientName*/ ) { errorString_ = "MidiOutDummy: This class provides no functionality."; error( RtMidiError::WARNING, errorString_ ); }
|
||||
RtMidi::Api getCurrentApi( void ) { return RtMidi::RTMIDI_DUMMY; }
|
||||
void openPort( unsigned int /*portNumber*/, const std::string /*portName*/ ) {}
|
||||
void openVirtualPort( const std::string /*portName*/ ) {}
|
||||
void closePort( void ) {}
|
||||
unsigned int getPortCount( void ) { return 0; }
|
||||
std::string getPortName( unsigned int /*portNumber*/ ) { return ""; }
|
||||
void sendMessage( std::vector<unsigned char> * /*message*/ ) {}
|
||||
|
||||
protected:
|
||||
void initialize( const std::string& clientName ) {};
|
||||
void initialize( const std::string& /*clientName*/ ) {}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
\brief The STK namespace.
|
||||
|
||||
Most Stk classes are defined within the STK namespace. Exceptions
|
||||
to this include the classes RtAudio, RtMidi, and RtError.
|
||||
to this include the classes RtAudio and RtMidi.
|
||||
*/
|
||||
namespace stk {
|
||||
|
||||
|
||||
Reference in New Issue
Block a user