20 #include "JackLibClient.h"
22 #include "JackLibGlobals.h"
23 #include "JackGlobals.h"
24 #include "JackPlatformPlug.h"
25 #include "JackTools.h"
31 JackGraphManager* GetGraphManager()
33 if (JackLibGlobals::fGlobals) {
34 return JackLibGlobals::fGlobals->fGraphManager;
40 JackEngineControl* GetEngineControl()
42 if (JackLibGlobals::fGlobals) {
43 return JackLibGlobals::fGlobals->fEngineControl;
49 JackSynchro* GetSynchroTable()
51 return (JackLibGlobals::fGlobals ? JackLibGlobals::fGlobals->fSynchroTable : 0);
65 void JackLibClient::ShutDown(jack_status_t code,
const char* message)
68 JackGlobals::fServerRunning =
false;
69 JackClient::ShutDown(code, message);
74 jack_log(
"JackLibClient::JackLibClient table = %x", table);
78 JackLibClient::~JackLibClient()
80 jack_log(
"JackLibClient::~JackLibClient");
84 int JackLibClient::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
86 int shared_engine, shared_client, shared_graph, result;
88 jack_log(
"JackLibClient::Open name = %s", name);
90 if (strlen(name) >= JACK_CLIENT_NAME_SIZE) {
91 jack_error(
"\"%s\" is too long to be used as a JACK client name.\n"
92 "Please use %lu characters or less",
94 JACK_CLIENT_NAME_SIZE - 1);
98 strncpy(fServerName, server_name,
sizeof(fServerName));
101 char name_res[JACK_CLIENT_NAME_SIZE + 1];
102 if (
fChannel->Open(server_name, name, uuid, name_res,
this, options, status) < 0) {
114 fChannel->ClientOpen(name_res, JackTools::GetPID(), uuid, &shared_engine, &shared_client, &shared_graph, &result);
116 jack_error(
"Cannot open %s client", name_res);
122 JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName);
123 JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName);
124 fClientControl.SetShmIndex(shared_client, fServerName);
125 JackGlobals::fVerbose = GetEngineControl()->fVerbose;
127 jack_error(
"Map shared memory segments exception");
134 assert(JackGlobals::fSynchroMutex);
135 JackGlobals::fSynchroMutex->Lock();
136 res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName);
137 JackGlobals::fSynchroMutex->Unlock();
139 jack_error(
"Cannot ConnectSemaphore %s client", name_res);
143 JackGlobals::fClientTable[GetClientControl()->fRefNum] =
this;
144 SetClockSource(GetEngineControl()->fClockSource);
145 jack_log(
"JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum);
160 assert(JackGlobals::fSynchroMutex);
161 JackGlobals::fSynchroMutex->Lock();
167 jack_log(
"JackClient::AddClient name = %s, ref = %ld ", name, refnum);
169 res = fSynchroTable[refnum].Connect(name, fServerName) ? 0 : -1;
173 jack_log(
"JackClient::RemoveClient name = %s, ref = %ld ", name, refnum);
174 if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0) {
175 res = fSynchroTable[refnum].Disconnect() ? 0 : -1;
180 JackGlobals::fSynchroMutex->Unlock();
186 assert(JackLibGlobals::fGlobals->fGraphManager);
187 return JackLibGlobals::fGlobals->fGraphManager;
190 JackEngineControl* JackLibClient::GetEngineControl()
const
192 assert(JackLibGlobals::fGlobals->fEngineControl);
193 return JackLibGlobals::fGlobals->fEngineControl;
196 JackClientControl* JackLibClient::GetClientControl()
const
198 return fClientControl;