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.

163 lines
4.8KB

  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. #include "JackDebugClient.h"
  17. #include "JackLibClient.h"
  18. #include "JackChannel.h"
  19. #include "JackLibGlobals.h"
  20. #include "JackGlobals.h"
  21. #include "JackCompilerDeps.h"
  22. #include "JackTools.h"
  23. #include "JackSystemDeps.h"
  24. #include "JackServerLaunch.h"
  25. #include <assert.h>
  26. using namespace Jack;
  27. #ifdef __cplusplus
  28. extern "C"
  29. {
  30. #endif
  31. EXPORT jack_client_t * jack_client_open_aux (const char *client_name,
  32. jack_options_t options,
  33. jack_status_t *status, va_list ap);
  34. EXPORT jack_client_t * jack_client_open (const char *client_name,
  35. jack_options_t options,
  36. jack_status_t *status, ...);
  37. EXPORT int jack_client_close (jack_client_t *client);
  38. EXPORT int jack_get_client_pid (const char *name);
  39. #ifdef __cplusplus
  40. }
  41. #endif
  42. JackLibGlobals* JackLibGlobals::fGlobals = NULL;
  43. int JackLibGlobals::fClientCount = 0;
  44. EXPORT jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t options, jack_status_t* status, va_list ap)
  45. {
  46. jack_varargs_t va; /* variable arguments */
  47. jack_status_t my_status;
  48. JackClient* client;
  49. if (client_name == NULL) {
  50. jack_error("jack_client_open called with a NULL client_name");
  51. return NULL;
  52. }
  53. jack_log("jack_client_open %s", client_name);
  54. if (status == NULL) /* no status from caller? */
  55. status = &my_status; /* use local status word */
  56. *status = (jack_status_t)0;
  57. /* validate parameters */
  58. if ((options & ~JackOpenOptions)) {
  59. int my_status1 = *status | (JackFailure | JackInvalidOption);
  60. *status = (jack_status_t)my_status1;
  61. return NULL;
  62. }
  63. /* parse variable arguments */
  64. if (ap) {
  65. jack_varargs_parse(options, ap, &va);
  66. } else {
  67. jack_varargs_init(&va);
  68. }
  69. JackLibGlobals::Init(); // jack library initialisation
  70. if (try_start_server(&va, options, status)) {
  71. jack_error("jack server is not running or cannot be started");
  72. JackLibGlobals::Destroy(); // jack library destruction
  73. return 0;
  74. }
  75. if (JACK_DEBUG) {
  76. client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode
  77. } else {
  78. client = new JackLibClient(GetSynchroTable());
  79. }
  80. int res = client->Open(va.server_name, client_name, options, status);
  81. if (res < 0) {
  82. delete client;
  83. JackLibGlobals::Destroy(); // jack library destruction
  84. int my_status1 = (JackFailure | JackServerError);
  85. *status = (jack_status_t)my_status1;
  86. return NULL;
  87. } else {
  88. return (jack_client_t*)client;
  89. }
  90. }
  91. EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...)
  92. {
  93. try {
  94. #ifdef __CLIENTDEBUG__
  95. JackGlobals::CheckContext("jack_client_open");
  96. #endif
  97. assert(JackGlobals::fOpenMutex);
  98. JackGlobals::fOpenMutex->Lock();
  99. va_list ap;
  100. va_start(ap, status);
  101. jack_client_t* res = jack_client_open_aux(ext_client_name, options, status, ap);
  102. va_end(ap);
  103. JackGlobals::fOpenMutex->Unlock();
  104. return res;
  105. } catch(std::bad_alloc& e) {
  106. jack_error("Memory allocation error...");
  107. return NULL;
  108. } catch (...) {
  109. jack_error("Unknown error...");
  110. return NULL;
  111. }
  112. }
  113. EXPORT int jack_client_close(jack_client_t* ext_client)
  114. {
  115. #ifdef __CLIENTDEBUG__
  116. JackGlobals::CheckContext("jack_client_close");
  117. #endif
  118. assert(JackGlobals::fOpenMutex);
  119. JackGlobals::fOpenMutex->Lock();
  120. int res = -1;
  121. jack_log("jack_client_close");
  122. JackClient* client = (JackClient*)ext_client;
  123. if (client == NULL) {
  124. jack_error("jack_client_close called with a NULL client");
  125. } else {
  126. res = client->Close();
  127. delete client;
  128. JackLibGlobals::Destroy(); // jack library destruction
  129. jack_log("jack_client_close res = %d", res);
  130. }
  131. JackGlobals::fOpenMutex->Unlock();
  132. return res;
  133. }
  134. EXPORT int jack_get_client_pid(const char *name)
  135. {
  136. jack_error("jack_get_client_pid : not implemented on library side");
  137. return 0;
  138. }