Browse Source

add uuid parameter to jack_client_open...

tags/1.9.7
Torben Hohn 16 years ago
parent
commit
5e7a792f42
27 changed files with 190 additions and 65 deletions
  1. +1
    -1
      common/JackChannel.h
  2. +1
    -1
      common/JackClient.h
  3. +6
    -6
      common/JackClientControl.h
  4. +1
    -1
      common/JackControlAPI.cpp
  5. +2
    -2
      common/JackDebugClient.cpp
  6. +1
    -1
      common/JackDebugClient.h
  7. +50
    -5
      common/JackEngine.cpp
  8. +1
    -1
      common/JackEngine.h
  9. +2
    -2
      common/JackExternalClient.cpp
  10. +1
    -1
      common/JackExternalClient.h
  11. +5
    -5
      common/JackInternalClient.cpp
  12. +3
    -3
      common/JackInternalClient.h
  13. +2
    -2
      common/JackInternalClientChannel.h
  14. +1
    -1
      common/JackLibAPI.cpp
  15. +2
    -2
      common/JackLibClient.cpp
  16. +1
    -1
      common/JackLibClient.h
  17. +2
    -2
      common/JackLockedEngine.h
  18. +12
    -3
      common/JackRequest.h
  19. +6
    -6
      common/JackServer.cpp
  20. +3
    -3
      common/JackServer.h
  21. +1
    -1
      common/JackServerAPI.cpp
  22. +4
    -0
      common/varargs.h
  23. +2
    -1
      example-clients/session_notify.c
  24. +27
    -4
      posix/JackSocketClientChannel.cpp
  25. +10
    -5
      posix/JackSocketClientChannel.h
  26. +42
    -4
      posix/JackSocketServerChannel.cpp
  27. +1
    -1
      posix/JackSocketServerChannel.h

+ 1
- 1
common/JackChannel.h View File

@@ -76,7 +76,7 @@ class JackClientChannelInterface


virtual void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result) virtual void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result)
{} {}
virtual void ClientOpen(const char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
virtual void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
{} {}
virtual void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result) virtual void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result)
{} {}


+ 1
- 1
common/JackClient.h View File

@@ -123,7 +123,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface
JackClient(JackSynchro* table); JackClient(JackSynchro* table);
virtual ~JackClient(); virtual ~JackClient();


virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) = 0;
virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid) = 0;
virtual int Close(); virtual int Close();


virtual JackGraphManager* GetGraphManager() const = 0; virtual JackGraphManager* GetGraphManager() const = 0;


+ 6
- 6
common/JackClientControl.h View File

@@ -50,22 +50,22 @@ struct JackClientControl : public JackShmMemAble
char fSessionCommand[256 + 1]; char fSessionCommand[256 + 1];
jack_session_flags_t fSessionFlags; jack_session_flags_t fSessionFlags;


JackClientControl(const char* name, int pid, int refnum)
JackClientControl(const char* name, int pid, int refnum, int uuid)
{ {
Init(name, pid, refnum);
Init(name, pid, refnum, uuid);
} }


JackClientControl(const char* name) JackClientControl(const char* name)
{ {
Init(name, 0, -1);
Init(name, 0, -1, -1);
} }


JackClientControl() JackClientControl()
{ {
Init("", 0, -1);
Init("", 0, -1, -1);
} }


void Init(const char* name, int pid, int refnum)
void Init(const char* name, int pid, int refnum, int uuid)
{ {
strcpy(fName, name); strcpy(fName, name);
for (int i = 0; i < kMaxNotification; i++) for (int i = 0; i < kMaxNotification; i++)
@@ -84,7 +84,7 @@ struct JackClientControl : public JackShmMemAble
fTransportTimebase = false; fTransportTimebase = false;
fActive = false; fActive = false;


fSessionID = 0;
fSessionID = uuid;
} }


} POST_PACKED_STRUCTURE; } POST_PACKED_STRUCTURE;


+ 1
- 1
common/JackControlAPI.cpp View File

