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.

181 lines
4.9KB

  1. /*
  2. Copyright (C) 2001 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 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. #ifdef WIN32
  17. #pragma warning (disable : 4786)
  18. #endif
  19. #ifndef WIN32
  20. #ifndef ADDON_DIR
  21. #include "config.h"
  22. #endif
  23. #endif
  24. #include "JackGraphManager.h"
  25. #include "JackInternalClient.h"
  26. #include "JackEngine.h"
  27. #include "JackServer.h"
  28. #include "JackEngineControl.h"
  29. #include "JackClientControl.h"
  30. #include "JackInternalClientChannel.h"
  31. #include "JackTools.h"
  32. #include <assert.h>
  33. namespace Jack
  34. {
  35. JackGraphManager* JackInternalClient::fGraphManager = NULL;
  36. JackEngineControl* JackInternalClient::fEngineControl = NULL;
  37. // Used for external C API (JackAPI.cpp)
  38. JackGraphManager* GetGraphManager()
  39. {
  40. return JackServer::fInstance->GetGraphManager();
  41. }
  42. JackEngineControl* GetEngineControl()
  43. {
  44. return JackServer::fInstance->GetEngineControl();
  45. }
  46. JackSynchro** GetSynchroTable()
  47. {
  48. return JackServer::fInstance->GetSynchroTable();
  49. }
  50. JackInternalClient::JackInternalClient(JackServer* server, JackSynchro** table): JackClient(table)
  51. {
  52. fClientControl = new JackClientControl();
  53. fChannel = new JackInternalClientChannel(server);
  54. }
  55. JackInternalClient::~JackInternalClient()
  56. {
  57. delete fClientControl;
  58. delete fChannel;
  59. }
  60. int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
  61. {
  62. int result;
  63. char name_res[JACK_CLIENT_NAME_SIZE + 1];
  64. jack_log("JackInternalClient::Open name = %s", name);
  65. snprintf(fServerName, sizeof(fServerName), server_name);
  66. fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result);
  67. if (result < 0) {
  68. int status1 = *status;
  69. if (status1 & JackVersionError)
  70. jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION);
  71. else
  72. jack_error("Client name = %s conflits with another running client", name);
  73. goto error;
  74. }
  75. strcpy(fClientControl->fName, name_res);
  76. // Require new client
  77. fChannel->ClientOpen(name_res, &fClientControl->fRefNum, &fEngineControl, &fGraphManager, this, &result);
  78. if (result < 0) {
  79. jack_error("Cannot open client name = %s", name_res);
  80. goto error;
  81. }
  82. SetupDriverSync(false);
  83. return 0;
  84. error:
  85. fChannel->Stop();
  86. fChannel->Close();
  87. return -1;
  88. }
  89. JackGraphManager* JackInternalClient::GetGraphManager() const
  90. {
  91. assert(fGraphManager);
  92. return fGraphManager;
  93. }
  94. JackEngineControl* JackInternalClient::GetEngineControl() const
  95. {
  96. assert(fEngineControl);
  97. return fEngineControl;
  98. }
  99. JackClientControl* JackInternalClient::GetClientControl() const
  100. {
  101. return fClientControl;
  102. }
  103. JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackSynchro** table, const char* so_name, const char* object_data)
  104. : JackInternalClient(server, table)
  105. {
  106. char path_to_so[PATH_MAX + 1];
  107. snprintf(path_to_so, sizeof(path_to_so), ADDON_DIR "/%s.so", so_name);
  108. snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data);
  109. fHandle = LoadJackModule(path_to_so);
  110. jack_log("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so);
  111. if (fHandle == 0) {
  112. PrintLoadError(so_name);
  113. throw - 1;
  114. }
  115. fInitialize = (InitializeCallback)GetJackProc(fHandle, "jack_initialize");
  116. if (!fInitialize) {
  117. UnloadJackModule(fHandle);
  118. jack_error("symbol jack_initialize cannot be found in %s", so_name);
  119. throw - 1;
  120. }
  121. fFinish = (FinishCallback)GetJackProc(fHandle, "jack_finish");
  122. if (!fFinish) {
  123. UnloadJackModule(fHandle);
  124. jack_error("symbol jack_finish cannot be found in %s", so_name);
  125. throw - 1;
  126. }
  127. }
  128. JackLoadableInternalClient::~JackLoadableInternalClient()
  129. {
  130. if (fFinish)
  131. fFinish(fProcessArg);
  132. UnloadJackModule(fHandle);
  133. }
  134. int JackLoadableInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
  135. {
  136. int res = -1;
  137. if (JackInternalClient::Open(server_name, name, options, status) == 0) {
  138. if (fInitialize((jack_client_t*)this, fObjectData) == 0) {
  139. res = 0;
  140. } else {
  141. JackInternalClient::Close();
  142. fFinish = NULL;
  143. }
  144. }
  145. return res;
  146. }
  147. } // end of namespace