Index: common/JackExternalClient.h =================================================================== --- common/JackExternalClient.h (revision 1038) +++ common/JackExternalClient.h (working copy) @@ -46,7 +46,7 @@ JackExternalClient(); virtual ~JackExternalClient(); - int Open(const char* name, int refnum, int* shared_client); + int Open(const char* name, int pid, int refnum, int* shared_client); int Close(); int ClientNotify(int refnum, const char* name, int notify, int sync, int value1, int value2); Index: common/JackRequest.h =================================================================== --- common/JackRequest.h (revision 1038) +++ common/JackRequest.h (working copy) @@ -193,23 +193,29 @@ { char fName[JACK_CLIENT_NAME_SIZE + 1]; + int fPID; JackClientOpenRequest() {} - JackClientOpenRequest(const char* name): JackRequest(JackRequest::kClientOpen) + JackClientOpenRequest(const char* name, int pid): JackRequest(JackRequest::kClientOpen) { snprintf(fName, sizeof(fName), "%s", name); + fPID = pid; } int Read(JackChannelTransaction* trans) { - return trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1); + CheckRes(trans->Read(&fName, JACK_CLIENT_NAME_SIZE + 1)); + CheckRes(trans->Read(&fPID, sizeof(fPID))); + return 0; } int Write(JackChannelTransaction* trans) { CheckRes(JackRequest::Write(trans)); - return trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1); + CheckRes(trans->Write(&fName, JACK_CLIENT_NAME_SIZE + 1)); + CheckRes(trans->Write(&fPID, sizeof(fPID))); + return 0; } }; Index: common/JackEngine.cpp =================================================================== --- common/JackEngine.cpp (revision 1038) +++ common/JackEngine.cpp (working copy) @@ -448,7 +448,7 @@ } // Used for external clients -int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) +int JackEngine::ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) { jack_log("JackEngine::ClientOpen: name = %s ", name); @@ -465,7 +465,7 @@ goto error; } - if (client->Open(name, refnum, shared_client) < 0) { + if (client->Open(name, pid, refnum, shared_client) < 0) { jack_error("Cannot open client"); goto error; } Index: common/JackSocketServerChannel.h =================================================================== --- common/JackSocketServerChannel.h (revision 1038) +++ common/JackSocketServerChannel.h (working copy) @@ -49,7 +49,7 @@ void BuildPoolTable(); void ClientCreate(); - void ClientAdd(int fd, char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result); + void ClientAdd(int fd, char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result); void ClientRemove(int fd, int refnum); void ClientKill(int fd); Index: common/JackSocketClientChannel.cpp =================================================================== --- common/JackSocketClientChannel.cpp (revision 1038) +++ common/JackSocketClientChannel.cpp (working copy) @@ -22,6 +22,7 @@ #include "JackClient.h" #include "JackGlobals.h" #include "JackError.h" +#include "JackTools.h" namespace Jack { @@ -151,7 +152,7 @@ void JackSocketClientChannel::ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) { - JackClientOpenRequest req(name); + JackClientOpenRequest req(name, JackTools::GetPID()); JackClientOpenResult res; ServerSyncCall(&req, &res, result); *shared_engine = res.fSharedEngine; Index: common/JackSocketServerChannel.cpp =================================================================== --- common/JackSocketServerChannel.cpp (revision 1038) +++ common/JackSocketServerChannel.cpp (working copy) @@ -89,11 +89,11 @@ } } -void JackSocketServerChannel::ClientAdd(int fd, char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) +void JackSocketServerChannel::ClientAdd(int fd, char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result) { jack_log("JackSocketServerChannel::ClientAdd"); int refnum = -1; - *result = fServer->GetEngine()->ClientExternalOpen(name, &refnum, shared_engine, shared_client, shared_graph); + *result = fServer->GetEngine()->ClientExternalOpen(name, pid, &refnum, shared_engine, shared_client, shared_graph); if (*result == 0) { fSocketTable[fd].first = refnum; fRebuild = true; @@ -167,7 +167,7 @@ JackClientOpenRequest req; JackClientOpenResult res; if (req.Read(socket) == 0) - ClientAdd(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); + ClientAdd(fd, req.fName, req.fPID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); if (res.Write(socket) < 0) jack_error("JackRequest::kClientOpen write error name = %s", req.fName); break; Index: common/JackEngine.h =================================================================== --- common/JackEngine.h (revision 1038) +++ common/JackEngine.h (working copy) @@ -80,7 +80,7 @@ // Client management virtual int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status); - virtual int ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager); + virtual int ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager); virtual int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait); virtual int ClientExternalClose(int refnum); Index: common/JackLockedEngine.h =================================================================== --- common/JackLockedEngine.h (revision 1038) +++ common/JackLockedEngine.h (working copy) @@ -62,10 +62,10 @@ JackLock lock(this); return fEngine->ClientCheck(name, name_res, protocol, options, status); } - int ClientExternalOpen(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) + int ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager) { JackLock lock(this); - return fEngine->ClientExternalOpen(name, ref, shared_engine, shared_client, shared_graph_manager); + return fEngine->ClientExternalOpen(name, pid, ref, shared_engine, shared_client, shared_graph_manager); } int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait) { Index: common/JackExternalClient.cpp =================================================================== --- common/JackExternalClient.cpp (revision 1038) +++ common/JackExternalClient.cpp (working copy) @@ -45,8 +45,9 @@ return result; } -int JackExternalClient::Open(const char* name, int refnum, int* shared_client) +int JackExternalClient::Open(const char* name, int pid, int refnum, int* shared_client) { + jack_info("client '%s' with pid %d", name, pid); try { if (fChannel->Open(name) < 0) { Index: common/jack/jack.h =================================================================== --- common/jack/jack.h (revision 1038) +++ common/jack/jack.h (working copy) @@ -135,6 +135,11 @@ char * jack_get_client_name (jack_client_t *client); /** + * @return pid of client. If not available, 0 will be returned. + */ + int jack_get_client_pid (const char *name); + + /** * Load an internal client into the Jack server. * * Internal clients run inside the JACK server process. They can use Index: macosx/JackMachServerChannel.cpp =================================================================== --- macosx/JackMachServerChannel.cpp (revision 1038) +++ macosx/JackMachServerChannel.cpp (working copy) @@ -88,7 +88,7 @@ void JackMachServerChannel::ClientOpen(char* name, mach_port_t* private_port, int* shared_engine, int* shared_client, int* shared_graph, int* result) { int refnum = -1; - *result = GetEngine()->ClientExternalOpen(name, &refnum, shared_engine, shared_client, shared_graph); + *result = GetEngine()->ClientExternalOpen(name, 0, &refnum, shared_engine, shared_client, shared_graph); if (*result == 0) { mach_port_t port = fServerPort.AddPort(); Index: windows/JackWinNamedPipeClientChannel.cpp =================================================================== --- windows/JackWinNamedPipeClientChannel.cpp (revision 1038) +++ windows/JackWinNamedPipeClientChannel.cpp (working copy) @@ -155,7 +155,7 @@ void JackWinNamedPipeClientChannel::ClientOpen(const char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) { - JackClientOpenRequest req(name); + JackClientOpenRequest req(name, JackTools::GetPID()); JackClientOpenResult res; ServerSyncCall(&req, &res, result); *shared_engine = res.fSharedEngine; Index: windows/JackWinNamedPipeServerChannel.cpp =================================================================== --- windows/JackWinNamedPipeServerChannel.cpp (revision 1038) +++ windows/JackWinNamedPipeServerChannel.cpp (working copy) @@ -122,7 +122,7 @@ JackClientOpenRequest req; JackClientOpenResult res; if (req.Read(fPipe) == 0) - ClientAdd(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); + ClientAdd(req.fName, req.fPID, &res.fSharedEngine, &res.fSharedClient, &res.fSharedGraph, &res.fResult); res.Write(fPipe); break; } @@ -318,11 +318,11 @@ return ret; } -void JackClientPipeThread::ClientAdd(char* name, int* shared_engine, int* shared_client, int* shared_graph, int* result) +void JackClientPipeThread::ClientAdd(char* name, int pid, int* shared_engine, int* shared_client, int* shared_graph, int* result) { jack_log("JackClientPipeThread::ClientAdd %s", name); fRefNum = -1; - *result = fServer->GetEngine()->ClientExternalOpen(name, &fRefNum, shared_engine, shared_client, shared_graph); + *result = fServer->GetEngine()->ClientExternalOpen(name, pid, &fRefNum, shared_engine, shared_client, shared_graph); } void JackClientPipeThread::ClientRemove()