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.

174 lines
5.0KB

  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. #include "JackGraphManager.h"
  20. #include "JackInternalClient.h"
  21. #include "JackEngine.h"
  22. #include "JackServer.h"
  23. #include "JackEngineControl.h"
  24. #include "JackClientControl.h"
  25. #include "JackInternalClientChannel.h"
  26. #include <assert.h>
  27. namespace Jack
  28. {
  29. JackGraphManager* JackInternalClient::fGraphManager = NULL;
  30. JackEngineControl* JackInternalClient::fEngineControl = NULL;
  31. // Used for external C API (JackAPI.cpp)
  32. JackGraphManager* GetGraphManager()
  33. {
  34. return JackServer::fInstance->GetGraphManager();
  35. }
  36. JackEngineControl* GetEngineControl()
  37. {
  38. return JackServer::fInstance->GetEngineControl();
  39. }
  40. JackSynchro** GetSynchroTable()
  41. {
  42. return JackServer::fInstance->GetSynchroTable();
  43. }
  44. JackInternalClient::JackInternalClient(JackServer* server, JackSynchro** table): JackClient(table)
  45. {
  46. fClientControl = new JackClientControl();
  47. /*
  48. TODO: here we use a "direct access" to server internal, which is not safe if library clients access the server using
  49. the "command thread" at the same time. So using the "command thread" also for internal clients would be safer.
  50. We may want to keep the "direct access" to server internal mode for "server embeded in client process" kind of use.
  51. */
  52. fChannel = new JackInternalClientChannel(server);
  53. }
  54. JackInternalClient::~JackInternalClient()
  55. {
  56. delete fClientControl;
  57. delete fChannel;
  58. }
  59. int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
  60. {
  61. int result;
  62. char name_res[JACK_CLIENT_NAME_SIZE];
  63. jack_log("JackInternalClient::Open name = %s", name);
  64. snprintf(fServerName, sizeof(fServerName), server_name);
  65. fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result);
  66. if (result < 0) {
  67. int status1 = *status;
  68. if (status1 & JackVersionError)
  69. jack_error("JACK protocol mismatch %d", JACK_PROTOCOL_VERSION);
  70. else
  71. jack_error("Client name = %s conflits with another running client", name);
  72. goto error;
  73. }
  74. strcpy(fClientControl->fName, name_res);
  75. // Require new client
  76. fChannel->ClientOpen(name_res, &fClientControl->fRefNum, &fEngineControl, &fGraphManager, this, &result);
  77. if (result < 0) {
  78. jack_error("Cannot open client name = %s", name_res);
  79. goto error;
  80. }
  81. SetupDriverSync(false);
  82. return 0;
  83. error:
  84. fChannel->Stop();
  85. fChannel->Close();
  86. return -1;
  87. }
  88. JackGraphManager* JackInternalClient::GetGraphManager() const
  89. {
  90. assert(fGraphManager);
  91. return fGraphManager;
  92. }
  93. JackEngineControl* JackInternalClient::GetEngineControl() const
  94. {
  95. assert(fEngineControl);
  96. return fEngineControl;
  97. }
  98. JackClientControl* JackInternalClient::GetClientControl() const
  99. {
  100. return fClientControl;
  101. }
  102. JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackSynchro** table, const char* so_name, const char* object_data)
  103. : JackInternalClient(server, table)
  104. {
  105. char path_to_so[PATH_MAX + 1];
  106. //snprintf(path_to_so, sizeof(path_to_so), ADDON_DIR "/%s.so", so_name);
  107. snprintf(path_to_so, sizeof(path_to_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. jack_error("error loading %s", 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 = JackInternalClient::Open(server_name, name, options, status);
  137. if (res == 0)
  138. fInitialize((jack_client_t*)this, fObjectData);
  139. return res;
  140. }
  141. } // end of namespace