From 90349ced55e88743ca85911bdf1a41ca4e1fa424 Mon Sep 17 00:00:00 2001 From: sletz Date: Mon, 3 May 2010 21:09:02 +0000 Subject: [PATCH] Fix in JackAPI.cpp jack_client_new. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4002 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackAPI.cpp | 6 ++--- common/JackLibAPI.cpp | 62 +++++++++++++++++++++++++++++++++++++++++++++--- common/JackServerAPI.cpp | 58 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 118 insertions(+), 8 deletions(-) diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index 6acb3640..f6a67b99 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -56,9 +56,9 @@ extern "C" const char * jack_get_version_string(); - EXPORT jack_client_t * jack_client_open_aux (const char *client_name, + jack_client_t * jack_client_new_aux (const char *client_name, jack_options_t options, - jack_status_t *status, va_list ap); + jack_status_t *status); EXPORT jack_client_t * jack_client_open (const char *client_name, jack_options_t options, jack_status_t *status, ...); @@ -300,7 +300,7 @@ EXPORT jack_client_t* jack_client_new(const char* client_name) int options = JackUseExactName; if (getenv("JACK_START_SERVER") == NULL) options |= JackNoStartServer; - jack_client_t* res = jack_client_open_aux(client_name, (jack_options_t)options, NULL, NULL); + jack_client_t* res = jack_client_new_aux(client_name, (jack_options_t)options, NULL); JackGlobals::fOpenMutex->Unlock(); return res; } catch (std::bad_alloc& e) { diff --git a/common/JackLibAPI.cpp b/common/JackLibAPI.cpp index 45649c2d..570ab201 100644 --- a/common/JackLibAPI.cpp +++ b/common/JackLibAPI.cpp @@ -36,7 +36,10 @@ extern "C" { #endif - EXPORT jack_client_t * jack_client_open_aux (const char *client_name, + jack_client_t * jack_client_new_aux (const char *client_name, + jack_options_t options, + jack_status_t *status); + jack_client_t * jack_client_open_aux (const char *client_name, jack_options_t options, jack_status_t *status, va_list ap); EXPORT jack_client_t * jack_client_open (const char *client_name, @@ -52,7 +55,60 @@ extern "C" JackLibGlobals* JackLibGlobals::fGlobals = NULL; int JackLibGlobals::fClientCount = 0; -EXPORT jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) +jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t options, jack_status_t* status) +{ + jack_varargs_t va; /* variable arguments */ + jack_status_t my_status; + JackClient* client; + + if (client_name == NULL) { + jack_error("jack_client_new called with a NULL client_name"); + return NULL; + } + + jack_log("jack_client_new %s", client_name); + + if (status == NULL) /* no status from caller? */ + status = &my_status; /* use local status word */ + *status = (jack_status_t)0; + + /* validate parameters */ + if ((options & ~JackOpenOptions)) { + int my_status1 = *status | (JackFailure | JackInvalidOption); + *status = (jack_status_t)my_status1; + return NULL; + } + + /* parse variable arguments */ + jack_varargs_init(&va); + + JackLibGlobals::Init(); // jack library initialisation + + if (try_start_server(&va, options, status)) { + jack_error("jack server is not running or cannot be started"); + JackLibGlobals::Destroy(); // jack library destruction + return 0; + } + + if (JACK_DEBUG) { + client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode + } else { + client = new JackLibClient(GetSynchroTable()); + } + + int res = client->Open(va.server_name, client_name, options, status); + if (res < 0) { + delete client; + JackLibGlobals::Destroy(); // jack library destruction + int my_status1 = (JackFailure | JackServerError); + *status = (jack_status_t)my_status1; + return NULL; + } else { + return (jack_client_t*)client; + } +} + +jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) { jack_varargs_t va; /* variable arguments */ jack_status_t my_status; @@ -111,10 +167,10 @@ EXPORT jack_client_t* jack_client_open_aux(const char* client_name, jack_options EXPORT jack_client_t* jack_client_open(const char* ext_client_name, jack_options_t options, jack_status_t* status, ...) { - try { #ifdef __CLIENTDEBUG__ JackGlobals::CheckContext("jack_client_open"); #endif + try { assert(JackGlobals::fOpenMutex); JackGlobals::fOpenMutex->Lock(); va_list ap; diff --git a/common/JackServerAPI.cpp b/common/JackServerAPI.cpp index a9755fe8..ddc3df65 100644 --- a/common/JackServerAPI.cpp +++ b/common/JackServerAPI.cpp @@ -33,7 +33,10 @@ extern "C" { #endif - EXPORT jack_client_t * jack_client_open_aux (const char *client_name, + jack_client_t * jack_client_new_aux (const char *client_name, + jack_options_t options, + jack_status_t *status); + jack_client_t * jack_client_open_aux (const char *client_name, jack_options_t options, jack_status_t *status, va_list ap); EXPORT jack_client_t * jack_client_open (const char *client_name, @@ -48,7 +51,58 @@ extern "C" using namespace Jack; -EXPORT jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) +jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t options, jack_status_t* status) +{ + jack_varargs_t va; /* variable arguments */ + jack_status_t my_status; + JackClient* client; + + if (client_name == NULL) { + jack_error("jack_client_new called with a NULL client_name"); + return NULL; + } + + jack_log("jack_client_new %s", client_name); + + if (status == NULL) /* no status from caller? */ + status = &my_status; /* use local status word */ + *status = (jack_status_t)0; + + /* validate parameters */ + if ((options & ~JackOpenOptions)) { + int my_status1 = *status | (JackFailure | JackInvalidOption); + *status = (jack_status_t)my_status1; + return NULL; + } + + /* parse variable arguments */ + jack_varargs_init(&va); + + if (!JackServerGlobals::Init()) { // jack server initialisation + int my_status1 = (JackFailure | JackServerError); + *status = (jack_status_t)my_status1; + return NULL; + } + + if (JACK_DEBUG) { + client = new JackDebugClient(new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable())); // Debug mode + } else { + client = new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable()); + } + + int res = client->Open(va.server_name, client_name, options, status); + if (res < 0) { + delete client; + JackServerGlobals::Destroy(); // jack server destruction + int my_status1 = (JackFailure | JackServerError); + *status = (jack_status_t)my_status1; + return NULL; + } else { + return (jack_client_t*)client; + } +} + +jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t options, jack_status_t* status, va_list ap) { jack_varargs_t va; /* variable arguments */ jack_status_t my_status; -- 2.11.4.GIT