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.

157 lines
4.5KB

  1. /*
  2. Copyright (C) 2001-2003 Paul Davis
  3. Copyright (C) 2004-2008 Grame
  4. This program is free software; you can redistribute it and/or modify
  5. it under the terms of the GNU Lesser General Public License as published by
  6. the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
  12. You should have received a copy of the GNU Lesser General Public License
  13. along with this program; if not, write to the Free Software
  14. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  15. */
  16. #if defined(HAVE_CONFIG_H)
  17. #include "config.h"
  18. #endif
  19. #include "JackDebugClient.h"
  20. #include "JackLibClient.h"
  21. #include "JackChannel.h"
  22. #include "JackLibGlobals.h"
  23. #include "JackGlobals.h"
  24. #include "JackServerLaunch.h"
  25. #include "JackTools.h"
  26. using namespace Jack;
  27. #ifdef WIN32
  28. #define EXPORT __declspec(dllexport)
  29. #else
  30. #define EXPORT
  31. #endif
  32. #ifdef __cplusplus
  33. extern "C"
  34. {
  35. #endif
  36. EXPORT jack_client_t * jack_client_open_aux (const char *client_name,
  37. jack_options_t options,
  38. jack_status_t *status, va_list ap);
  39. EXPORT jack_client_t * jack_client_open (const char *client_name,
  40. jack_options_t options,
  41. jack_status_t *status, ...);
  42. EXPORT int jack_client_close (jack_client_t *client);
  43. EXPORT int jack_get_client_pid (const char *name);
  44. #ifdef __cplusplus
  45. }
  46. #endif
  47. JackLibGlobals* JackLibGlobals::fGlobals = NULL;
  48. int JackLibGlobals::fClientCount = 0;
  49. EXPORT jack_client_t* jack_client_open_aux(const char* ext_client_name, jack_options_t options, jack_status_t* status, va_list ap)
  50. {
  51. jack_varargs_t va; /* variable arguments */
  52. jack_status_t my_status;
  53. JackClient* client;
  54. char client_name[JACK_CLIENT_NAME_SIZE + 1];
  55. if (ext_client_name == NULL) {
  56. jack_error("jack_client_open called with a NULL client_name");
  57. return NULL;
  58. }
  59. jack_log("jack_client_open %s", ext_client_name);
  60. JackTools::RewriteName(ext_client_name, client_name);
  61. if (status == NULL) /* no status from caller? */
  62. status = &my_status; /* use local status word */
  63. *status = (jack_status_t)0;
  64. /* validate parameters */
  65. if ((options & ~JackOpenOptions)) {
  66. int my_status1 = *status | (JackFailure | JackInvalidOption);
  67. *status = (jack_status_t)my_status1;
  68. return NULL;
  69. }
  70. /* parse variable arguments */
  71. if (ap)
  72. jack_varargs_parse(options, ap, &va);
  73. else
  74. jack_varargs_init(&va);
  75. JackLibGlobals::Init(); // jack library initialisation
  76. #ifndef WIN32
  77. if (try_start_server(&va, options, status)) {
  78. jack_error("jack server is not running or cannot be started");
  79. JackLibGlobals::Destroy(); // jack library destruction
  80. return 0;
  81. }
  82. #endif
  83. #ifndef WIN32
  84. char* jack_debug = getenv("JACK_CLIENT_DEBUG");
  85. if (jack_debug && strcmp(jack_debug, "on") == 0)
  86. client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode
  87. else
  88. client = new JackLibClient(GetSynchroTable());
  89. #else
  90. client = new JackLibClient(GetSynchroTable());
  91. #endif
  92. int res = client->Open(va.server_name, client_name, options, status);
  93. if (res < 0) {
  94. delete client;
  95. JackLibGlobals::Destroy(); // jack library destruction
  96. int my_status1 = (JackFailure | JackServerError);
  97. *status = (jack_status_t)my_status1;
  98. return NULL;
  99. } else {
  100. return (jack_client_t*)client;
  101. }
  102. }
  103. EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...)
  104. {
  105. va_list ap;
  106. va_start(ap, status);
  107. jack_client_t* res = jack_client_open_aux(ext_client_name, options, status, ap);
  108. va_end(ap);
  109. return res;
  110. }
  111. EXPORT int jack_client_close(jack_client_t* ext_client)
  112. {
  113. jack_log("jack_client_close");
  114. JackClient* client = (JackClient*)ext_client;
  115. if (client == NULL) {
  116. jack_error("jack_client_close called with a NULL client");
  117. return -1;
  118. } else {
  119. int res = client->Close();
  120. delete client;
  121. jack_log("jack_client_close OK");
  122. JackLibGlobals::Destroy(); // jack library destruction
  123. return res;
  124. }
  125. }
  126. EXPORT int jack_get_client_pid(const char *name)
  127. {
  128. jack_error("jack_get_client_pid : not implemented on library side");
  129. return 0;
  130. }