@@ -1179,7 +1179,7 @@ EXPORT bool jackctl_server_load_internal(
{ {
int status; int status;
if (server_ptr->engine != NULL) { if (server_ptr->engine != NULL) {
server_ptr->engine->InternalClientLoad(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, &status);
server_ptr->engine->InternalClientLoad(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, &status, -1);
return (internal->refnum > 0); return (internal->refnum > 0);
} else { } else {
return false; return false;


+ 2
- 2
common/JackDebugClient.cpp View File

@@ -78,9 +78,9 @@ JackDebugClient::~JackDebugClient()
delete fClient; delete fClient;
} }


int JackDebugClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
int JackDebugClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid)
{ {
int res = fClient->Open(server_name, name, options, status);
int res = fClient->Open(server_name, name, options, status, uuid);
char provstr[256]; char provstr[256];
char buffer[256]; char buffer[256];
time_t curtime; time_t curtime;


+ 1
- 1
common/JackDebugClient.h View File

@@ -68,7 +68,7 @@ class JackDebugClient : public JackClient
JackDebugClient(JackClient* fTheClient); JackDebugClient(JackClient* fTheClient);
virtual ~JackDebugClient(); virtual ~JackDebugClient();


virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status);
virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid);
int Close(); int Close();


virtual JackGraphManager* GetGraphManager() const; virtual JackGraphManager* GetGraphManager() const;


+ 50
- 5
common/JackEngine.cpp View File

@@ -460,9 +460,32 @@ bool JackEngine::ClientCheckName(const char* name)
return true; return true;
} }


for (std::map<int,std::string>::iterator i=fReservationMap.begin(); i!=fReservationMap.end(); i++) {
if (i->second == name)
return true;
}

return false; return false;
} }


int JackEngine::GetNewUUID()
{
return fMaxUUID++;
}

void JackEngine::EnsureUUID(int uuid)
{
if (uuid > fMaxUUID)
fMaxUUID = uuid+1;

for (int i = 0; i < CLIENT_NUM; i++) {
JackClientInterface* client = fClientTable[i];
if (client && (client->GetClientControl()->fSessionID==uuid)) {
client->GetClientControl()->fSessionID = GetNewUUID();
}
}
}

int JackEngine::GetClientPID(const char* name) int JackEngine::GetClientPID(const char* name)
{ {
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
@@ -486,9 +509,26 @@ int JackEngine::GetClientRefNum(const char* name)
} }


// Used for external clients // Used for external clients
int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager)
int JackEngine::ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager)
{ {
jack_log("JackEngine::ClientExternalOpen: name = %s ", name);
char real_name[JACK_CLIENT_NAME_SIZE+1];

if (uuid < 0) {
uuid = GetNewUUID();
strncpy( real_name, name, JACK_CLIENT_NAME_SIZE );
} else {
std::map<int,std::string>::iterator res = fReservationMap.find(uuid);
if (res != fReservationMap.end()) {
strncpy( real_name, res->second.c_str(), JACK_CLIENT_NAME_SIZE );
fReservationMap.erase(uuid);
} else {
strncpy( real_name, name, JACK_CLIENT_NAME_SIZE );
}

EnsureUUID(uuid);
}

jack_log("JackEngine::ClientExternalOpen: name = %s ", real_name);


int refnum = AllocateRefnum(); int refnum = AllocateRefnum();
if (refnum < 0) { if (refnum < 0) {
@@ -498,12 +538,17 @@ int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* sha


JackExternalClient* client = new JackExternalClient(); JackExternalClient* client = new JackExternalClient();


if (!fSynchroTable[refnum].Allocate(name, fEngineControl->fServerName, 0)) {
if (!fSynchroTable[refnum].Allocate(real_name, fEngineControl->fServerName, 0)) {
jack_error("Cannot allocate synchro"); jack_error("Cannot allocate synchro");
goto error; goto error;
} }


if (client->Open(name, pid, refnum, shared_client) < 0) {
if (uuid < 0)
uuid = GetNewUUID();
else
EnsureUUID(uuid);

if (client->Open(real_name, pid, refnum, uuid, shared_client) < 0) {
jack_error("Cannot open client"); jack_error("Cannot open client");
goto error; goto error;
} }
@@ -516,7 +561,7 @@ int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* sha


fClientTable[refnum] = client; fClientTable[refnum] = client;


if (NotifyAddClient(client, name, refnum) < 0) {
if (NotifyAddClient(client, real_name, refnum) < 0) {
jack_error("Cannot notify add client"); jack_error("Cannot notify add client");
goto error; goto error;
} }


+ 1
- 1
common/JackEngine.h View File

@@ -97,7 +97,7 @@ class SERVER_EXPORT JackEngine : public JackLockAble
// Client management // Client management
int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status); int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status);
int ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager);
int ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager);
int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait); int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait);


