Audio plugin host https://kx.studio/carla
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.

328 lines
9.8KB

  1. /*
  2. * Carla JACK API for external applications
  3. * Copyright (C) 2016-2017 Filipe Coelho <falktx@falktx.com>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License, or any later version.
  9. *
  10. * This program is distributed in the hope that it will be useful,
  11. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. * GNU General Public License for more details.
  14. *
  15. * For a full copy of the GNU General Public License see the doc/GPL.txt file.
  16. */
  17. #include "libjack.hpp"
  18. CARLA_BACKEND_USE_NAMESPACE
  19. // --------------------------------------------------------------------------------------------------------------------
  20. CARLA_EXPORT
  21. jack_port_t* jack_port_register(jack_client_t* client, const char* port_name, const char* port_type,
  22. unsigned long flags, unsigned long buffer_size)
  23. {
  24. carla_stdout("%s(%p, %s, %s, 0x%lx, %lu)", __FUNCTION__, client, port_name, port_type, flags, buffer_size);
  25. JackClientState* const jclient = (JackClientState*)client;
  26. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  27. CARLA_SAFE_ASSERT_RETURN(port_name != nullptr && port_name[0] != '\0', nullptr);
  28. CARLA_SAFE_ASSERT_RETURN(port_type != nullptr && port_type[0] != '\0', nullptr);
  29. if (std::strcmp(port_type, JACK_DEFAULT_AUDIO_TYPE) == 0)
  30. {
  31. if (flags & JackPortIsInput)
  32. {
  33. JackPortState* const port = new JackPortState(jclient->name, port_name, jclient->audioIns.count(), flags, false, false);
  34. const CarlaMutexLocker cms(jclient->mutex);
  35. jclient->audioIns.append(port);
  36. return (jack_port_t*)port;
  37. }
  38. if (flags & JackPortIsOutput)
  39. {
  40. JackPortState* const port = new JackPortState(jclient->name, port_name, jclient->audioOuts.count(), flags, false, false);
  41. const CarlaMutexLocker cms(jclient->mutex);
  42. jclient->audioOuts.append(port);
  43. return (jack_port_t*)port;
  44. }
  45. carla_stderr2("Invalid port flags '%x'", flags);
  46. return nullptr;
  47. }
  48. if (std::strcmp(port_type, JACK_DEFAULT_MIDI_TYPE) == 0)
  49. {
  50. if (flags & JackPortIsInput)
  51. {
  52. JackPortState* const port = new JackPortState(jclient->name, port_name, jclient->midiIns.count(), flags, true, false);
  53. const CarlaMutexLocker cms(jclient->mutex);
  54. jclient->midiIns.append(port);
  55. return (jack_port_t*)port;
  56. }
  57. if (flags & JackPortIsOutput)
  58. {
  59. JackPortState* const port = new JackPortState(jclient->name, port_name, jclient->midiOuts.count(), flags, true, false);
  60. const CarlaMutexLocker cms(jclient->mutex);
  61. jclient->midiOuts.append(port);
  62. return (jack_port_t*)port;
  63. }
  64. carla_stderr2("Invalid port flags '%x'", flags);
  65. return nullptr;
  66. }
  67. carla_stderr2("Invalid port type '%s'", port_type);
  68. return nullptr;
  69. }
  70. CARLA_EXPORT
  71. int jack_port_unregister(jack_client_t* client, jack_port_t* port)
  72. {
  73. carla_stdout("%s(%p, %p)", __FUNCTION__, client, port);
  74. JackClientState* const jclient = (JackClientState*)client;
  75. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  76. JackPortState* const jport = (JackPortState*)port;
  77. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 1);
  78. CARLA_SAFE_ASSERT_RETURN(! jport->isSystem, 1);
  79. const CarlaMutexLocker cms(jclient->mutex);
  80. if (jport->isMidi)
  81. {
  82. if (jport->flags & JackPortIsInput)
  83. {
  84. CARLA_SAFE_ASSERT_RETURN(jclient->midiIns.removeOne(jport), 1);
  85. return 0;
  86. }
  87. if (jport->flags & JackPortIsOutput)
  88. {
  89. CARLA_SAFE_ASSERT_RETURN(jclient->midiOuts.removeOne(jport), 1);
  90. return 0;
  91. }
  92. }
  93. else
  94. {
  95. if (jport->flags & JackPortIsInput)
  96. {
  97. CARLA_SAFE_ASSERT_RETURN(jclient->audioIns.removeOne(jport), 1);
  98. return 0;
  99. }
  100. if (jport->flags & JackPortIsOutput)
  101. {
  102. CARLA_SAFE_ASSERT_RETURN(jclient->audioOuts.removeOne(jport), 1);
  103. return 0;
  104. }
  105. }
  106. carla_stderr2("Invalid port on unregister");
  107. return 1;
  108. }
  109. CARLA_EXPORT
  110. void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t)
  111. {
  112. JackPortState* const jport = (JackPortState*)port;
  113. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  114. return jport->buffer;
  115. }
  116. // --------------------------------------------------------------------------------------------------------------------
  117. CARLA_EXPORT
  118. jack_uuid_t jack_port_uuid(const jack_port_t* port)
  119. {
  120. carla_stdout("%s(%p)", __FUNCTION__, port);
  121. return 0;
  122. }
  123. CARLA_EXPORT
  124. const char* jack_port_name(const jack_port_t* port)
  125. {
  126. carla_stdout("%s(%p)", __FUNCTION__, port);
  127. JackPortState* const jport = (JackPortState*)port;
  128. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  129. return jport->fullname;
  130. }
  131. CARLA_EXPORT
  132. const char* jack_port_short_name(const jack_port_t* port)
  133. {
  134. carla_stdout("%s(%p)", __FUNCTION__, port);
  135. JackPortState* const jport = (JackPortState*)port;
  136. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  137. return jport->name;
  138. }
  139. CARLA_EXPORT
  140. int jack_port_flags(const jack_port_t* port)
  141. {
  142. carla_stdout("%s(%p)", __FUNCTION__, port);
  143. JackPortState* const jport = (JackPortState*)port;
  144. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 0);
  145. return jport->flags;
  146. }
  147. CARLA_EXPORT
  148. const char* jack_port_type(const jack_port_t* port)
  149. {
  150. carla_stdout("%s(%p)", __FUNCTION__, port);
  151. JackPortState* const jport = (JackPortState*)port;
  152. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  153. static const char* const kAudioType = JACK_DEFAULT_AUDIO_TYPE;
  154. static const char* const kMidiType = JACK_DEFAULT_MIDI_TYPE;
  155. return jport->isMidi ? kMidiType : kAudioType;
  156. }
  157. CARLA_EXPORT
  158. uint32_t jack_port_type_id(const jack_port_t* port)
  159. {
  160. carla_stdout("%s(%p)", __FUNCTION__, port);
  161. JackPortState* const jport = (JackPortState*)port;
  162. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 0);
  163. return jport->isMidi ? 1 : 0;
  164. }
  165. // --------------------------------------------------------------------------------------------------------------------
  166. CARLA_EXPORT
  167. int jack_port_is_mine(const jack_client_t* client, const jack_port_t* port)
  168. {
  169. carla_stderr2("%s(%p, %p)", __FUNCTION__, client, port);
  170. return 0;
  171. }
  172. CARLA_EXPORT
  173. int jack_port_connected(const jack_port_t* port)
  174. {
  175. carla_stderr2("%s(%p)", __FUNCTION__, port);
  176. return 1;
  177. }
  178. CARLA_EXPORT
  179. int jack_port_connected_to(const jack_port_t* port, const char* port_name)
  180. {
  181. carla_stderr2("%s(%p, %s)", __FUNCTION__, port, port_name);
  182. return 1;
  183. }
  184. // --------------------------------------------------------------------------------------------------------------------
  185. CARLA_EXPORT
  186. const char** jack_port_get_connections (const jack_port_t* port)
  187. {
  188. carla_stderr2("%s(%p)", __FUNCTION__, port);
  189. return nullptr;
  190. }
  191. CARLA_EXPORT
  192. const char** jack_port_get_all_connections(const jack_client_t* client, const jack_port_t* port)
  193. {
  194. carla_stderr2("%s(%p, %p)", __FUNCTION__, client, port);
  195. return nullptr;
  196. }
  197. // --------------------------------------------------------------------------------------------------------------------
  198. //int jack_port_tie (jack_port_t *src, jack_port_t *dst) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  199. //int jack_port_untie (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  200. // --------------------------------------------------------------------------------------------------------------------
  201. //int jack_port_set_name (jack_port_t *port, const char *port_name) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  202. //int jack_port_rename (jack_client_t* client, jack_port_t *port, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
  203. //int jack_port_set_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
  204. //int jack_port_unset_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
  205. //int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]) JACK_OPTIONAL_WEAK_EXPORT;
  206. // --------------------------------------------------------------------------------------------------------------------
  207. //int jack_port_request_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  208. //int jack_port_request_monitor_by_name (jack_client_t *client,
  209. // const char *port_name, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  210. //int jack_port_ensure_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  211. //int jack_port_monitoring_input (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  212. // --------------------------------------------------------------------------------------------------------------------
  213. CARLA_EXPORT
  214. int jack_connect(jack_client_t* client, const char* a, const char* b)
  215. {
  216. carla_stderr2("%s(%p, %s. %s)", __FUNCTION__, client, a, b);
  217. return 0;
  218. }
  219. CARLA_EXPORT
  220. int jack_disconnect(jack_client_t* client, const char* a, const char* b)
  221. {
  222. carla_stderr2("%s(%p, %s. %s)", __FUNCTION__, client, a, b);
  223. return 0;
  224. }
  225. CARLA_EXPORT
  226. int jack_port_disconnect(jack_client_t* client, jack_port_t* port)
  227. {
  228. carla_stderr2("%s(%p, %p)", __FUNCTION__, client, port);
  229. return 0;
  230. }
  231. // --------------------------------------------------------------------------------------------------------------------
  232. CARLA_EXPORT
  233. int jack_port_name_size(void)
  234. {
  235. return STR_MAX;
  236. }
  237. // int jack_port_type_size(void) JACK_OPTIONAL_WEAK_EXPORT;
  238. //size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_type) JACK_WEAK_EXPORT;
  239. // --------------------------------------------------------------------------------------------------------------------