1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
|
#include <string.h>
#include <stdlib.h>
#include "rtmidi_c.h"
#include "RtMidi.h"
/* misc */
int rtmidi_sizeof_rtmidi_api ()
{
return sizeof (RtMidiApi);
}
/* RtMidi API */
int rtmidi_get_compiled_api (enum RtMidiApi **apis) // return length for NULL argument.
{
if (!apis || !(*apis)) {
std::vector<RtMidi::Api> *v = new std::vector<RtMidi::Api> ();
try {
RtMidi::getCompiledApi (*v);
int size = v->size ();
delete v;
return size;
} catch (...) {
return -1;
}
} else {
try {
std::vector<RtMidi::Api> *v = new std::vector<RtMidi::Api> ();
RtMidi::getCompiledApi (*v);
for (unsigned int i = 0; i < v->size (); i++)
(*apis) [i] = (RtMidiApi) v->at (i);
delete v;
return 0;
} catch (...) {
return -1;
}
}
}
void rtmidi_error (MidiApi *api, enum RtMidiErrorType type, const char* errorString)
{
std::string msg = errorString;
api->error ((RtMidiError::Type) type, msg);
}
void rtmidi_open_port (RtMidiPtr device, unsigned int portNumber, const char *portName)
{
std::string name = portName;
((RtMidi*) device)->openPort (portNumber, name);
}
void rtmidi_open_virtual_port (RtMidiPtr device, const char *portName)
{
std::string name = portName;
((RtMidi*) device)->openVirtualPort (name);
}
void rtmidi_close_port (RtMidiPtr device)
{
((RtMidi*) device)->closePort ();
}
unsigned int rtmidi_get_port_count (RtMidiPtr device)
{
return ((RtMidi*) device)->getPortCount ();
}
const char* rtmidi_get_port_name (RtMidiPtr device, unsigned int portNumber)
{
std::string name = ((RtMidi*) device)->getPortName (portNumber);
return strdup (name.c_str ());
}
/* RtMidiIn API */
RtMidiInPtr rtmidi_in_create_default ()
{
return new RtMidiIn ();
}
RtMidiInPtr rtmidi_in_create (enum RtMidiApi api, const char *clientName, unsigned int queueSizeLimit)
{
std::string name = clientName;
return new RtMidiIn ((RtMidi::Api) api, name, queueSizeLimit);
}
void rtmidi_in_free (RtMidiInPtr device)
{
delete (RtMidiIn*) device;
}
enum RtMidiApi rtmidi_in_get_current_api (RtMidiPtr device)
{
return (RtMidiApi) ((RtMidiIn*) device)->getCurrentApi ();
}
class CallbackProxyUserData
{
public:
CallbackProxyUserData (RtMidiCCallback cCallback, void *userData)
: c_callback (cCallback), user_data (userData)
{
}
RtMidiCCallback c_callback;
void *user_data;
};
void callback_proxy (double timeStamp, std::vector<unsigned char> *message, void *userData)
{
CallbackProxyUserData* data = reinterpret_cast<CallbackProxyUserData*> (userData);
data->c_callback (timeStamp, message->data (), data->user_data);
}
void rtmidi_in_set_callback (RtMidiInPtr device, RtMidiCCallback callback, void *userData)
{
void *data = (void *) new CallbackProxyUserData (callback, userData);
((RtMidiIn*) device)->setCallback (callback_proxy, data);
}
void rtmidi_in_cancel_callback (RtMidiInPtr device)
{
((RtMidiIn*) device)->cancelCallback ();
}
void rtmidi_in_ignore_types (RtMidiInPtr device, bool midiSysex, bool midiTime, bool midiSense)
{
((RtMidiIn*) device)->ignoreTypes (midiSysex, midiTime, midiSense);
}
double rtmidi_in_get_message (RtMidiInPtr device, unsigned char **message)
{
try {
// FIXME: use allocator to achieve efficient buffering
std::vector<unsigned char> *v = new std::vector<unsigned char> ();
double ret = ((RtMidiIn*) device)->getMessage (v);
*message = (unsigned char *) malloc ((int) ret);
memcpy (*message, v->data (), (int) ret);
delete v;
return ret;
} catch (...) {
return -1;
}
}
/* RtMidiOut API */
RtMidiOutPtr rtmidi_out_create_default ()
{
return new RtMidiOut ();
}
RtMidiOutPtr rtmidi_out_create (enum RtMidiApi api, const char *clientName)
{
std::string name = clientName;
return new RtMidiOut ((RtMidi::Api) api, name);
}
void rtmidi_out_free (RtMidiOutPtr device)
{
delete (RtMidiOut*) device;
}
enum RtMidiApi rtmidi_out_get_current_api (RtMidiPtr device)
{
return (RtMidiApi) ((RtMidiOut*) device)->getCurrentApi ();
}
int rtmidi_out_send_message (RtMidiOutPtr device, const unsigned char *message, int length)
{
try {
// FIXME: use allocator to achieve efficient buffering
std::vector<unsigned char> *v = new std::vector<unsigned char> (length);
memcpy (v->data (), message, length);
((RtMidiOut*) device)->sendMessage (v);
delete v;
return 0;
} catch (...) {
return -1;
}
}
|