int ClientExternalClose(int refnum); int ClientExternalClose(int refnum);


+ 2
- 2
common/JackExternalClient.cpp View File

@@ -41,7 +41,7 @@ int JackExternalClient::ClientNotify(int refnum, const char* name, int notify, i
return result; return result;
} }


int JackExternalClient::Open(const char* name, int pid, int refnum, int* shared_client)
int JackExternalClient::Open(const char* name, int pid, int refnum, int uuid, int* shared_client)
{ {
try { try {


@@ -53,7 +53,7 @@ int JackExternalClient::Open(const char* name, int pid, int refnum, int* shared_
// Use "placement new" to allocate object in shared memory // Use "placement new" to allocate object in shared memory
JackShmMemAble* shared_mem = static_cast<JackShmMemAble*>(JackShmMem::operator new(sizeof(JackClientControl))); JackShmMemAble* shared_mem = static_cast<JackShmMemAble*>(JackShmMem::operator new(sizeof(JackClientControl)));
shared_mem->Init(); shared_mem->Init();
fClientControl = new(shared_mem) JackClientControl(name, pid, refnum);
fClientControl = new(shared_mem) JackClientControl(name, pid, refnum, uuid);
if (!fClientControl) { if (!fClientControl) {
jack_error("Cannot allocate client shared memory segment"); jack_error("Cannot allocate client shared memory segment");


+ 1
- 1
common/JackExternalClient.h View File

@@ -46,7 +46,7 @@ class JackExternalClient : public JackClientInterface
JackExternalClient(); JackExternalClient();
virtual ~JackExternalClient(); virtual ~JackExternalClient();


int Open(const char* name, int pid, int refnum, int* shared_client);
int Open(const char* name, int pid, int refnum, int uuid, int* shared_client);
int Close(); int Close();


int ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2); int ClientNotify(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);


+ 5
- 5
common/JackInternalClient.cpp View File

@@ -63,7 +63,7 @@ JackInternalClient::~JackInternalClient()
delete fChannel; delete fChannel;
} }


int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid)
{ {
int result; int result;
char name_res[JACK_CLIENT_NAME_SIZE + 1]; char name_res[JACK_CLIENT_NAME_SIZE + 1];
@@ -198,11 +198,11 @@ JackLoadableInternalClient::~JackLoadableInternalClient()
UnloadJackModule(fHandle); UnloadJackModule(fHandle);
} }


int JackLoadableInternalClient1::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
int JackLoadableInternalClient1::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid)
{ {
int res = -1; int res = -1;
if (JackInternalClient::Open(server_name, name, options, status) == 0) {
if (JackInternalClient::Open(server_name, name, options, status, uuid) == 0) {
if (fInitialize((jack_client_t*)this, fObjectData) == 0) { if (fInitialize((jack_client_t*)this, fObjectData) == 0) {
res = 0; res = 0;
} else { } else {
@@ -214,11 +214,11 @@ int JackLoadableInternalClient1::Open(const char* server_name, const char* name,
return res; return res;
} }


int JackLoadableInternalClient2::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
int JackLoadableInternalClient2::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid)
{ {
int res = -1; int res = -1;
if (JackInternalClient::Open(server_name, name, options, status) == 0) {
if (JackInternalClient::Open(server_name, name, options, status, uuid) == 0) {
if (fInitialize((jack_client_t*)this, fParameters) == 0) { if (fInitialize((jack_client_t*)this, fParameters) == 0) {
res = 0; res = 0;
} else { } else {


+ 3
- 3
common/JackInternalClient.h View File

@@ -46,7 +46,7 @@ class JackInternalClient : public JackClient
JackInternalClient(JackServer* server, JackSynchro* table); JackInternalClient(JackServer* server, JackSynchro* table);
virtual ~JackInternalClient(); virtual ~JackInternalClient();


int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid);


JackGraphManager* GetGraphManager() const; JackGraphManager* GetGraphManager() const;
JackEngineControl* GetEngineControl() const; JackEngineControl* GetEngineControl() const;
@@ -100,7 +100,7 @@ class JackLoadableInternalClient1 : public JackLoadableInternalClient
{} {}


int Init(const char* so_name); int Init(const char* so_name);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid);


}; };


@@ -119,7 +119,7 @@ class JackLoadableInternalClient2 : public JackLoadableInternalClient
{} {}


int Init(const char* so_name); int Init(const char* so_name);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid);


}; };




+ 2
- 2
common/JackInternalClientChannel.h View File

@@ -137,9 +137,9 @@ class JackInternalClientChannel : public detail::JackClientChannelInterface
*result = fEngine->InternalClientHandle(client_name, status, int_ref); *result = fEngine->InternalClientHandle(client_name, status, int_ref);
} }


void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result)
void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result, int uuid)
{ {
*result = fServer->InternalClientLoad(client_name, so_name, objet_data, options, int_ref, status);
*result = fServer->InternalClientLoad(client_name, so_name, objet_data, options, int_ref, status, uuid);
} }


void InternalClientUnload(int refnum, int int_ref, int* status, int* result) void InternalClientUnload(int refnum, int int_ref, int* status, int* result)


+ 1
- 1
common/JackLibAPI.cpp View File

@@ -96,7 +96,7 @@ jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t optio
client = new JackLibClient(GetSynchroTable()); client = new JackLibClient(GetSynchroTable());
} }


