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();
 JackClientChannel for server internal clients.
Inter process synchronization using POSIX 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...