|
|
@@ -53,7 +53,7 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client con |
|
|
|
fServer = server; |
|
|
|
|
|
|
|
// Start listening |
|
|
|
if (fThread->Start() != 0){ |
|
|
|
if (fThread->Start() != 0) { |
|
|
|
jack_error("Cannot start Jack server listener\n"); |
|
|
|
return -1; |
|
|
|
} else { |
|
|
@@ -63,30 +63,32 @@ int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client con |
|
|
|
|
|
|
|
void JackClientPipeThread::Close() // Close the Server/Client connection |
|
|
|
{ |
|
|
|
fThread->Kill(); |
|
|
|
fThread->Kill(); |
|
|
|
fPipe->Close(); |
|
|
|
fRefNum = -1; |
|
|
|
} |
|
|
|
|
|
|
|
bool JackClientPipeThread::Execute()
|
|
|
|
{
|
|
|
|
JackLog("JackClientPipeThread::Execute\n");
|
|
|
|
return (HandleRequest() == 0);
|
|
|
|
|
|
|
|
bool JackClientPipeThread::Execute() |
|
|
|
{ |
|
|
|
JackLog("JackClientPipeThread::Execute\n"); |
|
|
|
return (HandleRequest() == 0); |
|
|
|
} |
|
|
|
|
|
|
|
int JackClientPipeThread::HandleRequest() |
|
|
|
{ |
|
|
|
// Read header |
|
|
|
JackRequest header;
|
|
|
|
int res = header.Read(fPipe);
|
|
|
|
int ret = 0;
|
|
|
|
JackRequest header; |
|
|
|
int res = header.Read(fPipe); |
|
|
|
int ret = 0; |
|
|
|
|
|
|
|
// Lock the global mutex |
|
|
|
if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) |
|
|
|
jack_error("JackClientPipeThread::HandleRequest: mutex wait error");
|
|
|
|
|
|
|
|
if (res < 0) {
|
|
|
|
jack_error("HandleRequest: cannot read header");
|
|
|
|
KillClient();
|
|
|
|
ret = -1;
|
|
|
|
jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); |
|
|
|
|
|
|
|
if (res < 0) { |
|
|
|
jack_error("HandleRequest: cannot read header"); |
|
|
|
KillClient(); |
|
|
|
ret = -1; |
|
|
|
} else { |
|
|
|
|
|
|
|
// Read data |
|
|
@@ -97,7 +99,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
JackClientNewRequest req; |
|
|
|
JackClientNewResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult);
|
|
|
|
AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -105,20 +107,20 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kClientClose: { |
|
|
|
JackLog("JackRequest::ClientClose\n"); |
|
|
|
JackClientCloseRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum);
|
|
|
|
res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
RemoveClient(req.fRefNum); |
|
|
|
RemoveClient(); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
case JackRequest::kActivateClient: { |
|
|
|
JackActivateRequest req; |
|
|
|
JackResult res; |
|
|
|
JackLog("JackRequest::ActivateClient\n");
|
|
|
|
JackLog("JackRequest::ActivateClient\n"); |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->Activate(req.fRefNum);
|
|
|
|
res.fResult = fServer->Activate(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -126,9 +128,9 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kDeactivateClient: { |
|
|
|
JackLog("JackRequest::DeactivateClient\n"); |
|
|
|
JackDeactivateRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->Deactivate(req.fRefNum);
|
|
|
|
res.fResult = fServer->Deactivate(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -136,9 +138,9 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kRegisterPort: { |
|
|
|
JackLog("JackRequest::RegisterPort\n"); |
|
|
|
JackPortRegisterRequest req; |
|
|
|
JackPortRegisterResult res;
|
|
|
|
JackPortRegisterResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex);
|
|
|
|
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -146,10 +148,10 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kUnRegisterPort: { |
|
|
|
JackLog("JackRequest::UnRegisterPort\n"); |
|
|
|
JackPortUnRegisterRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex);
|
|
|
|
|
|
|
|
res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); |
|
|
|
|
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -157,9 +159,9 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kConnectNamePorts: { |
|
|
|
JackLog("JackRequest::ConnectPorts\n"); |
|
|
|
JackPortConnectNameRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst);
|
|
|
|
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); |
|
|
|
res.Write(fPipe); |
|
|
|
break; |
|
|
|
} |
|
|
@@ -167,7 +169,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kDisconnectNamePorts: { |
|
|
|
JackLog("JackRequest::DisconnectPorts\n"); |
|
|
|
JackPortDisconnectNameRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); |
|
|
|
res.Write(fPipe); |
|
|
@@ -177,7 +179,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kConnectPorts: { |
|
|
|
JackLog("JackRequest::ConnectPorts\n"); |
|
|
|
JackPortConnectRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); |
|
|
|
res.Write(fPipe); |
|
|
@@ -187,7 +189,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kDisconnectPorts: { |
|
|
|
JackLog("JackRequest::DisconnectPorts\n"); |
|
|
|
JackPortDisconnectRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); |
|
|
|
res.Write(fPipe); |
|
|
@@ -197,7 +199,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kSetBufferSize: { |
|
|
|
JackLog("JackRequest::SetBufferSize\n"); |
|
|
|
JackSetBufferSizeRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->SetBufferSize(req.fBufferSize); |
|
|
|
res.Write(fPipe); |
|
|
@@ -207,7 +209,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kSetFreeWheel: { |
|
|
|
JackLog("JackRequest::SetFreeWheel\n"); |
|
|
|
JackSetFreeWheelRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->SetFreewheel(req.fOnOff); |
|
|
|
res.Write(fPipe); |
|
|
@@ -217,7 +219,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kReleaseTimebase: { |
|
|
|
JackLog("JackRequest::kReleaseTimebase\n"); |
|
|
|
JackReleaseTimebaseRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); |
|
|
|
res.Write(fPipe); |
|
|
@@ -227,7 +229,7 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
case JackRequest::kSetTimebaseCallback: { |
|
|
|
JackLog("JackRequest::kSetTimebaseCallback\n"); |
|
|
|
JackSetTimebaseCallbackRequest req; |
|
|
|
JackResult res;
|
|
|
|
JackResult res; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); |
|
|
|
res.Write(fPipe); |
|
|
@@ -236,16 +238,16 @@ int JackClientPipeThread::HandleRequest() |
|
|
|
|
|
|
|
case JackRequest::kNotification: { |
|
|
|
JackLog("JackRequest::Notification\n"); |
|
|
|
JackClientNotificationRequest req;
|
|
|
|
JackClientNotificationRequest req; |
|
|
|
if (req.Read(fPipe) == 0) |
|
|
|
fServer->Notify(req.fRefNum, req.fNotify, req.fValue);
|
|
|
|
fServer->Notify(req.fRefNum, req.fNotify, req.fValue); |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
default: |
|
|
|
JackLog("Unknown request %ld\n", header.fType); |
|
|
|
break; |
|
|
|
}
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Unlock the global mutex |
|
|
@@ -260,11 +262,10 @@ void JackClientPipeThread::AddClient(char* name, int* shared_engine, int* shared |
|
|
|
*result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports); |
|
|
|
} |
|
|
|
|
|
|
|
void JackClientPipeThread::RemoveClient(int refnum) |
|
|
|
void JackClientPipeThread::RemoveClient() |
|
|
|
{ |
|
|
|
JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum); |
|
|
|
fRefNum = -1; |
|
|
|
fPipe->Close(); |
|
|
|
JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", fRefNum); |
|
|
|
Close(); |
|
|
|
} |
|
|
|
|
|
|
|
void JackClientPipeThread::KillClient() |
|
|
@@ -280,8 +281,7 @@ void JackClientPipeThread::KillClient() |
|
|
|
fServer->Notify(fRefNum, JackNotifyChannelInterface::kDeadClient, 0); |
|
|
|
} |
|
|
|
|
|
|
|
fRefNum = -1; |
|
|
|
fPipe->Close(); |
|
|
|
Close(); |
|
|
|
} |
|
|
|
|
|
|
|
JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel() |
|
|
@@ -365,17 +365,17 @@ void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe) |
|
|
|
JackClientPipeThread* client; |
|
|
|
while (it != fClientList.end()) { |
|
|
|
client = *it; |
|
|
|
if (client->IsRunning()) {
|
|
|
|
if (client->IsRunning()) { |
|
|
|
it++; |
|
|
|
} else { |
|
|
|
JackLog("Remove client from list\n");
|
|
|
|
it = fClientList.erase(it);
|
|
|
|
JackLog("Remove client from list\n"); |
|
|
|
it = fClientList.erase(it); |
|
|
|
delete(client); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
client = new JackClientPipeThread(pipe); |
|
|
|
client->Open(fServer);
|
|
|
|
client->Open(fServer); |
|
|
|
// Here we are sure that the client is running (because it's thread is in "running" state). |
|
|
|
fClientList.push_back(client); |
|
|
|
} |
|
|
|