int res = client->Open(va.server_name, client_name, options, status);
int res = client->Open(va.server_name, client_name, options, status, va.session_id);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackLibGlobals::Destroy(); // jack library destruction JackLibGlobals::Destroy(); // jack library destruction


+ 2
- 2
common/JackLibClient.cpp View File

@@ -67,7 +67,7 @@ JackLibClient::~JackLibClient()
delete fChannel; delete fChannel;
} }


int JackLibClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
int JackLibClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid)
{ {
int shared_engine, shared_client, shared_graph, result; int shared_engine, shared_client, shared_graph, result;
jack_log("JackLibClient::Open name = %s", name); jack_log("JackLibClient::Open name = %s", name);
@@ -88,7 +88,7 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_
} }


// Require new client // Require new client
fChannel->ClientOpen(name_res, JackTools::GetPID(), &shared_engine, &shared_client, &shared_graph, &result);
fChannel->ClientOpen(name_res, JackTools::GetPID(), uuid, &shared_engine, &shared_client, &shared_graph, &result);
if (result < 0) { if (result < 0) {
jack_error("Cannot open %s client", name_res); jack_error("Cannot open %s client", name_res);
goto error; goto error;


+ 1
- 1
common/JackLibClient.h View File

@@ -44,7 +44,7 @@ class JackLibClient : public JackClient
JackLibClient(JackSynchro* table); JackLibClient(JackSynchro* table);
virtual ~JackLibClient(); virtual ~JackLibClient();


int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status);
int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status, int uuid);


int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2); int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);




+ 2
- 2
common/JackLockedEngine.h View File

@@ -103,11 +103,11 @@ class SERVER_EXPORT JackLockedEngine
return fEngine.ClientCheck(name, name_res, protocol, options, status); return fEngine.ClientCheck(name, name_res, protocol, options, status);
CATCH_EXCEPTION_RETURN CATCH_EXCEPTION_RETURN
} }
int ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager)
int ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager)
{ {
TRY_CALL TRY_CALL
JackLock lock(&fEngine); JackLock lock(&fEngine);
return fEngine.ClientExternalOpen(name, pid, ref, shared_engine, shared_client, shared_graph_manager);
return fEngine.ClientExternalOpen(name, pid, uuid, ref, shared_engine, shared_client, shared_graph_manager);
CATCH_EXCEPTION_RETURN CATCH_EXCEPTION_RETURN
} }
int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait) int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait)


+ 12
- 3
common/JackRequest.h View File

