21 #include "JackSystemDeps.h"
22 #include "JackServerGlobals.h"
23 #include "JackGraphManager.h"
24 #include "JackConstants.h"
25 #include "JackInternalClient.h"
26 #include "JackLockedEngine.h"
27 #include "JackServer.h"
28 #include "JackEngineControl.h"
29 #include "JackClientControl.h"
30 #include "JackInternalClientChannel.h"
31 #include "JackTools.h"
37 JackGraphManager* JackInternalClient::fGraphManager = NULL;
41 SERVER_EXPORT JackGraphManager* GetGraphManager()
43 return JackServerGlobals::fInstance->GetGraphManager();
46 SERVER_EXPORT JackEngineControl* GetEngineControl()
48 return JackServerGlobals::fInstance->GetEngineControl();
51 SERVER_EXPORT JackSynchro* GetSynchroTable()
53 return JackServerGlobals::fInstance->GetSynchroTable();
61 JackInternalClient::~JackInternalClient()
66 int JackInternalClient::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
69 jack_log(
"JackInternalClient::Open name = %s", name);
71 if (strlen(name) >= JACK_CLIENT_NAME_SIZE) {
72 jack_error(
"\"%s\" is too long to be used as a JACK client name.\n"
73 "Please use %lu characters or less",
75 JACK_CLIENT_NAME_SIZE - 1);
79 strncpy(fServerName, server_name,
sizeof(fServerName));
82 char name_res[JACK_CLIENT_NAME_SIZE + 1];
83 fChannel->ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (
int)options, (
int*)status, &result,
false);
85 int status1 = *status;
86 if (status1 & JackVersionError) {
87 jack_error(
"JACK protocol mismatch %d", JACK_PROTOCOL_VERSION);
89 jack_error(
"Client name = %s conflits with another running client", name);
94 strcpy(fClientControl.fName, name_res);
99 jack_error(
"Cannot open client name = %s", name_res);
104 JackGlobals::fClientTable[fClientControl.fRefNum] =
this;
105 JackGlobals::fServerRunning =
true;
106 jack_log(
"JackInternalClient::Open name = %s refnum = %ld", name_res, fClientControl.fRefNum);
114 void JackInternalClient::ShutDown(jack_status_t code,
const char* message)
116 jack_log(
"JackInternalClient::ShutDown");
117 JackClient::ShutDown(code, message);
120 JackGraphManager* JackInternalClient::GetGraphManager()
const
122 assert(fGraphManager);
123 return fGraphManager;
126 JackEngineControl* JackInternalClient::GetEngineControl()
const
132 JackClientControl* JackInternalClient::GetClientControl()
const
134 return const_cast<JackClientControl*>(&fClientControl);
139 char path_to_so[JACK_PATH_MAX + 1];
140 BuildClientPath(path_to_so,
sizeof(path_to_so), so_name);
142 fHandle = LoadJackModule(path_to_so);
143 jack_log(
"JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so);
145 if (fHandle == NULL) {
146 PrintLoadError(so_name);
150 fFinish = (FinishCallback)GetJackProc(fHandle,
"jack_finish");
151 if (fFinish == NULL) {
152 UnloadJackModule(fHandle);
153 jack_error(
"symbol jack_finish cannot be found in %s", so_name);
157 fDescriptor = (JackDriverDescFunction)GetJackProc(fHandle,
"jack_get_descriptor");
158 if (fDescriptor == NULL) {
159 jack_info(
"No jack_get_descriptor entry-point for %s", so_name);
170 fInitialize = (InitializeCallback)GetJackProc(fHandle,
"jack_initialize");
171 if (fInitialize == NULL) {
172 UnloadJackModule(fHandle);
173 jack_error(
"symbol jack_initialize cannot be found in %s", so_name);
186 fInitialize = (InternalInitializeCallback)GetJackProc(fHandle,
"jack_internal_initialize");
187 if (fInitialize == NULL) {
188 UnloadJackModule(fHandle);
189 jack_error(
"symbol jack_internal_initialize cannot be found in %s", so_name);
196 JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, JackSynchro* table,
const char* object_data)
197 : JackLoadableInternalClient(server, table)
199 strncpy(fObjectData, object_data, JACK_LOAD_INIT_LIMIT);
202 JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, JackSynchro* table,
const JSList* parameters)
203 : JackLoadableInternalClient(server, table)
205 fParameters = parameters;
208 JackLoadableInternalClient::~JackLoadableInternalClient()
210 if (fFinish != NULL) {
211 fFinish(fProcessArg);
213 if (fHandle != NULL) {
214 UnloadJackModule(fHandle);
218 int JackLoadableInternalClient1::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
222 if (JackInternalClient::Open(server_name, name, uuid, options, status) == 0) {
223 if (fInitialize((jack_client_t*)
this, fObjectData) == 0) {
226 JackInternalClient::Close();
234 int JackLoadableInternalClient2::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
238 if (JackInternalClient::Open(server_name, name, uuid, options, status) == 0) {
239 if (fInitialize((jack_client_t*)
this, fParameters) == 0) {
242 JackInternalClient::Close();