git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1231 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.59
| @@ -344,7 +344,7 @@ int JackEngine::ClientNew(const char* name, int* ref, int* shared_engine, int* s | |||||
| // Used for external clients | // Used for external clients | ||||
| int JackEngine::ClientExternalNew(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager, JackExternalClient* client) | int JackEngine::ClientExternalNew(const char* name, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager, JackExternalClient* client) | ||||
| { | { | ||||
| JackLog("JackEngine::ClientNew: name %s \n", name); | |||||
| JackLog("JackEngine::ClientNew: name = %s \n", name); | |||||
| int refnum = fGraphManager->AllocateRefNum(); | int refnum = fGraphManager->AllocateRefNum(); | ||||
| if (refnum < 0) { | if (refnum < 0) { | ||||
| @@ -390,7 +390,7 @@ error: | |||||
| // Used for server driver clients | // Used for server driver clients | ||||
| int JackEngine::ClientInternalNew(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client) | int JackEngine::ClientInternalNew(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client) | ||||
| { | { | ||||
| JackLog("JackEngine::ClientInternalNew: name %s\n", name); | |||||
| JackLog("JackEngine::ClientInternalNew: name = %s\n", name); | |||||
| int refnum = fGraphManager->AllocateRefNum(); | int refnum = fGraphManager->AllocateRefNum(); | ||||
| if (refnum < 0) { | if (refnum < 0) { | ||||
| @@ -529,7 +529,7 @@ int JackEngine::PortRegister(int refnum, const char* name, unsigned int flags, u | |||||
| int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index) | int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index) | ||||
| { | { | ||||
| JackLog("JackEngine::PortUnRegister ref = %ld port_index = %ld\n", refnum, port_index); | |||||
| JackLog("JackEngine::PortUnRegister ref = %ld port_index = %ld\n", refnum, port_index); | |||||
| assert(fClientTable[refnum]); | assert(fClientTable[refnum]); | ||||
| if (fGraphManager->RemovePort(refnum, port_index) == 0) { | if (fGraphManager->RemovePort(refnum, port_index) == 0) { | ||||
| @@ -49,7 +49,7 @@ int JackExternalClient::Open(const char* name, int refnum, int* shared_client) | |||||
| try { | try { | ||||
| if (fChannel->Open(name) < 0) { | if (fChannel->Open(name) < 0) { | ||||
| jack_error("Cannot connect to client name = %s port\n", name); | |||||
| jack_error("Cannot connect to client name = %s\n", name); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| @@ -104,7 +104,7 @@ int JackLibClient::Open(const char* name) | |||||
| goto error; | goto error; | ||||
| } | } | ||||
| JackLog("JackLibClient::Open: name, refnum %s %ld\n", name, fClientControl->fRefNum); | |||||
| JackLog("JackLibClient::Open name = %s refnum = %ld\n", name, fClientControl->fRefNum); | |||||
| return 0; | return 0; | ||||
| error: | error: | ||||
| @@ -43,12 +43,10 @@ void* JackPosixThread::ThreadHandler(void* arg) | |||||
| JackLog("ThreadHandler: start\n"); | JackLog("ThreadHandler: start\n"); | ||||
| // If Init succeed start the thread loop | |||||
| bool res = true; | |||||
| while (obj->fRunning && res) { | |||||
| res = runnable->Execute(); | |||||
| //pthread_testcancel(); | |||||
| } | |||||
| // If Init succeed, start the thread loop | |||||
| while ((obj->fRunning = runnable->Execute())) { | |||||
| //pthread_testcancel(); | |||||
| } | |||||
| JackLog("ThreadHandler: exit\n"); | JackLog("ThreadHandler: exit\n"); | ||||
| return 0; | return 0; | ||||
| @@ -134,7 +132,8 @@ int JackPosixThread::Kill() | |||||
| JackLog("JackPosixThread::Kill\n"); | JackLog("JackPosixThread::Kill\n"); | ||||
| void* status; | void* status; | ||||
| pthread_cancel(fThread); | pthread_cancel(fThread); | ||||
| pthread_join(fThread, &status); | |||||
| pthread_join(fThread, &status); | |||||
| fRunning = false; | |||||
| return 0; | return 0; | ||||
| } else { | } else { | ||||
| return -1; | return -1; | ||||
| @@ -153,10 +153,11 @@ struct JackClientNewResult : public JackResult | |||||
| int fSharedPorts; | int fSharedPorts; | ||||
| uint32_t fProtocolVersion; | uint32_t fProtocolVersion; | ||||
| JackClientNewResult() | |||||
| JackClientNewResult() | |||||
| :fSharedEngine(-1), fSharedClient(-1), fSharedPorts(-1), fProtocolVersion(0) | |||||
| {} | {} | ||||
| JackClientNewResult(int32_t status, int index1, int index2, int index3) | JackClientNewResult(int32_t status, int index1, int index2, int index3) | ||||
| : JackResult(status), fSharedEngine(index1), fSharedClient(index2), fSharedPorts(index3), fProtocolVersion(0) | |||||
| : JackResult(status), fSharedEngine(index1), fSharedClient(index2), fSharedPorts(index3), fProtocolVersion(0) | |||||
| {} | {} | ||||
| virtual int Read(JackChannelTransaction* trans) | virtual int Read(JackChannelTransaction* trans) | ||||
| @@ -154,8 +154,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::ClientNew\n"); | JackLog("JackRequest::ClientNew\n"); | ||||
| JackClientNewRequest req; | JackClientNewRequest req; | ||||
| JackClientNewResult res; | JackClientNewResult res; | ||||
| req.Read(socket); | |||||
| AddClient(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); | |||||
| if (req.Read(socket) == 0) | |||||
| AddClient(fd, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -164,8 +164,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::ClientClose\n"); | JackLog("JackRequest::ClientClose\n"); | ||||
| JackClientCloseRequest req; | JackClientCloseRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| RemoveClient(fd, req.fRefNum); | RemoveClient(fd, req.fRefNum); | ||||
| break; | break; | ||||
| @@ -175,8 +175,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackActivateRequest req; | JackActivateRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| JackLog("JackRequest::ActivateClient\n"); | JackLog("JackRequest::ActivateClient\n"); | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->Activate(req.fRefNum); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->Activate(req.fRefNum); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -185,8 +185,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::DeactivateClient\n"); | JackLog("JackRequest::DeactivateClient\n"); | ||||
| JackDeactivateRequest req; | JackDeactivateRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->Deactivate(req.fRefNum); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->Deactivate(req.fRefNum); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -195,8 +195,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::RegisterPort\n"); | JackLog("JackRequest::RegisterPort\n"); | ||||
| JackPortRegisterRequest req; | JackPortRegisterRequest req; | ||||
| JackPortRegisterResult res; | JackPortRegisterResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -205,8 +205,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::UnRegisterPort\n"); | JackLog("JackRequest::UnRegisterPort\n"); | ||||
| JackPortUnRegisterRequest req; | JackPortUnRegisterRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -215,8 +215,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::ConnectPorts\n"); | JackLog("JackRequest::ConnectPorts\n"); | ||||
| JackPortConnectNameRequest req; | JackPortConnectNameRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -225,8 +225,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | JackLog("JackRequest::DisconnectPorts\n"); | ||||
| JackPortDisconnectNameRequest req; | JackPortDisconnectNameRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -235,8 +235,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::ConnectPorts\n"); | JackLog("JackRequest::ConnectPorts\n"); | ||||
| JackPortConnectRequest req; | JackPortConnectRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -245,8 +245,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | JackLog("JackRequest::DisconnectPorts\n"); | ||||
| JackPortDisconnectRequest req; | JackPortDisconnectRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -255,8 +255,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::SetBufferSize\n"); | JackLog("JackRequest::SetBufferSize\n"); | ||||
| JackSetBufferSizeRequest req; | JackSetBufferSizeRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -265,8 +265,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::SetFreeWheel\n"); | JackLog("JackRequest::SetFreeWheel\n"); | ||||
| JackSetFreeWheelRequest req; | JackSetFreeWheelRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->SetFreewheel(req.fOnOff); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->SetFreewheel(req.fOnOff); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -275,8 +275,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::kReleaseTimebase\n"); | JackLog("JackRequest::kReleaseTimebase\n"); | ||||
| JackReleaseTimebaseRequest req; | JackReleaseTimebaseRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -285,8 +285,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| JackLog("JackRequest::kSetTimebaseCallback\n"); | JackLog("JackRequest::kSetTimebaseCallback\n"); | ||||
| JackSetTimebaseCallbackRequest req; | JackSetTimebaseCallbackRequest req; | ||||
| JackResult res; | JackResult res; | ||||
| req.Read(socket); | |||||
| res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||||
| if (req.Read(socket) == 0) | |||||
| res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||||
| res.Write(socket); | res.Write(socket); | ||||
| break; | break; | ||||
| } | } | ||||
| @@ -294,8 +294,8 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
| case JackRequest::kNotification: { | case JackRequest::kNotification: { | ||||
| JackLog("JackRequest::Notification\n"); | JackLog("JackRequest::Notification\n"); | ||||
| JackClientNotificationRequest req; | JackClientNotificationRequest req; | ||||
| req.Read(socket); | |||||
| fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||||
| if (req.Read(socket) == 0) | |||||
| fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||||
| break; | break; | ||||
| } | } | ||||
| @@ -89,7 +89,12 @@ class JackThread | |||||
| virtual void SetParams(UInt64 period, UInt64 computation, UInt64 constraint) // Empty implementation, will only make sense on OSX... | virtual void SetParams(UInt64 period, UInt64 computation, UInt64 constraint) // Empty implementation, will only make sense on OSX... | ||||
| {} | {} | ||||
| virtual pthread_t GetThreadID() = 0; | |||||
| virtual pthread_t GetThreadID() = 0; | |||||
| bool IsRunning() | |||||
| { | |||||
| return fRunning; | |||||
| } | |||||
| }; | }; | ||||
| } // end of namespace | } // end of namespace | ||||
| @@ -32,7 +32,7 @@ int JackWinNamedPipeNotifyChannel::Open(const char* name) | |||||
| // Connect to client listen pipe | // Connect to client listen pipe | ||||
| if (fNotifyPipe.Connect(jack_client_dir, name, 0) < 0) { | if (fNotifyPipe.Connect(jack_client_dir, name, 0) < 0) { | ||||
| jack_error("Cannot connect client socket"); | |||||
| jack_error("Cannot connect client pipe"); | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| // TODO : use a time out for notifications | // TODO : use a time out for notifications | ||||
| @@ -32,8 +32,7 @@ namespace Jack | |||||
| HANDLE JackClientPipeThread::fMutex = NULL; // never released.... | HANDLE JackClientPipeThread::fMutex = NULL; // never released.... | ||||
| // fRefNum = 0 is used as a "running" state for the JackWinNamedPipeServerNotifyChannel object | |||||
| // fRefNum = -1 correspond to a not running client | |||||
| // fRefNum = -1 correspond to already removed client | |||||
| JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe) | JackClientPipeThread::JackClientPipeThread(JackWinNamedPipeClient* pipe) | ||||
| : fPipe(pipe), fServer(NULL), fRefNum(0) | : fPipe(pipe), fServer(NULL), fRefNum(0) | ||||
| @@ -66,209 +65,209 @@ void JackClientPipeThread::Close() // Close the Server/Client connection | |||||
| { | { | ||||
| fThread->Kill(); | fThread->Kill(); | ||||
| } | } | ||||
| bool JackClientPipeThread::Execute() | |||||
| { | |||||
| JackLog("JackClientPipeThread::Execute\n"); | |||||
| return (HandleRequest(fPipe) == 0); | |||||
| bool JackClientPipeThread::Execute() | |||||
| { | |||||
| JackLog("JackClientPipeThread::Execute\n"); | |||||
| return (HandleRequest() == 0); | |||||
| } | } | ||||
| int JackClientPipeThread::HandleRequest(JackWinNamedPipeClient* pipe) | |||||
| int JackClientPipeThread::HandleRequest() | |||||
| { | { | ||||
| // Read header | // Read header | ||||
| JackRequest header; | |||||
| if (header.Read(pipe) < 0) { | |||||
| jack_error("HandleRequest: cannot read header"); | |||||
| // Lock the global mutex | |||||
| if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) | |||||
| jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); | |||||
| KillClient(fPipe); | |||||
| // Unlock the global mutex | |||||
| ReleaseMutex(fMutex); | |||||
| return -1; | |||||
| } | |||||
| JackRequest header; | |||||
| int res = header.Read(fPipe); | |||||
| int ret = 0; | |||||
| // Lock the global mutex | // Lock the global mutex | ||||
| if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) | if (WaitForSingleObject(fMutex, INFINITE) == WAIT_FAILED) | ||||
| jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); | |||||
| // Read data | |||||
| switch (header.fType) { | |||||
| case JackRequest::kClientNew: { | |||||
| JackLog("JackRequest::ClientNew\n"); | |||||
| JackClientNewRequest req; | |||||
| JackClientNewResult res; | |||||
| req.Read(pipe); | |||||
| AddClient(pipe, req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kClientClose: { | |||||
| JackLog("JackRequest::ClientClose\n"); | |||||
| JackClientCloseRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); | |||||
| res.Write(pipe); | |||||
| RemoveClient(pipe, req.fRefNum); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kActivateClient: { | |||||
| JackActivateRequest req; | |||||
| JackResult res; | |||||
| JackLog("JackRequest::ActivateClient\n"); | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->Activate(req.fRefNum); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDeactivateClient: { | |||||
| JackLog("JackRequest::DeactivateClient\n"); | |||||
| JackDeactivateRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->Deactivate(req.fRefNum); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kRegisterPort: { | |||||
| JackLog("JackRequest::RegisterPort\n"); | |||||
| JackPortRegisterRequest req; | |||||
| JackPortRegisterResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kUnRegisterPort: { | |||||
| JackLog("JackRequest::UnRegisterPort\n"); | |||||
| JackPortUnRegisterRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kConnectNamePorts: { | |||||
| JackLog("JackRequest::ConnectPorts\n"); | |||||
| JackPortConnectNameRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDisconnectNamePorts: { | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | |||||
| JackPortDisconnectNameRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kConnectPorts: { | |||||
| JackLog("JackRequest::ConnectPorts\n"); | |||||
| JackPortConnectRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDisconnectPorts: { | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | |||||
| JackPortDisconnectRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetBufferSize: { | |||||
| JackLog("JackRequest::SetBufferSize\n"); | |||||
| JackSetBufferSizeRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetFreeWheel: { | |||||
| JackLog("JackRequest::SetFreeWheel\n"); | |||||
| JackSetFreeWheelRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->SetFreewheel(req.fOnOff); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kReleaseTimebase: { | |||||
| JackLog("JackRequest::kReleaseTimebase\n"); | |||||
| JackReleaseTimebaseRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetTimebaseCallback: { | |||||
| JackLog("JackRequest::kSetTimebaseCallback\n"); | |||||
| JackSetTimebaseCallbackRequest req; | |||||
| JackResult res; | |||||
| req.Read(pipe); | |||||
| res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||||
| res.Write(pipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kNotification: { | |||||
| JackLog("JackRequest::Notification\n"); | |||||
| JackClientNotificationRequest req; | |||||
| req.Read(pipe); | |||||
| fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||||
| break; | |||||
| } | |||||
| default: | |||||
| JackLog("Unknown request %ld\n", header.fType); | |||||
| break; | |||||
| } | |||||
| jack_error("JackClientPipeThread::HandleRequest: mutex wait error"); | |||||
| if (res < 0) { | |||||
| jack_error("HandleRequest: cannot read header"); | |||||
| KillClient(); | |||||
| ret = -1; | |||||
| } else { | |||||
| // Read data | |||||
| switch (header.fType) { | |||||
| case JackRequest::kClientNew: { | |||||
| JackLog("JackRequest::ClientNew\n"); | |||||
| JackClientNewRequest req; | |||||
| JackClientNewResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| AddClient(req.fName, &res.fSharedEngine, &res.fSharedClient, &res.fSharedPorts, &res.fResult); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kClientClose: { | |||||
| JackLog("JackRequest::ClientClose\n"); | |||||
| JackClientCloseRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->ClientClose(req.fRefNum); | |||||
| res.Write(fPipe); | |||||
| RemoveClient(req.fRefNum); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kActivateClient: { | |||||
| JackActivateRequest req; | |||||
| JackResult res; | |||||
| JackLog("JackRequest::ActivateClient\n"); | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->Activate(req.fRefNum); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDeactivateClient: { | |||||
| JackLog("JackRequest::DeactivateClient\n"); | |||||
| JackDeactivateRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->Deactivate(req.fRefNum); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kRegisterPort: { | |||||
| JackLog("JackRequest::RegisterPort\n"); | |||||
| JackPortRegisterRequest req; | |||||
| JackPortRegisterResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kUnRegisterPort: { | |||||
| JackLog("JackRequest::UnRegisterPort\n"); | |||||
| JackPortUnRegisterRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortUnRegister(req.fRefNum, req.fPortIndex); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kConnectNamePorts: { | |||||
| JackLog("JackRequest::ConnectPorts\n"); | |||||
| JackPortConnectNameRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDisconnectNamePorts: { | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | |||||
| JackPortDisconnectNameRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kConnectPorts: { | |||||
| JackLog("JackRequest::ConnectPorts\n"); | |||||
| JackPortConnectRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortConnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kDisconnectPorts: { | |||||
| JackLog("JackRequest::DisconnectPorts\n"); | |||||
| JackPortDisconnectRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->PortDisconnect(req.fRefNum, req.fSrc, req.fDst); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetBufferSize: { | |||||
| JackLog("JackRequest::SetBufferSize\n"); | |||||
| JackSetBufferSizeRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->SetBufferSize(req.fBufferSize); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetFreeWheel: { | |||||
| JackLog("JackRequest::SetFreeWheel\n"); | |||||
| JackSetFreeWheelRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->SetFreewheel(req.fOnOff); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kReleaseTimebase: { | |||||
| JackLog("JackRequest::kReleaseTimebase\n"); | |||||
| JackReleaseTimebaseRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->ReleaseTimebase(req.fRefNum); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kSetTimebaseCallback: { | |||||
| JackLog("JackRequest::kSetTimebaseCallback\n"); | |||||
| JackSetTimebaseCallbackRequest req; | |||||
| JackResult res; | |||||
| if (req.Read(fPipe) == 0) | |||||
| res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||||
| res.Write(fPipe); | |||||
| break; | |||||
| } | |||||
| case JackRequest::kNotification: { | |||||
| JackLog("JackRequest::Notification\n"); | |||||
| JackClientNotificationRequest req; | |||||
| if (req.Read(fPipe) == 0) | |||||
| fServer->Notify(req.fRefNum, req.fNotify, req.fValue); | |||||
| break; | |||||
| } | |||||
| default: | |||||
| JackLog("Unknown request %ld\n", header.fType); | |||||
| break; | |||||
| } | |||||
| } | |||||
| // Unlock the global mutex | // Unlock the global mutex | ||||
| ReleaseMutex(fMutex); | ReleaseMutex(fMutex); | ||||
| return 0; | |||||
| return ret; | |||||
| } | } | ||||
| void JackClientPipeThread::AddClient(JackWinNamedPipeClient* pipe, char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result) | |||||
| void JackClientPipeThread::AddClient(char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result) | |||||
| { | { | ||||
| JackLog("JackWinNamedPipeServerChannel::AddClient %s\n", name); | JackLog("JackWinNamedPipeServerChannel::AddClient %s\n", name); | ||||
| fRefNum = -1; | fRefNum = -1; | ||||
| *result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports); | *result = fServer->GetEngine()->ClientNew(name, &fRefNum, shared_engine, shared_client, shared_ports); | ||||
| } | } | ||||
| void JackClientPipeThread::RemoveClient(JackWinNamedPipeClient* pipe, int refnum) | |||||
| void JackClientPipeThread::RemoveClient(int refnum) | |||||
| { | { | ||||
| JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum); | JackLog("JackWinNamedPipeServerChannel::RemoveClient ref = %d\n", refnum); | ||||
| fRefNum = -1; | fRefNum = -1; | ||||
| pipe->Close(); | |||||
| fPipe->Close(); | |||||
| } | } | ||||
| void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe) | |||||
| void JackClientPipeThread::KillClient() | |||||
| { | { | ||||
| JackLog("JackClientPipeThread::KillClient \n"); | JackLog("JackClientPipeThread::KillClient \n"); | ||||
| JackLog("JackWinNamedPipeServerChannel::KillClient ref = %d\n", fRefNum); | JackLog("JackWinNamedPipeServerChannel::KillClient ref = %d\n", fRefNum); | ||||
| @@ -282,7 +281,7 @@ void JackClientPipeThread::KillClient(JackWinNamedPipeClient* pipe) | |||||
| } | } | ||||
| fRefNum = -1; | fRefNum = -1; | ||||
| pipe->Close(); | |||||
| fPipe->Close(); | |||||
| } | } | ||||
| JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel() | JackWinNamedPipeServerChannel::JackWinNamedPipeServerChannel() | ||||
| @@ -361,22 +360,23 @@ bool JackWinNamedPipeServerChannel::Execute() | |||||
| void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe) | void JackWinNamedPipeServerChannel::AddClient(JackWinNamedPipeClient* pipe) | ||||
| { | { | ||||
| // Remove dead clients | |||||
| // Remove dead (= not running anymore) clients. | |||||
| std::list<JackClientPipeThread*>::iterator it = fClientList.begin(); | std::list<JackClientPipeThread*>::iterator it = fClientList.begin(); | ||||
| JackClientPipeThread* client; | JackClientPipeThread* client; | ||||
| while (it != fClientList.end()) { | while (it != fClientList.end()) { | ||||
| client = *it; | client = *it; | ||||
| if (!client->IsRunning()) { // Dead client | |||||
| JackLog("Remove client from list\n"); | |||||
| it = fClientList.erase(it); | |||||
| if (client->IsRunning()) { | |||||
| it++; | |||||
| } else { | |||||
| JackLog("Remove client from list\n"); | |||||
| it = fClientList.erase(it); | |||||
| delete(client); | delete(client); | ||||
| } else { | |||||
| it++; | |||||
| } | } | ||||
| } | } | ||||
| client = new JackClientPipeThread(pipe); | 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); | fClientList.push_back(client); | ||||
| } | } | ||||
| @@ -39,9 +39,9 @@ class JackClientPipeThread : public JackRunnableInterface | |||||
| JackThread* fThread; | JackThread* fThread; | ||||
| int fRefNum; | int fRefNum; | ||||
| void AddClient(JackWinNamedPipeClient* pipe, char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result); | |||||
| void RemoveClient(JackWinNamedPipeClient* pipe, int refnum); | |||||
| void KillClient(JackWinNamedPipeClient* pipe); | |||||
| void AddClient(char* name, int* shared_engine, int* shared_client, int* shared_ports, int* result); | |||||
| void RemoveClient(int refnum); | |||||
| void KillClient(); | |||||
| static HANDLE fMutex; | static HANDLE fMutex; | ||||
| @@ -53,14 +53,15 @@ class JackClientPipeThread : public JackRunnableInterface | |||||
| int Open(JackServer* server); // Open the Server/Client connection | int Open(JackServer* server); // Open the Server/Client connection | ||||
| void Close(); // Close the Server/Client connection | void Close(); // Close the Server/Client connection | ||||
| int HandleRequest(JackWinNamedPipeClient* pipe); | |||||
| int HandleRequest(); | |||||
| // JackRunnableInterface interface | // JackRunnableInterface interface | ||||
| bool Execute(); | bool Execute(); | ||||
| // To be used for find out if the object can be deleted | |||||
| bool IsRunning() | bool IsRunning() | ||||
| { | { | ||||
| return (fRefNum >= 0); | |||||
| return fThread->IsRunning(); | |||||
| } | } | ||||
| }; | }; | ||||
| @@ -43,12 +43,9 @@ DWORD WINAPI JackWinThread::ThreadHandler(void* arg) | |||||
| JackLog("ThreadHandler: start\n"); | JackLog("ThreadHandler: start\n"); | ||||
| // If Init succeed start the thread loop | |||||
| bool res = true; | |||||
| while (obj->fRunning && res) { | |||||
| res = runnable->Execute(); | |||||
| } | |||||
| // If Init succeed, start the thread loop | |||||
| while ((obj->fRunning = runnable->Execute())) {} | |||||
| SetEvent(obj->fEvent); | SetEvent(obj->fEvent); | ||||
| JackLog("ThreadHandler: exit\n"); | JackLog("ThreadHandler: exit\n"); | ||||
| return 0; | return 0; | ||||
| @@ -156,7 +153,8 @@ int JackWinThread::Kill() | |||||
| JackLog("JackWinThread::Kill\n"); | JackLog("JackWinThread::Kill\n"); | ||||
| TerminateThread(fThread, 0); /// TO CHECK : dangerous | TerminateThread(fThread, 0); /// TO CHECK : dangerous | ||||
| CloseHandle(fThread); | CloseHandle(fThread); | ||||
| CloseHandle(fEvent); | |||||
| CloseHandle(fEvent); | |||||
| fRunning = false; | |||||
| return 0; | return 0; | ||||
| } else { | } else { | ||||
| return -1; | return -1; | ||||
| @@ -108,6 +108,28 @@ SOURCE="..\example-clients\lsp.c" | |||||
| # Begin Source File | # Begin Source File | ||||
| SOURCE=.\Release\libjackmp.lib | SOURCE=.\Release\libjackmp.lib | ||||
| !IF "$(CFG)" == "jack_lsp - Win32 Release" | |||||
| !ELSEIF "$(CFG)" == "jack_lsp - Win32 Debug" | |||||
| # PROP Exclude_From_Build 1 | |||||
| !ENDIF | |||||
| # End Source File | |||||
| # Begin Source File | |||||
| SOURCE=.\Debug\libjackmp_debug.lib | |||||
| !IF "$(CFG)" == "jack_lsp - Win32 Release" | |||||
| # PROP Exclude_From_Build 1 | |||||
| !ELSEIF "$(CFG)" == "jack_lsp - Win32 Debug" | |||||
| !ENDIF | |||||
| # End Source File | # End Source File | ||||
| # End Target | # End Target | ||||
| # End Project | # End Project | ||||
| @@ -100,6 +100,28 @@ SOURCE="..\example-clients\simple_client.c" | |||||
| # Begin Source File | # Begin Source File | ||||
| SOURCE=.\Release\libjackmp.lib | SOURCE=.\Release\libjackmp.lib | ||||
| !IF "$(CFG)" == "jack_simple_client - Win32 Release" | |||||
| !ELSEIF "$(CFG)" == "jack_simple_client - Win32 Debug" | |||||
| # PROP Exclude_From_Build 1 | |||||
| !ENDIF | |||||
| # End Source File | |||||
| # Begin Source File | |||||
| SOURCE=.\Debug\libjackmp_debug.lib | |||||
| !IF "$(CFG)" == "jack_simple_client - Win32 Release" | |||||
| # PROP Exclude_From_Build 1 | |||||
| !ELSEIF "$(CFG)" == "jack_simple_client - Win32 Debug" | |||||
| !ENDIF | |||||
| # End Source File | # End Source File | ||||
| # End Target | # End Target | ||||
| # End Project | # End Project | ||||
| @@ -39,6 +39,7 @@ RSC=rc.exe | |||||
| # PROP Use_Debug_Libraries 0 | # PROP Use_Debug_Libraries 0 | ||||
| # PROP Output_Dir "Release" | # PROP Output_Dir "Release" | ||||
| # PROP Intermediate_Dir "Release" | # PROP Intermediate_Dir "Release" | ||||
| # PROP Ignore_Export_Lib 0 | |||||
| # PROP Target_Dir "" | # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c | ||||
| # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /YX /FD /c | # ADD CPP /nologo /MD /W3 /GX /O2 /I "." /I "../common" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D "__STDC__" /YX /FD /c | ||||
| @@ -108,6 +109,19 @@ SOURCE=.\JackdmpWIN32.cpp | |||||
| # Begin Source File | # Begin Source File | ||||
| SOURCE=.\Release\libjackdmp.lib | SOURCE=.\Release\libjackdmp.lib | ||||
| !IF "$(CFG)" == "jackdmp - Win32 Release" | |||||
| !ELSEIF "$(CFG)" == "jackdmp - Win32 Debug" | |||||
| # PROP Exclude_From_Build 1 | |||||
| !ENDIF | |||||
| # End Source File | |||||
| # Begin Source File | |||||
| SOURCE=.\Debug\libjackdmp_debug.lib | |||||
| # End Source File | # End Source File | ||||
| # End Target | # End Target | ||||
| # End Project | # End Project | ||||
| @@ -68,7 +68,7 @@ LINK32=link.exe | |||||
| # PROP Ignore_Export_Lib 0 | # PROP Ignore_Export_Lib 0 | ||||
| # PROP Target_Dir "" | # PROP Target_Dir "" | ||||
| # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /YX /FD /GZ /c | # ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /YX /FD /GZ /c | ||||
| # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /YX /FD /GZ /c | |||||
| # ADD CPP /nologo /MDd /W3 /Gm /GR /GX /ZI /Od /I "." /I "../common" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "LIBJACKMP_EXPORTS" /D "__STDC__" /D "REGEX_MALLOC" /D "STDC_HEADERS" /D "__SMP__" /FR /YX /FD /GZ /c | |||||
| # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||
| # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 | ||||
| # ADD BASE RSC /l 0x40c /d "_DEBUG" | # ADD BASE RSC /l 0x40c /d "_DEBUG" | ||||