@@ -205,19 +205,23 @@ struct JackClientOpenRequest : public JackRequest
{ {


int fPID; int fPID;
int fUUID;
char fName[JACK_CLIENT_NAME_SIZE + 1]; char fName[JACK_CLIENT_NAME_SIZE + 1];


JackClientOpenRequest() JackClientOpenRequest()
{} {}
JackClientOpenRequest(const char* name, int pid): JackRequest(JackRequest::kClientOpen)
JackClientOpenRequest(const char* name, int pid, int uuid): JackRequest(JackRequest::kClientOpen)
{ {
snprintf(fName, sizeof(fName), "%s", name); snprintf(fName, sizeof(fName), "%s", name);
fPID = pid; fPID = pid;
fUUID = uuid;
} }


int Read(JackChannelTransaction* trans) int Read(JackChannelTransaction* trans)
{ {
CheckRes(trans->Read(&fPID, sizeof(int))); CheckRes(trans->Read(&fPID, sizeof(int)));
CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1);
} }


@@ -225,6 +229,7 @@ struct JackClientOpenRequest : public JackRequest
{ {
CheckRes(JackRequest::Write(trans)); CheckRes(JackRequest::Write(trans));
CheckRes(trans->Write(&fPID, sizeof(int))); CheckRes(trans->Write(&fPID, sizeof(int)));
CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1);
} }
@@ -910,15 +915,17 @@ struct JackInternalClientLoadRequest : public JackRequest
char fDllName[MAX_PATH + 1]; char fDllName[MAX_PATH + 1];
char fLoadInitName[JACK_LOAD_INIT_LIMIT + 1]; char fLoadInitName[JACK_LOAD_INIT_LIMIT + 1];
int fOptions; int fOptions;
int fUUID;


JackInternalClientLoadRequest() JackInternalClientLoadRequest()
{} {}
JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options)
: JackRequest(JackRequest::kInternalClientLoad), fRefNum(refnum), fOptions(options)
JackInternalClientLoadRequest(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int uuid )
: JackRequest(JackRequest::kInternalClientLoad), fRefNum(refnum), fOptions(options), fUUID(uuid)
{ {
snprintf(fName, sizeof(fName), "%s", client_name); snprintf(fName, sizeof(fName), "%s", client_name);
snprintf(fDllName, sizeof(fDllName), "%s", so_name); snprintf(fDllName, sizeof(fDllName), "%s", so_name);
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data); snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data);
snprintf(fLoadInitName, sizeof(fLoadInitName), "%s", objet_data);
} }


int Read(JackChannelTransaction* trans) int Read(JackChannelTransaction* trans)
@@ -927,6 +934,7 @@ struct JackInternalClientLoadRequest : public JackRequest
CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1));
CheckRes(trans->Read(&fDllName, MAX_PATH + 1)); CheckRes(trans->Read(&fDllName, MAX_PATH + 1));
CheckRes(trans->Read(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); CheckRes(trans->Read(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1));
CheckRes(trans->Read(&fUUID, sizeof(int)));
return trans->Read(&fOptions, sizeof(int)); return trans->Read(&fOptions, sizeof(int));
} }


@@ -937,6 +945,7 @@ struct JackInternalClientLoadRequest : public JackRequest
CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1));
CheckRes(trans->Write(&fDllName, MAX_PATH + 1)); CheckRes(trans->Write(&fDllName, MAX_PATH + 1));
CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1)); CheckRes(trans->Write(&fLoadInitName, JACK_LOAD_INIT_LIMIT + 1));
CheckRes(trans->Write(&fUUID, sizeof(int)));
return trans->Write(&fOptions, sizeof(int)); return trans->Write(&fOptions, sizeof(int));
} }


+ 6
- 6
common/JackServer.cpp View File

@@ -136,25 +136,25 @@ int JackServer::Close()
return 0; return 0;
} }


int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status)
int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status, int uuid)
{ {
JackLoadableInternalClient* client = new JackLoadableInternalClient1(JackServerGlobals::fInstance, GetSynchroTable(), objet_data); JackLoadableInternalClient* client = new JackLoadableInternalClient1(JackServerGlobals::fInstance, GetSynchroTable(), objet_data);
assert(client); assert(client);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, status);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, status, uuid);
} }


