jack2 codebase
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

242 lines
7.0KB

  1. /*
  2. Copyright (C) 2007 Dmitry Baikov
  3. Original JACK MIDI implementation Copyright (C) 2004 Ian Esten
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU General Public License as published by
  6. the Free Software Foundation; either version 2 of the License, or
  7. (at your option) any later version.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. GNU General Public License for more details.
  12. You should have received a copy of the GNU General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. #include "JackError.h"
  17. #include "JackMidiPort.h"
  18. #include "JackExports.h"
  19. #include <errno.h>
  20. #include <string.h>
  21. #ifdef WIN32
  22. #define ENOBUFS 55
  23. #endif
  24. /*
  25. Post jack 0.103.0 version
  26. #ifdef __cplusplus
  27. extern "C" {
  28. #endif
  29. EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer);
  30. EXPORT int jack_midi_event_get(jack_midi_event_t* event,
  31. void* port_buffer, jack_nframes_t event_index);
  32. EXPORT void jack_midi_clear_buffer(void* port_buffer);
  33. EXPORT size_t jack_midi_max_event_size(void* port_buffer);
  34. EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer,
  35. jack_nframes_t time, size_t data_size);
  36. EXPORT int jack_midi_event_write(void* port_buffer,
  37. jack_nframes_t time, const jack_midi_data_t* data, size_t data_size);
  38. EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer);
  39. #ifdef __cplusplus
  40. }
  41. #endif
  42. using namespace Jack;
  43. EXPORT
  44. jack_nframes_t jack_midi_get_event_count(void* port_buffer)
  45. {
  46. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  47. if (!buf || !buf->IsValid())
  48. return 0;
  49. return buf->event_count;
  50. }
  51. EXPORT
  52. int jack_midi_event_get(jack_midi_event_t *event, void* port_buffer, jack_nframes_t event_index)
  53. {
  54. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  55. if (!buf || !buf->IsValid())
  56. return -EINVAL;
  57. if (event_index < 0 || event_index >= buf->event_count)
  58. return -ENOBUFS;
  59. JackMidiEvent* ev = &buf->events[event_index];
  60. event->time = ev->time;
  61. event->size = ev->size;
  62. event->buffer = ev->GetData(buf);
  63. return 0;
  64. }
  65. EXPORT
  66. void jack_midi_clear_buffer(void* port_buffer)
  67. {
  68. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  69. if (buf && buf->IsValid())
  70. buf->Reset(buf->nframes);
  71. }
  72. EXPORT
  73. size_t jack_midi_max_event_size(void* port_buffer)
  74. {
  75. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  76. if (buf && buf->IsValid())
  77. return buf->MaxEventSize();
  78. return 0;
  79. }
  80. EXPORT
  81. jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size)
  82. {
  83. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  84. if (!buf && !buf->IsValid())
  85. return 0;
  86. if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time))
  87. return 0;
  88. return buf->ReserveEvent(time, data_size);
  89. }
  90. EXPORT
  91. int jack_midi_event_write(void* port_buffer,
  92. jack_nframes_t time, const jack_midi_data_t* data, size_t data_size)
  93. {
  94. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  95. if (!buf && !buf->IsValid())
  96. return -EINVAL;
  97. if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time))
  98. return -EINVAL;
  99. jack_midi_data_t* dest = buf->ReserveEvent(time, data_size);
  100. if (!dest)
  101. return -ENOBUFS;
  102. memcpy(dest, data, data_size);
  103. return 0;
  104. }
  105. EXPORT
  106. jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer)
  107. {
  108. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  109. if (buf && buf->IsValid())
  110. return buf->lost_events;
  111. return 0;
  112. }
  113. */
  114. #ifdef __cplusplus
  115. extern "C" {
  116. #endif
  117. EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer, jack_nframes_t nframes);
  118. EXPORT int jack_midi_event_get(jack_midi_event_t* event,
  119. void* port_buffer, jack_nframes_t event_index, jack_nframes_t nframes);
  120. EXPORT void jack_midi_clear_buffer(void* port_buffer, jack_nframes_t nframes);
  121. EXPORT size_t jack_midi_max_event_size(void* port_buffer, jack_nframes_t nframes);
  122. EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer,
  123. jack_nframes_t time, size_t data_size, jack_nframes_t nframes);
  124. EXPORT int jack_midi_event_write(void* port_buffer,
  125. jack_nframes_t time, const jack_midi_data_t* data, size_t data_size, jack_nframes_t nframes);
  126. EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer, jack_nframes_t nframes);
  127. #ifdef __cplusplus
  128. }
  129. #endif
  130. using namespace Jack;
  131. EXPORT
  132. jack_nframes_t jack_midi_get_event_count(void* port_buffer, jack_nframes_t)
  133. {
  134. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  135. if (!buf || !buf->IsValid())
  136. return 0;
  137. return buf->event_count;
  138. }
  139. EXPORT
  140. int jack_midi_event_get(jack_midi_event_t *event, void* port_buffer, jack_nframes_t event_index, jack_nframes_t)
  141. {
  142. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  143. if (!buf || !buf->IsValid())
  144. return -EINVAL;
  145. if (event_index < 0 || event_index >= buf->event_count)
  146. return -ENOBUFS;
  147. JackMidiEvent* ev = &buf->events[event_index];
  148. event->time = ev->time;
  149. event->size = ev->size;
  150. event->buffer = ev->GetData(buf);
  151. return 0;
  152. }
  153. EXPORT
  154. void jack_midi_clear_buffer(void* port_buffer, jack_nframes_t)
  155. {
  156. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  157. if (buf && buf->IsValid())
  158. buf->Reset(buf->nframes);
  159. }
  160. EXPORT
  161. size_t jack_midi_max_event_size(void* port_buffer, jack_nframes_t)
  162. {
  163. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  164. if (buf && buf->IsValid())
  165. return buf->MaxEventSize();
  166. return 0;
  167. }
  168. EXPORT
  169. jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size, jack_nframes_t)
  170. {
  171. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  172. if (!buf && !buf->IsValid())
  173. return 0;
  174. if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time))
  175. return 0;
  176. return buf->ReserveEvent(time, data_size);
  177. }
  178. EXPORT
  179. int jack_midi_event_write(void* port_buffer,
  180. jack_nframes_t time, const jack_midi_data_t* data, size_t data_size, jack_nframes_t)
  181. {
  182. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  183. if (!buf && !buf->IsValid())
  184. return -EINVAL;
  185. if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time))
  186. return -EINVAL;
  187. jack_midi_data_t* dest = buf->ReserveEvent(time, data_size);
  188. if (!dest)
  189. return -ENOBUFS;
  190. memcpy(dest, data, data_size);
  191. return 0;
  192. }
  193. EXPORT
  194. jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer, jack_nframes_t)
  195. {
  196. JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer;
  197. if (buf && buf->IsValid())
  198. return buf->lost_events;
  199. return 0;
  200. }