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);
55 JackMetadata* GetMetadata()
57 if (JackLibGlobals::fGlobals) {
58 return JackLibGlobals::fGlobals->fMetadata;
75 void JackLibClient::ShutDown(jack_status_t code,
const char* message)
78 JackGlobals::fServerRunning =
false;
79 JackClient::ShutDown(code, message);
84 jack_log(
"JackLibClient::JackLibClient table = %x", table);
88 JackLibClient::~JackLibClient()
90 jack_log(
"JackLibClient::~JackLibClient");
94 int JackLibClient::Open(
const char* server_name,
const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status)
96 int shared_engine, shared_client, shared_graph, result;
98 jack_log(
"JackLibClient::Open name = %s", name);
100 if (strlen(name) >= JACK_CLIENT_NAME_SIZE) {
101 jack_error(
"\"%s\" is too long to be used as a JACK client name.\n"
102 "Please use %lu characters or less",
104 JACK_CLIENT_NAME_SIZE - 1);
108 strncpy(fServerName, server_name,
sizeof(fServerName));
111 char name_res[JACK_CLIENT_NAME_SIZE+1];
112 if (
fChannel->Open(server_name, name, uuid, name_res,
this, options, status) < 0) {
124 fChannel->ClientOpen(name_res, JackTools::GetPID(), uuid, &shared_engine, &shared_client, &shared_graph, &result);
126 jack_error(
"Cannot open %s client", name_res);
132 JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName);
133 JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName);
134 fClientControl.SetShmIndex(shared_client, fServerName);
135 JackGlobals::fVerbose = GetEngineControl()->fVerbose;
137 jack_error(
"Map shared memory segments exception");
144 assert(JackGlobals::fSynchroMutex);
145 JackGlobals::fSynchroMutex->Lock();
146 res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName);
147 JackGlobals::fSynchroMutex->Unlock();
149 jack_error(
"Cannot ConnectSemaphore %s client", name_res);
153 JackGlobals::fClientTable[GetClientControl()->fRefNum] =
this;
154 SetClockSource(GetEngineControl()->fClockSource);
155 jack_log(
"JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum);
170 assert(JackGlobals::fSynchroMutex);
171 JackGlobals::fSynchroMutex->Lock();
177 jack_log(
"JackClient::AddClient name = %s, ref = %ld ", name, refnum);
179 res = fSynchroTable[refnum].Connect(name, fServerName) ? 0 : -1;
183 jack_log(
"JackClient::RemoveClient name = %s, ref = %ld ", name, refnum);
184 if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0) {
185 res = fSynchroTable[refnum].Disconnect() ? 0 : -1;
190 JackGlobals::fSynchroMutex->Unlock();
196 assert(JackLibGlobals::fGlobals->fGraphManager);
197 return JackLibGlobals::fGlobals->fGraphManager;
200 JackEngineControl* JackLibClient::GetEngineControl()
const
202 assert(JackLibGlobals::fGlobals->fEngineControl);
203 return JackLibGlobals::fGlobals->fEngineControl;
206 JackClientControl* JackLibClient::GetClientControl()
const
208 return fClientControl;
Inter process synchronization using POSIX semaphore.
SERVER_EXPORT void jack_error(const char *fmt,...)
Graph manager: contains the connection manager and the port array.
void SetupDriverSync(bool freewheel)
JackClientChannel using sockets.
JackLibClient(JackSynchro *table)
int ClientNotifyImp(int refnum, const char *name, int notify, int sync, const char *message, int value1, int value2)
Notification received from the server.
detail::JackClientChannelInterface * fChannel
SERVER_EXPORT void jack_log(const char *fmt,...)
The base class for clients: share part of the implementation for JackInternalClient and JackLibClient...