int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status)
int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status, int uuid)
{ {
JackLoadableInternalClient* client = new JackLoadableInternalClient2(JackServerGlobals::fInstance, GetSynchroTable(), parameters); JackLoadableInternalClient* client = new JackLoadableInternalClient2(JackServerGlobals::fInstance, GetSynchroTable(), parameters);
assert(client); assert(client);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, status);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, status, uuid);
} }


int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status)
int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status, int uuid)
{ {
// Clear status // Clear status
*status = 0; *status = 0;
if ((client->Init(so_name) < 0) || (client->Open(JACK_DEFAULT_SERVER_NAME, client_name, (jack_options_t)options, (jack_status_t*)status) < 0)) {
if ((client->Init(so_name) < 0) || (client->Open(JACK_DEFAULT_SERVER_NAME, client_name, (jack_options_t)options, (jack_status_t*)status, uuid) < 0)) {
delete client; delete client;
int my_status1 = *status | JackFailure; int my_status1 = *status | JackFailure;
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;


+ 3
- 3
common/JackServer.h View File

@@ -58,7 +58,7 @@ class SERVER_EXPORT JackServer
JackSynchro fSynchroTable[CLIENT_NUM]; JackSynchro fSynchroTable[CLIENT_NUM];
bool fFreewheel; bool fFreewheel;
int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status);
int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, int* status, int uuid);


public: public:


@@ -77,8 +77,8 @@ class SERVER_EXPORT JackServer
// Command thread : API // Command thread : API
int SetBufferSize(jack_nframes_t buffer_size); int SetBufferSize(jack_nframes_t buffer_size);
int SetFreewheel(bool onoff); int SetFreewheel(bool onoff);
int InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status);
int InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status);
int InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* statu, int uuid);
int InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status, int uuid);
void ClientKill(int refnum); void ClientKill(int refnum);


// Transport management // Transport management


+ 1
- 1
common/JackServerAPI.cpp View File

@@ -90,7 +90,7 @@ jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t optio
client = new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable()); client = new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable());
} }


int res = client->Open(va.server_name, client_name, options, status);
int res = client->Open(va.server_name, client_name, options, status, va.session_id);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackServerGlobals::Destroy(); // jack server destruction JackServerGlobals::Destroy(); // jack server destruction


+ 4
- 0
common/varargs.h View File

@@ -35,6 +35,7 @@ extern "C"
char *server_name; /* server name */ char *server_name; /* server name */
char *load_name; /* load module name */ char *load_name; /* load module name */
char *load_init; /* initialization string */ char *load_init; /* initialization string */
int session_id; /* requested session_id */
} }
jack_varargs_t; jack_varargs_t;


@@ -50,6 +51,7 @@ extern "C"
{ {
memset (va, 0, sizeof(jack_varargs_t)); memset (va, 0, sizeof(jack_varargs_t));
va->server_name = (char*)jack_default_server_name(); va->server_name = (char*)jack_default_server_name();
va->session_id = -1;
} }


static inline void jack_varargs_parse (jack_options_t options, va_list ap, jack_varargs_t *va) static inline void jack_varargs_parse (jack_options_t options, va_list ap, jack_varargs_t *va)
@@ -66,6 +68,8 @@ extern "C"
va->load_name = va_arg(ap, char *); va->load_name = va_arg(ap, char *);
if ((options & JackLoadInit)) if ((options & JackLoadInit))
va->load_init = va_arg(ap, char *); va->load_init = va_arg(ap, char *);
if ((options & JackSessionID))
va->session_id = atoi( va_arg(ap, char *) );
} }


#ifdef __cplusplus #ifdef __cplusplus


+ 2
- 1
example-clients/session_notify.c View File

