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);
105 void JackInternalClient::ShutDown()
107 jack_log(
"JackInternalClient::ShutDown");
108 JackClient::ShutDown();
111 JackGraphManager* JackInternalClient::GetGraphManager()
const
113 assert(fGraphManager);
114 return fGraphManager;
117 JackEngineControl* JackInternalClient::GetEngineControl()
const
123 JackClientControl* JackInternalClient::GetClientControl()
const
125 return const_cast<JackClientControl*
>(&fClientControl);
130 char path_to_so[JACK_PATH_MAX + 1];
131 BuildClientPath(path_to_so,
sizeof(path_to_so), so_name);
133 fHandle = LoadJackModule(path_to_so);
134 jack_log(
"JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so);
136 if (fHandle == NULL) {
137 PrintLoadError(so_name);
141 fFinish = (FinishCallback)GetJackProc(fHandle,
"jack_finish");
142 if (fFinish == NULL) {
143 UnloadJackModule(fHandle);
144 jack_error(
"symbol jack_finish cannot be found in %s", so_name);
148 fDescriptor = (JackDriverDescFunction)GetJackProc(fHandle,
"jack_get_descriptor");
149 if (fDescriptor == NULL) {
150 jack_info(
"No jack_get_descriptor entry-point for %s", so_name);
161 fInitialize = (InitializeCallback)GetJackProc(fHandle,
"jack_initialize");
162 if (fInitialize == NULL) {
163 UnloadJackModule(fHandle);
164 jack_error(
"symbol jack_initialize cannot be found in %s", so_name);
177 fInitialize = (InternalInitializeCallback)GetJackProc(fHandle,
"jack_internal_initialize");
178 if (fInitialize == NULL) {
179 UnloadJackModule(fHandle);
180 jack_error(
"symbol jack_internal_initialize cannot be found in %s", so_name);
187 JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, JackSynchro* table,
const char* object_data)
188 : JackLoadableInternalClient(server, table)
190 strncpy(fObjectData, object_data, JACK_LOAD_INIT_LIMIT);
193 JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, JackSynchro* table,
const JSList* parameters)
194 : JackLoadableInternalClient(server, table)
196 fParameters = parameters;
199 JackLoadableInternalClient::~JackLoadableInternalClient()
201 if (fFinish != NULL) {
202 fFinish(fProcessArg);
204 if (fHandle != NULL) {
205 UnloadJackModule(fHandle);
209 int JackLoadableInternalClient1::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
213 if (JackInternalClient::Open(server_name, name, uuid, options, status) == 0) {
214 if (fInitialize((jack_client_t*)
this, fObjectData) == 0) {
217 JackInternalClient::Close();
225 int JackLoadableInternalClient2::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
229 if (JackInternalClient::Open(server_name, name, uuid, options, status) == 0) {
230 if (fInitialize((jack_client_t*)
this, fParameters) == 0) {
233 JackInternalClient::Close();
JackClientChannel for server internal clients.
Inter process synchronization using using Mach semaphore.
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_info(const char *fmt,...)
void SetupDriverSync(bool freewheel)
bool Init()
Called once when the thread starts.
JackInternalClient(JackServer *server, JackSynchro *table)
detail::JackClientChannelInterface * fChannel
static JackEngineControl * fEngineControl
SERVER_EXPORT void jack_log(const char *fmt,...)
The base class for clients: share part of the implementation for JackInternalClient and JackLibClient...