00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifdef WIN32
00022 #pragma warning (disable : 4786)
00023 #endif
00024
00025 #include "JackInternalClient.h"
00026 #include "JackGraphManager.h"
00027 #include "JackServer.h"
00028 #include "JackDebugClient.h"
00029 #include "JackServerGlobals.h"
00030 #include "JackError.h"
00031 #include "varargs.h"
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #ifdef WIN32
00044 #define EXPORT __declspec(dllexport)
00045 #else
00046 #define EXPORT
00047 #endif
00048
00049 #ifdef __cplusplus
00050 extern "C"
00051 {
00052 #endif
00053
00054 EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name);
00055 EXPORT void my_jack_internal_client_close(jack_client_t* ext_client);
00056
00057 EXPORT jack_client_t * jack_client_open (const char *client_name,
00058 jack_options_t options,
00059 jack_status_t *status, ...);
00060 EXPORT jack_client_t * jack_client_new (const char *client_name);
00061 EXPORT int jack_client_close (jack_client_t *client);
00062
00063 #ifdef __cplusplus
00064 }
00065 #endif
00066
00067 using namespace Jack;
00068
00069 EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name)
00070 {
00071 JackLog("jack_internal_client_new %s", client_name);
00072 if (client_name == NULL) {
00073 jack_error("jack_internal_client_new called with a NULL client_name");
00074 return NULL;
00075 }
00076 #ifdef __CLIENTDEBUG__
00077 JackClient* client = new JackDebugClient(new JackInternalClient(JackServer::fInstance, GetSynchroTable()));
00078 #else
00079 JackClient* client = new JackInternalClient(JackServer::fInstance, GetSynchroTable());
00080 #endif
00081
00082 int res = client->Open(client_name);
00083 if (res < 0) {
00084 delete client;
00085 return NULL;
00086 } else {
00087 return (jack_client_t*)client;
00088 }
00089 }
00090
00091 EXPORT void my_jack_internal_client_close(jack_client_t* ext_client)
00092 {
00093 JackLog("jack_internal_client_close");
00094 JackClient* client = (JackClient*)ext_client;
00095 if (client == NULL) {
00096 jack_error("jack_internal_client_close called with a NULL client");
00097 } else {
00098 int res = client->Deactivate();
00099 JackLog("jack_internal_client_close Deactivate %ld", res);
00100 res = client->Close();
00101 delete client;
00102 JackLog("jack_internal_client_close OK");
00103 }
00104 }
00105
00106 EXPORT jack_client_t* jack_client_new(const char* client_name)
00107 {
00108 int options = JackUseExactName;
00109 if (getenv("JACK_START_SERVER") == NULL)
00110 options |= JackNoStartServer;
00111
00112 return jack_client_open(client_name, (jack_options_t)options, NULL);
00113 }
00114
00115
00116 EXPORT jack_client_t* jack_client_open(const char* client_name, jack_options_t options, jack_status_t* status, ...)
00117 {
00118 va_list ap;
00119 jack_varargs_t va;
00120 jack_status_t my_status;
00121
00122 if (status == NULL)
00123 status = &my_status;
00124 *status = (jack_status_t)0;
00125
00126
00127 if ((options & ~JackOpenOptions)) {
00128 int my_status1 = *status | (JackFailure | JackInvalidOption);
00129 *status = (jack_status_t)my_status1;
00130 return NULL;
00131 }
00132
00133
00134 va_start(ap, status);
00135 jack_varargs_parse(options, ap, &va);
00136 va_end(ap);
00137
00138 JackLog("jack_client_open %s\n", client_name);
00139 if (client_name == NULL) {
00140 jack_error("jack_client_new called with a NULL client_name");
00141 return NULL;
00142 }
00143
00144 JackServerGlobals::Init();
00145
00146 #ifdef __CLIENTDEBUG__
00147 JackClient* client = new JackDebugClient(new JackInternalClient(JackServer::fInstance, GetSynchroTable()));
00148 #else
00149 JackClient* client = new JackInternalClient(JackServer::fInstance, GetSynchroTable());
00150 #endif
00151
00152 int res = client->Open(client_name);
00153 if (res < 0) {
00154 delete client;
00155 JackServerGlobals::Destroy();
00156 return NULL;
00157 } else {
00158 *status = (jack_status_t)0;
00159 return (jack_client_t*)client;
00160 }
00161 return NULL;
00162 }
00163
00164 EXPORT int jack_client_close(jack_client_t* ext_client)
00165 {
00166 JackLog("jack_client_close\n");
00167 JackClient* client = (JackClient*)ext_client;
00168 if (client == NULL) {
00169 jack_error("jack_client_close called with a NULL client");
00170 return -1;
00171 }
00172 int res = client->Close();
00173 delete client;
00174 JackLog("jack_client_close OK\n");
00175 JackServerGlobals::Destroy();
00176 return res;
00177 }
00178