@@ -87,7 +87,8 @@ JSList *uuid_map = NULL;
void add_uuid_mapping( const char *uuid ) { void add_uuid_mapping( const char *uuid ) {
char *clientname = jack_get_client_name_by_uuid( client, uuid ); char *clientname = jack_get_client_name_by_uuid( client, uuid );
if( !clientname ) { if( !clientname ) {
printf( "error... cant find client for uuid" );
printf( "error... cant find client for uuid %s", uuid );

return; return;
} }




+ 27
- 4
posix/JackSocketClientChannel.cpp View File

@@ -151,9 +151,9 @@ void JackSocketClientChannel::ClientCheck(const char* name, char* name_res, int
strcpy(name_res, res.fName); strcpy(name_res, res.fName);
} }


void JackSocketClientChannel::ClientOpen(const char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
void JackSocketClientChannel::ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
{ {
JackClientOpenRequest req(name, pid);
JackClientOpenRequest req(name, pid, uuid);
JackClientOpenResult res; JackClientOpenResult res;
ServerSyncCall(&req, &res, result); ServerSyncCall(&req, &res, result);
*shared_engine = res.fSharedEngine; *shared_engine = res.fSharedEngine;
@@ -278,6 +278,29 @@ void JackSocketClientChannel::SessionReply(int refnum, int* result)
ServerSyncCall(&req, &res, result); ServerSyncCall(&req, &res, result);
} }


void JackSocketClientChannel::GetUUIDForClientName( int refnum, const char *client_name, char *uuid_res, int *result )
{
JackGetUUIDRequest req(client_name);
JackUUIDResult res;
ServerSyncCall(&req, &res, result);
strncpy( uuid_res, res.fUUID, 32 );
}

void JackSocketClientChannel::GetClientNameForUUID( int refnum, const char *uuid, char *name_res, int *result )
{
JackGetClientNameRequest req(uuid);
JackClientNameResult res;
ServerSyncCall(&req, &res, result);
strncpy( name_res, res.fName, JACK_CLIENT_NAME_SIZE );
}

void JackSocketClientChannel::ReserveClientName( int refnum, const char *client_name, const char *uuid, int *result )
{
JackReserveNameRequest req(refnum, client_name, uuid);
JackResult res;
ServerSyncCall(&req, &res, result);
}

void JackSocketClientChannel::ReleaseTimebase(int refnum, int* result) void JackSocketClientChannel::ReleaseTimebase(int refnum, int* result)
{ {
JackReleaseTimebaseRequest req(refnum); JackReleaseTimebaseRequest req(refnum);
@@ -309,9 +332,9 @@ void JackSocketClientChannel::InternalClientHandle(int refnum, const char* clien
*status = res.fStatus; *status = res.fStatus;
} }


void JackSocketClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result)
void JackSocketClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result, int uuid)
{ {
JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options);
JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options, uuid);
JackInternalClientLoadResult res; JackInternalClientLoadResult res;
ServerSyncCall(&req, &res, result); ServerSyncCall(&req, &res, result);
*int_ref = res.fIntRefNum; *int_ref = res.fIntRefNum;


+ 10
- 5
posix/JackSocketClientChannel.h View File

@@ -61,8 +61,8 @@ class JackSocketClientChannel : public detail::JackClientChannelInterface, publi
int ServerCheck(const char* server_name); int ServerCheck(const char* server_name);


void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result); void ClientCheck(const char* name, char* name_res, int protocol, int options, int* status, int* result);
void ClientOpen(const char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result)
void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientOpen(const char* name, int* ref, int uuid, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result)
{} {}
void ClientClose(int refnum, int* result); void ClientClose(int refnum, int* result);


@@ -88,15 +88,20 @@ class JackSocketClientChannel : public detail::JackClientChannelInterface, publi


void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result);
void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result);
void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result);
void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result, int uuid);
void InternalClientUnload(int refnum, int int_ref, int* status, int* result); void InternalClientUnload(int refnum, int int_ref, int* status, int* result);


// Session Stuff
void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result);
void SessionReply(int refnum, int* result);
void GetUUIDForClientName( int refnum, const char *client_name, char *uuid_res, int *result );
void GetClientNameForUUID( int refnum, const char *uuid, char *name_res, int *result );
void ReserveClientName( int refnum, const char *client_name, const char *uuid, int *result );

// JackRunnableInterface interface // JackRunnableInterface interface
bool Init(); bool Init();
bool Execute(); bool Execute();


void SessionNotify(int refnum, const char* target, jack_session_event_type_t type, const char* path, jack_session_command_t** result);
void SessionReply(int refnum, int* result);


bool IsChannelThread() { return fThread.IsThread(); } bool IsChannelThread() { return fThread.IsThread(); }
}; };


