git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4731 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.9.9.5
| @@ -36,6 +36,11 @@ John Emmas | |||||
| Jackdmp changes log | Jackdmp changes log | ||||
| --------------------------- | --------------------------- | ||||
| 2012-01-24 Stephane Letz <letz@grame.fr> | |||||
| * Improve ShutDown in NetManager | |||||
| * Correct ShutDown in JackInternalClient and JackLibClient. | |||||
| 2012-01-20 Stephane Letz <letz@grame.fr> | 2012-01-20 Stephane Letz <letz@grame.fr> | ||||
| * Experimental system port alias use in WIndows JackRouter. | * Experimental system port alias use in WIndows JackRouter. | ||||
| @@ -88,6 +88,19 @@ JackClient::JackClient(JackSynchro* table):fThread(this) | |||||
| JackClient::~JackClient() | JackClient::~JackClient() | ||||
| {} | {} | ||||
| void JackClient::ShutDown() | |||||
| { | |||||
| jack_log("JackClient::ShutDown"); | |||||
| if (fInfoShutdown) { | |||||
| fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); | |||||
| fInfoShutdown = NULL; | |||||
| } else if (fShutdown) { | |||||
| fShutdown(fShutdownArg); | |||||
| fShutdown = NULL; | |||||
| } | |||||
| } | |||||
| int JackClient::Close() | int JackClient::Close() | ||||
| { | { | ||||
| jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum); | jack_log("JackClient::Close ref = %ld", GetClientControl()->fRefNum); | ||||
| @@ -747,27 +760,6 @@ int JackClient::ComputeTotalLatencies() | |||||
| return result; | return result; | ||||
| } | } | ||||
| /* | |||||
| ShutDown is called: | |||||
| - from the RT thread when Execute method fails | |||||
| - possibly from a "closed" notification channel | |||||
| (Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown)) | |||||
| */ | |||||
| void JackClient::ShutDown() | |||||
| { | |||||
| jack_log("JackClient::ShutDown"); | |||||
| JackGlobals::fServerRunning = false; | |||||
| if (fInfoShutdown) { | |||||
| fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg); | |||||
| fInfoShutdown = NULL; | |||||
| } else if (fShutdown) { | |||||
| fShutdown(fShutdownArg); | |||||
| fShutdown = NULL; | |||||
| } | |||||
| } | |||||
| //---------------------- | //---------------------- | ||||
| // Transport management | // Transport management | ||||
| //---------------------- | //---------------------- | ||||
| @@ -78,14 +78,13 @@ int JackEngine::Close() | |||||
| if (JackLoadableInternalClient* loadable_client = dynamic_cast<JackLoadableInternalClient*>(fClientTable[i])) { | if (JackLoadableInternalClient* loadable_client = dynamic_cast<JackLoadableInternalClient*>(fClientTable[i])) { | ||||
| jack_log("JackEngine::Close loadable client = %s", loadable_client->GetClientControl()->fName); | jack_log("JackEngine::Close loadable client = %s", loadable_client->GetClientControl()->fName); | ||||
| loadable_client->Close(); | loadable_client->Close(); | ||||
| // Close does not delete the pointer for internal clients | |||||
| fClientTable[i] = NULL; | fClientTable[i] = NULL; | ||||
| delete loadable_client; | delete loadable_client; | ||||
| } else if (JackExternalClient* external_client = dynamic_cast<JackExternalClient*>(fClientTable[i])) { | } else if (JackExternalClient* external_client = dynamic_cast<JackExternalClient*>(fClientTable[i])) { | ||||
| jack_log("JackEngine::Close external client = %s", external_client->GetClientControl()->fName); | jack_log("JackEngine::Close external client = %s", external_client->GetClientControl()->fName); | ||||
| external_client->Close(); | external_client->Close(); | ||||
| // Close deletes the pointer for external clients | |||||
| fClientTable[i] = NULL; | fClientTable[i] = NULL; | ||||
| delete external_client; | |||||
| } | } | ||||
| } | } | ||||
| @@ -671,6 +670,8 @@ error: | |||||
| // Used for external clients | // Used for external clients | ||||
| int JackEngine::ClientExternalClose(int refnum) | int JackEngine::ClientExternalClose(int refnum) | ||||
| { | { | ||||
| jack_log("JackEngine::ClientExternalClose ref = %ld", refnum); | |||||
| JackClientInterface* client = fClientTable[refnum]; | JackClientInterface* client = fClientTable[refnum]; | ||||
| fEngineControl->fTransport.ResetTimebase(refnum); | fEngineControl->fTransport.ResetTimebase(refnum); | ||||
| int res = ClientCloseAux(refnum, client, true); | int res = ClientCloseAux(refnum, client, true); | ||||
| @@ -682,7 +683,10 @@ int JackEngine::ClientExternalClose(int refnum) | |||||
| // Used for server internal clients or drivers when the RT thread is stopped | // Used for server internal clients or drivers when the RT thread is stopped | ||||
| int JackEngine::ClientInternalClose(int refnum, bool wait) | int JackEngine::ClientInternalClose(int refnum, bool wait) | ||||
| { | { | ||||
| jack_log("JackEngine::ClientInternalClose ref = %ld", refnum); | |||||
| JackClientInterface* client = fClientTable[refnum]; | JackClientInterface* client = fClientTable[refnum]; | ||||
| fEngineControl->fTransport.ResetTimebase(refnum); | |||||
| return ClientCloseAux(refnum, client, wait); | return ClientCloseAux(refnum, client, wait); | ||||
| } | } | ||||
| @@ -59,7 +59,6 @@ SERVER_EXPORT JackSynchro* GetSynchroTable() | |||||
| JackInternalClient::JackInternalClient(JackServer* server, JackSynchro* table): JackClient(table) | JackInternalClient::JackInternalClient(JackServer* server, JackSynchro* table): JackClient(table) | ||||
| { | { | ||||
| fChannel = new JackInternalClientChannel(server); | fChannel = new JackInternalClientChannel(server); | ||||
| //fChannel = new JackGenericClientChannel(); | |||||
| } | } | ||||
| JackInternalClient::~JackInternalClient() | JackInternalClient::~JackInternalClient() | ||||
| @@ -106,6 +105,12 @@ error: | |||||
| return -1; | return -1; | ||||
| } | } | ||||
| void JackInternalClient::ShutDown() | |||||
| { | |||||
| jack_log("JackInternalClient::ShutDown"); | |||||
| JackClient::ShutDown(); | |||||
| } | |||||
| JackGraphManager* JackInternalClient::GetGraphManager() const | JackGraphManager* JackInternalClient::GetGraphManager() const | ||||
| { | { | ||||
| assert(fGraphManager); | assert(fGraphManager); | ||||
| @@ -196,10 +201,12 @@ JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, Jac | |||||
| JackLoadableInternalClient::~JackLoadableInternalClient() | JackLoadableInternalClient::~JackLoadableInternalClient() | ||||
| { | { | ||||
| if (fFinish != NULL) | |||||
| if (fFinish != NULL) { | |||||
| fFinish(fProcessArg); | fFinish(fProcessArg); | ||||
| if (fHandle != NULL) | |||||
| } | |||||
| if (fHandle != NULL) { | |||||
| UnloadJackModule(fHandle); | UnloadJackModule(fHandle); | ||||
| } | |||||
| } | } | ||||
| int JackLoadableInternalClient1::Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status) | int JackLoadableInternalClient1::Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status) | ||||
| @@ -47,6 +47,7 @@ class JackInternalClient : public JackClient | |||||
| virtual ~JackInternalClient(); | virtual ~JackInternalClient(); | ||||
| int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); | int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); | ||||
| void ShutDown(); | |||||
| JackGraphManager* GetGraphManager() const; | JackGraphManager* GetGraphManager() const; | ||||
| JackEngineControl* GetEngineControl() const; | JackEngineControl* GetEngineControl() const; | ||||
| @@ -55,6 +55,20 @@ JackSynchro* GetSynchroTable() | |||||
| // Client management | // Client management | ||||
| //------------------- | //------------------- | ||||
| /* | |||||
| ShutDown is called: | |||||
| - from the RT thread when Execute method fails | |||||
| - possibly from a "closed" notification channel | |||||
| (Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown)) | |||||
| */ | |||||
| void JackLibClient::ShutDown() | |||||
| { | |||||
| jack_log("JackLibClient::ShutDown"); | |||||
| JackGlobals::fServerRunning = false; | |||||
| JackClient::ShutDown(); | |||||
| } | |||||
| JackLibClient::JackLibClient(JackSynchro* table): JackClient(table) | JackLibClient::JackLibClient(JackSynchro* table): JackClient(table) | ||||
| { | { | ||||
| jack_log("JackLibClient::JackLibClient table = %x", table); | jack_log("JackLibClient::JackLibClient table = %x", table); | ||||
| @@ -45,6 +45,7 @@ class JackLibClient : public JackClient | |||||
| virtual ~JackLibClient(); | virtual ~JackLibClient(); | ||||
| int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); | int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status); | ||||
| void ShutDown(); | |||||
| 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); | ||||
| @@ -560,7 +560,7 @@ namespace Jack | |||||
| const JSList* node; | const JSList* node; | ||||
| const jack_driver_param_t* param; | const jack_driver_param_t* param; | ||||
| jack_on_shutdown(fClient, ShutDown, this); | |||||
| jack_on_shutdown(fClient, SetShutDown, this); | |||||
| // Possibly use env variable | // Possibly use env variable | ||||
| const char* default_udp_port = getenv("JACK_NETJACK_PORT"); | const char* default_udp_port = getenv("JACK_NETJACK_PORT"); | ||||
| @@ -613,17 +613,7 @@ namespace Jack | |||||
| JackNetMasterManager::~JackNetMasterManager() | JackNetMasterManager::~JackNetMasterManager() | ||||
| { | { | ||||
| jack_log("JackNetMasterManager::~JackNetMasterManager"); | jack_log("JackNetMasterManager::~JackNetMasterManager"); | ||||
| jack_info("Exiting NetManager..."); | |||||
| if (fRunning) { | |||||
| jack_client_kill_thread(fClient, fThread); | |||||
| fRunning = false; | |||||
| } | |||||
| master_list_t::iterator it; | |||||
| for (it = fMasterList.begin(); it != fMasterList.end(); it++) { | |||||
| delete(*it); | |||||
| } | |||||
| fSocket.Close(); | |||||
| SocketAPIEnd(); | |||||
| ShutDown(); | |||||
| } | } | ||||
| int JackNetMasterManager::CountIO(int flags) | int JackNetMasterManager::CountIO(int flags) | ||||
| @@ -644,14 +634,25 @@ namespace Jack | |||||
| return count; | return count; | ||||
| } | } | ||||
| void JackNetMasterManager::ShutDown(void* arg) | |||||
| void JackNetMasterManager::SetShutDown(void* arg) | |||||
| { | |||||
| static_cast<JackNetMasterManager*>(arg)->ShutDown(); | |||||
| } | |||||
| void JackNetMasterManager::ShutDown() | |||||
| { | { | ||||
| jack_log("JackNetMasterManager::ShutDown"); | jack_log("JackNetMasterManager::ShutDown"); | ||||
| JackNetMasterManager* manager = (JackNetMasterManager*)arg; | |||||
| if (manager->fRunning) { | |||||
| jack_client_kill_thread(manager->fClient, manager->fThread); | |||||
| manager->fRunning = false; | |||||
| if (fRunning) { | |||||
| jack_client_kill_thread(fClient, fThread); | |||||
| fRunning = false; | |||||
| } | } | ||||
| master_list_t::iterator it; | |||||
| for (it = fMasterList.begin(); it != fMasterList.end(); it++) { | |||||
| delete(*it); | |||||
| } | |||||
| fMasterList.clear(); | |||||
| fSocket.Close(); | |||||
| SocketAPIEnd(); | |||||
| } | } | ||||
| int JackNetMasterManager::SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg) | int JackNetMasterManager::SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg) | ||||
| @@ -96,7 +96,7 @@ namespace Jack | |||||
| private: | private: | ||||
| static void ShutDown(void* arg); | |||||
| static void SetShutDown(void* arg); | |||||
| static int SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg); | static int SetSyncCallback(jack_transport_state_t state, jack_position_t* pos, void* arg); | ||||
| static void* NetManagerThread(void* arg); | static void* NetManagerThread(void* arg); | ||||
| @@ -116,6 +116,7 @@ namespace Jack | |||||
| int KillMaster(session_params_t* params); | int KillMaster(session_params_t* params); | ||||
| int SyncCallback(jack_transport_state_t state, jack_position_t* pos); | int SyncCallback(jack_transport_state_t state, jack_position_t* pos); | ||||
| int CountIO(int flags); | int CountIO(int flags); | ||||
| void ShutDown(); | |||||
| public: | public: | ||||
| @@ -69,7 +69,7 @@ static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32; | |||||
| using namespace std; | using namespace std; | ||||
| #define JACK_LOG 1 | |||||
| //#define JACK_LOG 1 | |||||
| #ifdef JACK_LOG | #ifdef JACK_LOG | ||||
| #include <fstream> | #include <fstream> | ||||
| @@ -146,10 +146,8 @@ HRESULT _stdcall DllUnregisterServer() | |||||
| } | } | ||||
| // Globals | // Globals | ||||
| list<pair<string, string> > JackRouter::fConnections; | list<pair<string, string> > JackRouter::fConnections; | ||||
| //------------------------------------------------------------------------------------------ | //------------------------------------------------------------------------------------------ | ||||
| //------------------------------------------------------------------------------------------ | //------------------------------------------------------------------------------------------ | ||||
| JackRouter::JackRouter (LPUNKNOWN pUnk, HRESULT *phr) | JackRouter::JackRouter (LPUNKNOWN pUnk, HRESULT *phr) | ||||
| @@ -206,7 +204,6 @@ JackRouter::JackRouter() : AsioDriver() | |||||
| fAutoConnectOut = get_private_profile_int("AUTO_CONNECT", "output", 1, confPath.c_str()); | fAutoConnectOut = get_private_profile_int("AUTO_CONNECT", "output", 1, confPath.c_str()); | ||||
| fFloatSample = get_private_profile_int("IO", "float-sample", 0, confPath.c_str()); | fFloatSample = get_private_profile_int("IO", "float-sample", 0, confPath.c_str()); | ||||
| fAliasSystem = get_private_profile_int("AUTO_CONNECT", "alias", 0, confPath.c_str()); | fAliasSystem = get_private_profile_int("AUTO_CONNECT", "alias", 0, confPath.c_str()); | ||||
| FreeLibrary(handle); | FreeLibrary(handle); | ||||