00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "JackError.h"
00022 #include "JackMidiPort.h"
00023 #include <errno.h>
00024 #include <string.h>
00025
00026 #ifdef __cplusplus
00027 extern "C"
00028 {
00029 #endif
00030
00031 LIB_EXPORT uint32_t jack_midi_get_event_count(void* port_buffer);
00032
00033 LIB_EXPORT int jack_midi_event_get(jack_midi_event_t* event,
00034 void* port_buffer, uint32_t event_index);
00035
00036 LIB_EXPORT void jack_midi_clear_buffer(void* port_buffer);
00037
00038 LIB_EXPORT size_t jack_midi_max_event_size(void* port_buffer);
00039
00040 LIB_EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer,
00041 jack_nframes_t time, size_t data_size);
00042
00043 LIB_EXPORT int jack_midi_event_write(void* port_buffer,
00044 jack_nframes_t time, const jack_midi_data_t* data, size_t data_size);
00045
00046 LIB_EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer);
00047
00048 #ifdef __cplusplus
00049 }
00050 #endif
00051
00052 using namespace Jack;
00053
00054 LIB_EXPORT
00055 uint32_t jack_midi_get_event_count(void* port_buffer)
00056 {
00057 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00058 if (!buf || !buf->IsValid()) {
00059 return 0;
00060 }
00061 return buf->event_count;
00062 }
00063
00064 LIB_EXPORT
00065 int jack_midi_event_get(jack_midi_event_t *event, void* port_buffer, uint32_t event_index)
00066 {
00067 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00068 if (!buf || !buf->IsValid()) {
00069 return -EINVAL;
00070 }
00071 if (event_index >= buf->event_count) {
00072 return -ENOBUFS;
00073 }
00074 JackMidiEvent* ev = &buf->events[event_index];
00075 event->time = ev->time;
00076 event->size = ev->size;
00077 event->buffer = ev->GetData(buf);
00078 return 0;
00079 }
00080
00081 LIB_EXPORT
00082 void jack_midi_clear_buffer(void* port_buffer)
00083 {
00084 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00085 if (buf && buf->IsValid()) {
00086 buf->Reset(buf->nframes);
00087 }
00088 }
00089
00090 LIB_EXPORT
00091 size_t jack_midi_max_event_size(void* port_buffer)
00092 {
00093 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00094 if (buf && buf->IsValid())
00095 return buf->MaxEventSize();
00096 return 0;
00097 }
00098
00099 LIB_EXPORT
00100 jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size)
00101 {
00102 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00103 if (! buf) {
00104 jack_error("jack_midi_event_reserve: port buffer is set to NULL");
00105 return 0;
00106 }
00107 if (! buf->IsValid()) {
00108 jack_error("jack_midi_event_reserve: port buffer is invalid");
00109 return 0;
00110 }
00111 if (time >= buf->nframes) {
00112 jack_error("jack_midi_event_reserve: time parameter is out of range "
00113 "(%lu >= %lu)", time, buf->nframes);
00114 return 0;
00115 }
00116 if (buf->event_count && (buf->events[buf->event_count - 1].time > time)) {
00117 jack_error("jack_midi_event_reserve: time parameter is earlier than "
00118 "last reserved event");
00119 return 0;
00120 }
00121 return buf->ReserveEvent(time, data_size);
00122 }
00123
00124 LIB_EXPORT
00125 int jack_midi_event_write(void* port_buffer,
00126 jack_nframes_t time, const jack_midi_data_t* data, size_t data_size)
00127 {
00128 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00129 if (!buf && !buf->IsValid()) {
00130 return -EINVAL;
00131 }
00132 if (time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time)) {
00133 return -EINVAL;
00134 }
00135 jack_midi_data_t* dest = buf->ReserveEvent(time, data_size);
00136 if (!dest) {
00137 return -ENOBUFS;
00138 }
00139 memcpy(dest, data, data_size);
00140 return 0;
00141 }
00142
00143 LIB_EXPORT
00144 uint32_t jack_midi_get_lost_event_count(void* port_buffer)
00145 {
00146 JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
00147 if (buf && buf->IsValid())
00148 return buf->lost_events;
00149 return 0;
00150 }