+ 42
- 4
posix/JackSocketServerChannel.cpp View File

@@ -102,11 +102,11 @@ void JackSocketServerChannel::ClientCreate()
} }
} }


void JackSocketServerChannel::ClientAdd(int fd, char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
void JackSocketServerChannel::ClientAdd(int fd, char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result)
{ {
jack_log("JackSocketServerChannel::ClientAdd"); jack_log("JackSocketServerChannel::ClientAdd");
int refnum = -1; int refnum = -1;
*result = fServer->GetEngine()->ClientExternalOpen(name, pid, &refnum, shared_engine, shared_client, shared_graph);
*result = fServer->GetEngine()->ClientExternalOpen(name, pid, uuid, &refnum, shared_engine, shared_client, shared_graph);
if (*result == 0) { if (*result == 0) {
fSocketTable[fd].first = refnum; fSocketTable[fd].first = refnum;
fRebuild = true; fRebuild = true;
@@ -181,7 +181,7 @@ bool JackSocketServerChannel::HandleRequest(int fd)
JackClientOpenRequest req; JackClientOpenRequest req;
JackClientOpenResult res; JackClientOpenResult res;
if (req.Read(socket) == 0) if (req.Read(socket) == 0)
ClientAdd(fd, req.fName, req.fPID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult);
ClientAdd(fd, req.fName, req.fPID, req.fUUID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult);
if (res.Write(socket) < 0) if (res.Write(socket) < 0)
jack_error("JackRequest::ClientOpen write error name = %s", req.fName); jack_error("JackRequest::ClientOpen write error name = %s", req.fName);
break; break;
@@ -369,7 +369,7 @@ bool JackSocketServerChannel::HandleRequest(int fd)
JackInternalClientLoadRequest req; JackInternalClientLoadRequest req;
JackInternalClientLoadResult res; JackInternalClientLoadResult res;
if (req.Read(socket) == 0) if (req.Read(socket) == 0)
res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus);
res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus, req.fUUID);
if (res.Write(socket) < 0) if (res.Write(socket) < 0)
jack_error("JackRequest::InternalClientLoad write error name = %s", req.fName); jack_error("JackRequest::InternalClientLoad write error name = %s", req.fName);
break; break;
@@ -421,6 +421,44 @@ bool JackSocketServerChannel::HandleRequest(int fd)
break; break;
} }


case JackRequest::kGetClientByUUID: {
jack_log("JackRequest::GetClientNameForUUID");
JackGetClientNameRequest req;
JackClientNameResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->GetClientNameForUUID(req.fUUID, res.fName, &res.fResult);
}
if (res.Write(socket) < 0)
jack_error("JackRequest::GetClientNameForUUID write error");
break;
}

case JackRequest::kGetUUIDByClient: {
jack_log("JackRequest::GetUUIDForClientName");
JackGetUUIDRequest req;
JackUUIDResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->GetUUIDForClientName(req.fName, res.fUUID, &res.fResult);
res.fResult = 0;
}
if (res.Write(socket) < 0)
jack_error("JackRequest::GetUUIDForClientName write error");
break;
}

case JackRequest::kReserveClientName: {
jack_log("JackRequest::ReserveClientName");
JackReserveNameRequest req;
JackResult res;
if (req.Read(socket) == 0) {
fServer->GetEngine()->ReserveClientName(req.fName, req.fUUID, &res.fResult);
res.fResult = 0;
}
if (res.Write(socket) < 0)
jack_error("JackRequest::ReserveClientName write error");
break;
}

default: default:
jack_error("Unknown request %ld", header.fType); jack_error("Unknown request %ld", header.fType);
break; break;


+ 1
- 1
posix/JackSocketServerChannel.h View File

@@ -50,7 +50,7 @@ class JackSocketServerChannel : public JackRunnableInterface
void BuildPoolTable(); void BuildPoolTable();


void ClientCreate(); void ClientCreate();
void ClientAdd(int fd, char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientAdd(int fd, char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result);
void ClientRemove(int fd, int refnum); void ClientRemove(int fd, int refnum);
void ClientKill(int fd); void ClientKill(int fd);




Loading…
Cancel
Save