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.

283 lines
8.9KB

  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("CarlaJackClient :: %s | %s %s %lu", __FUNCTION__, port_name, port_type, flags);
  25. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  26. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, nullptr);
  27. JackClientState& jstate(jclient->fState);
  28. CARLA_SAFE_ASSERT_RETURN(port_name != nullptr && port_name[0] != '\0', nullptr);
  29. CARLA_SAFE_ASSERT_RETURN(port_type != nullptr && port_type[0] != '\0', nullptr);
  30. if (std::strcmp(port_type, JACK_DEFAULT_AUDIO_TYPE) == 0)
  31. {
  32. uint32_t index;
  33. /**/ if (flags & JackPortIsInput)
  34. {
  35. if (jstate.prematurelyActivated)
  36. {
  37. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns > 0, nullptr);
  38. jstate.fakeIns -= 1;
  39. index = jstate.audioIns.count() - jstate.fakeIns - 1;
  40. }
  41. else
  42. {
  43. index = jstate.audioIns.count();
  44. jstate.audioIns.append(new JackPortState(jstate.name, port_name, index, flags, false));
  45. }
  46. return (jack_port_t*)jstate.audioIns.getAt(index, nullptr);
  47. }
  48. else if (flags & JackPortIsOutput)
  49. {
  50. if (jstate.prematurelyActivated)
  51. {
  52. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts > 0, nullptr);
  53. jstate.fakeOuts -= 1;
  54. index = jstate.audioOuts.count() - jstate.fakeOuts - 1;
  55. }
  56. else
  57. {
  58. index = jstate.audioOuts.count();
  59. jstate.audioOuts.append(new JackPortState(jstate.name, port_name, index, flags, false));
  60. }
  61. return (jack_port_t*)jstate.audioOuts.getAt(index, nullptr);
  62. }
  63. carla_stderr2("Invalid port flags '%x'", flags);
  64. return nullptr;
  65. }
  66. carla_stderr2("Invalid port type '%s'", port_type);
  67. return nullptr;
  68. }
  69. CARLA_EXPORT
  70. int jack_port_unregister(jack_client_t* client, jack_port_t* port)
  71. {
  72. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  73. CarlaJackClient* const jclient = (CarlaJackClient*)client;
  74. CARLA_SAFE_ASSERT_RETURN(jclient != nullptr, 1);
  75. JackPortState* const jport = (JackPortState*)port;
  76. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 1);
  77. CARLA_SAFE_ASSERT_RETURN(! jport->isSystem, 1);
  78. JackClientState& jstate(jclient->fState);
  79. //CARLA_SAFE_ASSERT_RETURN(! jstate.activated, 1);
  80. if (jport->flags & JackPortIsOutput)
  81. {
  82. if (jstate.prematurelyActivated)
  83. {
  84. CARLA_SAFE_ASSERT_RETURN(jstate.fakeIns < 2, 1);
  85. jstate.fakeIns += 1;
  86. }
  87. else
  88. {
  89. CARLA_SAFE_ASSERT_RETURN(jstate.audioIns.removeOne(jport), 1);
  90. }
  91. }
  92. else
  93. {
  94. if (jstate.prematurelyActivated)
  95. {
  96. CARLA_SAFE_ASSERT_RETURN(jstate.fakeOuts < 2, 1);
  97. jstate.fakeOuts += 1;
  98. }
  99. else
  100. {
  101. CARLA_SAFE_ASSERT_RETURN(jstate.audioOuts.removeOne(jport), 1);
  102. }
  103. }
  104. return 0;
  105. }
  106. CARLA_EXPORT
  107. void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t)
  108. {
  109. JackPortState* const jport = (JackPortState*)port;
  110. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  111. return jport->buffer;
  112. }
  113. // --------------------------------------------------------------------------------------------------------------------
  114. CARLA_EXPORT
  115. jack_uuid_t jack_port_uuid(const jack_port_t*)
  116. {
  117. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  118. return 0;
  119. }
  120. CARLA_EXPORT
  121. const char* jack_port_name(const jack_port_t* port)
  122. {
  123. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  124. JackPortState* const jport = (JackPortState*)port;
  125. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  126. return jport->fullname;
  127. }
  128. CARLA_EXPORT
  129. const char* jack_port_short_name(const jack_port_t* port)
  130. {
  131. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  132. JackPortState* const jport = (JackPortState*)port;
  133. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  134. return jport->name;
  135. }
  136. CARLA_EXPORT
  137. int jack_port_flags(const jack_port_t* port)
  138. {
  139. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  140. JackPortState* const jport = (JackPortState*)port;
  141. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, 0);
  142. return jport->flags;
  143. }
  144. CARLA_EXPORT
  145. const char* jack_port_type(const jack_port_t* port)
  146. {
  147. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  148. JackPortState* const jport = (JackPortState*)port;
  149. CARLA_SAFE_ASSERT_RETURN(jport != nullptr, nullptr);
  150. // TODO
  151. return JACK_DEFAULT_AUDIO_TYPE;
  152. }
  153. //jack_port_type_id_t jack_port_type_id (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  154. // --------------------------------------------------------------------------------------------------------------------
  155. //int jack_port_is_mine (const jack_client_t *client, const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  156. CARLA_EXPORT
  157. int jack_port_connected(const jack_port_t*)
  158. {
  159. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  160. return 1;
  161. }
  162. //int jack_port_connected_to (const jack_port_t *port,
  163. // const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
  164. // --------------------------------------------------------------------------------------------------------------------
  165. // const char ** jack_port_get_connections (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  166. // const char ** jack_port_get_all_connections (const jack_client_t *client,
  167. // const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  168. // --------------------------------------------------------------------------------------------------------------------
  169. //int jack_port_tie (jack_port_t *src, jack_port_t *dst) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  170. //int jack_port_untie (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  171. // --------------------------------------------------------------------------------------------------------------------
  172. //int jack_port_set_name (jack_port_t *port, const char *port_name) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
  173. //int jack_port_rename (jack_client_t* client, jack_port_t *port, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
  174. //int jack_port_set_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
  175. //int jack_port_unset_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
  176. //int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]) JACK_OPTIONAL_WEAK_EXPORT;
  177. // --------------------------------------------------------------------------------------------------------------------
  178. //int jack_port_request_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  179. //int jack_port_request_monitor_by_name (jack_client_t *client,
  180. // const char *port_name, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  181. //int jack_port_ensure_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
  182. //int jack_port_monitoring_input (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
  183. // --------------------------------------------------------------------------------------------------------------------
  184. CARLA_EXPORT
  185. int jack_connect(jack_client_t*, const char*, const char*)
  186. {
  187. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  188. return 0;
  189. }
  190. CARLA_EXPORT
  191. int jack_disconnect(jack_client_t*, const char*, const char*)
  192. {
  193. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  194. return 0;
  195. }
  196. CARLA_EXPORT
  197. int jack_port_disconnect(jack_client_t*, jack_port_t*)
  198. {
  199. carla_stdout("CarlaJackClient :: %s", __FUNCTION__);
  200. return 0;
  201. }
  202. // --------------------------------------------------------------------------------------------------------------------
  203. CARLA_EXPORT
  204. int jack_port_name_size(void)
  205. {
  206. return STR_MAX;
  207. }
  208. // int jack_port_type_size(void) JACK_OPTIONAL_WEAK_EXPORT;
  209. //size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_type) JACK_WEAK_EXPORT;
  210. // --------------------------------------------------------------------------------------------------------------------