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 char name_res[JACK_CLIENT_NAME_SIZE + 1];
70 jack_log(
"JackInternalClient::Open name = %s", name);
72 strncpy(fServerName, server_name,
sizeof(fServerName));
74 fChannel->ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (
int)options, (
int*)status, &result,
false);
76 int status1 = *status;
77 if (status1 & JackVersionError) {
78 jack_error(
"JACK protocol mismatch %d", JACK_PROTOCOL_VERSION);
80 jack_error(
"Client name = %s conflits with another running client", name);
85 strcpy(fClientControl.fName, name_res);
90 jack_error(
"Cannot open client name = %s", name_res);
95 JackGlobals::fClientTable[fClientControl.fRefNum] =
this;
96 JackGlobals::fServerRunning =
true;
97 jack_log(
"JackInternalClient::Open name = %s refnum = %ld", name_res, fClientControl.fRefNum);
106 JackGraphManager* JackInternalClient::GetGraphManager()
const
108 assert(fGraphManager);
109 return fGraphManager;
112 JackEngineControl* JackInternalClient::GetEngineControl()
const
118 JackClientControl* JackInternalClient::GetClientControl()
const
120 return const_cast<JackClientControl*
>(&fClientControl);
125 char path_to_so[JACK_PATH_MAX + 1];
126 BuildClientPath(path_to_so,
sizeof(path_to_so), so_name);
128 fHandle = LoadJackModule(path_to_so);
129 jack_log(
"JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so);
131 if (fHandle == NULL) {
132 PrintLoadError(so_name);
136 fFinish = (FinishCallback)GetJackProc(fHandle,
"jack_finish");
137 if (fFinish == NULL) {
138 UnloadJackModule(fHandle);
139 jack_error(
"symbol jack_finish cannot be found in %s", so_name);
143 fDescriptor = (JackDriverDescFunction)GetJackProc(fHandle,
"jack_get_descriptor");
144 if (fDescriptor == NULL) {
145 jack_info(
"No jack_get_descriptor entry-point for %s", so_name);
156 fInitialize = (InitializeCallback)GetJackProc(fHandle,
"jack_initialize");
157 if (fInitialize == NULL) {
158 UnloadJackModule(fHandle);
159 jack_error(
"symbol jack_initialize cannot be found in %s", so_name);
172 fInitialize = (InternalInitializeCallback)GetJackProc(fHandle,
"jack_internal_initialize");
173 if (fInitialize == NULL) {
174 UnloadJackModule(fHandle);
175 jack_error(
"symbol jack_internal_initialize cannot be found in %s", so_name);
182 JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, JackSynchro* table,
const char* object_data)
183 : JackLoadableInternalClient(server, table)
185 strncpy(fObjectData, object_data, JACK_LOAD_INIT_LIMIT);
188 JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, JackSynchro* table,
const JSList* parameters)
189 : JackLoadableInternalClient(server, table)
191 fParameters = parameters;
194 JackLoadableInternalClient::~JackLoadableInternalClient()
197 fFinish(fProcessArg);
199 UnloadJackModule(fHandle);
202 int JackLoadableInternalClient1::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
206 if (JackInternalClient::Open(server_name, name, uuid, options, status) == 0) {
207 if (fInitialize((jack_client_t*)
this, fObjectData) == 0) {
210 JackInternalClient::Close();
218 int JackLoadableInternalClient2::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, fParameters) == 0) {
226 JackInternalClient::Close();