git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1638 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.68
| @@ -13,6 +13,10 @@ Tom Szilagyi | |||
| Jackdmp changes log | |||
| --------------------------- | |||
| 2007-10-24 Stephane Letz <letz@grame.fr> | |||
| * Implementation of server_name setting (-n) in progress. | |||
| 2007-10-23 Stephane Letz <letz@grame.fr> | |||
| * Correct jack_acquire_real_time_scheduling on OSX. | |||
| @@ -53,10 +53,8 @@ extern "C" | |||
| EXPORT int jack_internal_client_new (const char *client_name, | |||
| const char *load_name, | |||
| const char *load_init); | |||
| EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name); | |||
| EXPORT void jack_internal_client_close (const char *client_name); | |||
| EXPORT void my_jack_internal_client_close (jack_client_t* client); | |||
| EXPORT int jack_is_realtime (jack_client_t *client); | |||
| EXPORT int jack_is_realtime (jack_client_t *client); | |||
| EXPORT void jack_on_shutdown (jack_client_t *client, | |||
| void (*function)(void *arg), void *arg); | |||
| EXPORT int jack_set_process_callback (jack_client_t *client, | |||
| @@ -36,9 +36,7 @@ extern "C" | |||
| EXPORT int jack_internal_client_new (const char *client_name, | |||
| const char *load_name, | |||
| const char *load_init); | |||
| EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name, const char* dll_name, const char* object_data); | |||
| EXPORT void jack_internal_client_close (const char *client_name); | |||
| EXPORT void my_jack_internal_client_close (jack_client_t* client); | |||
| EXPORT int jack_is_realtime (jack_client_t *client); | |||
| EXPORT void jack_on_shutdown (jack_client_t *client, | |||
| void (*function)(void *arg), void *arg); | |||
| @@ -48,7 +48,7 @@ class JackClientChannelInterface | |||
| {} | |||
| // Open the Server/Client connection | |||
| virtual int Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| virtual int Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| { | |||
| return 0; | |||
| } | |||
| @@ -170,7 +170,7 @@ class JackServerChannelInterface | |||
| {} | |||
| // Open the Server/Client connection | |||
| virtual int Open(JackServer* server) | |||
| virtual int Open(const char* server_name, JackServer* server) | |||
| { | |||
| return 0; | |||
| } | |||
| @@ -194,7 +194,7 @@ class JackServerNotifyChannelInterface | |||
| {} | |||
| // Open the Server RT/Server connection | |||
| virtual int Open() | |||
| virtual int Open(const char* server_name) | |||
| { | |||
| return 0; | |||
| } | |||
| @@ -76,6 +76,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
| void* fTimebaseArg; | |||
| void* fSyncArg; | |||
| int fConditionnal; | |||
| char fServerName[64]; | |||
| JackThread* fThread; /*! Thread to execute the Process function */ | |||
| JackClientChannelInterface* fChannel; | |||
| @@ -99,7 +100,7 @@ class JackClient : public JackClientInterface, public JackRunnableInterface | |||
| JackClient(JackSynchro** table); | |||
| virtual ~JackClient(); | |||
| virtual int Open(const char* name, jack_options_t options, jack_status_t* status) = 0; | |||
| virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) = 0; | |||
| virtual int Close(); | |||
| virtual JackGraphManager* GetGraphManager() const = 0; | |||
| @@ -74,9 +74,9 @@ JackDebugClient::~JackDebugClient() | |||
| delete fClient; | |||
| } | |||
| int JackDebugClient::Open(const char* name, jack_options_t options, jack_status_t* status) | |||
| int JackDebugClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int res = fClient->Open(name, options, status); | |||
| int res = fClient->Open(server_name, name, options, status); | |||
| char provstr[256]; | |||
| char buffer[256]; | |||
| time_t curtime; | |||
| @@ -67,7 +67,7 @@ class JackDebugClient : public JackClient | |||
| JackDebugClient(JackClient* fTheClient); | |||
| virtual ~JackDebugClient(); | |||
| virtual int Open(const char* name, jack_options_t options, jack_status_t* status); | |||
| virtual int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
| int Close(); | |||
| virtual JackGraphManager* GetGraphManager() const; | |||
| @@ -67,7 +67,7 @@ int JackEngine::Open() | |||
| JackLog("JackEngine::Open\n"); | |||
| // Open audio thread => request thread communication channel | |||
| if (fChannel->Open() < 0) { | |||
| if (fChannel->Open(fEngineControl->fServerName) < 0) { | |||
| jack_error("Cannot connect to server"); | |||
| return -1; | |||
| } else { | |||
| @@ -515,7 +515,7 @@ int JackEngine::ClientExternalOpen(const char* name, int* ref, int* shared_engin | |||
| JackExternalClient* client = new JackExternalClient(); | |||
| if (!fSynchroTable[refnum]->Allocate(name, 0)) { | |||
| if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { | |||
| jack_error("Cannot allocate synchro"); | |||
| goto error; | |||
| } | |||
| @@ -562,7 +562,7 @@ int JackEngine::ClientInternalOpen(const char* name, int* ref, JackEngineControl | |||
| return -1; | |||
| } | |||
| if (!fSynchroTable[refnum]->Allocate(name, 0)) { | |||
| if (!fSynchroTable[refnum]->Allocate(name, fEngineControl->fServerName, 0)) { | |||
| jack_error("Cannot allocate synchro"); | |||
| return -1; | |||
| } | |||
| @@ -47,18 +47,22 @@ struct JackEngineControl : public JackShmMem | |||
| UInt64 fPeriod; | |||
| UInt64 fComputation; | |||
| UInt64 fConstraint; | |||
| char fServerName[64]; | |||
| JackFrameTimer fFrameTimer; | |||
| JackTransportEngine fTransport; | |||
| bool fVerbose; | |||
| JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose) | |||
| JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name) | |||
| :fSyncMode(sync), | |||
| fTemporary(temporary), | |||
| fTimeOutUsecs(timeout * 1000), | |||
| fRealTime(rt), | |||
| fPriority(priority), | |||
| fVerbose(verbose) | |||
| {} | |||
| { | |||
| snprintf(fServerName, sizeof(fServerName), server_name); | |||
| } | |||
| void InitFrameTime() | |||
| { | |||
| @@ -29,9 +29,9 @@ This program is free software; you can redistribute it and/or modify | |||
| namespace Jack | |||
| { | |||
| void JackFifo::BuildName(const char* name, char* res) | |||
| void JackFifo::BuildName(const char* name, const char* server_name, char* res) | |||
| { | |||
| sprintf(res, "%s/jack_fifo.%s", jack_client_dir, name); | |||
| sprintf(res, "%s/jack_fifo.%s_%s", jack_client_dir, server_name, name); | |||
| } | |||
| bool JackFifo::Signal() | |||
| @@ -103,10 +103,10 @@ bool JackFifo::TimedWait(long usec) | |||
| #endif | |||
| // Server side | |||
| bool JackFifo::Allocate(const char* name, int value) | |||
| bool JackFifo::Allocate(const char* name, const char* server_name, int value) | |||
| { | |||
| struct stat statbuf; | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| JackLog("JackFifo::Allocate name = %s\n", fName); | |||
| @@ -138,9 +138,9 @@ bool JackFifo::Allocate(const char* name, int value) | |||
| } | |||
| // Client side | |||
| bool JackFifo::ConnectAux(const char* name, int access) | |||
| bool JackFifo::ConnectAux(const char* name, const char* server_name, int access) | |||
| { | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| JackLog("JackFifo::ConnectAux name = %s\n", fName); | |||
| // Temporary... | |||
| @@ -159,19 +159,19 @@ bool JackFifo::ConnectAux(const char* name, int access) | |||
| } | |||
| } | |||
| bool JackFifo::Connect(const char* name) | |||
| bool JackFifo::Connect(const char* name, const char* server_name) | |||
| { | |||
| return ConnectAux(name, O_RDWR); | |||
| return ConnectAux(name, server_name, O_RDWR); | |||
| } | |||
| bool JackFifo::ConnectOutput(const char* name) | |||
| bool JackFifo::ConnectOutput(const char* name, const char* server_name) | |||
| { | |||
| return ConnectAux(name, O_WRONLY | O_NONBLOCK); | |||
| return ConnectAux(name, server_name, O_WRONLY | O_NONBLOCK); | |||
| } | |||
| bool JackFifo::ConnectInput(const char* name) | |||
| bool JackFifo::ConnectInput(const char* name, const char* server_name) | |||
| { | |||
| return ConnectAux(name, O_RDONLY); | |||
| return ConnectAux(name, server_name, O_RDONLY); | |||
| } | |||
| bool JackFifo::Disconnect() | |||
| @@ -40,11 +40,11 @@ class JackFifo : public JackSynchro | |||
| int fFifo; | |||
| pollfd fPoll; | |||
| bool ConnectAux(const char* name, int access); | |||
| bool ConnectAux(const char* name, const char* server_name, int access); | |||
| protected: | |||
| void BuildName(const char* name, char* res); | |||
| void BuildName(const char* name, const char* server_name, char* res); | |||
| public: | |||
| @@ -58,10 +58,10 @@ class JackFifo : public JackSynchro | |||
| bool Wait(); | |||
| bool TimedWait(long usec); | |||
| bool Allocate(const char* name, int value); | |||
| bool Connect(const char* name); | |||
| bool ConnectInput(const char* name); | |||
| bool ConnectOutput(const char* name); | |||
| bool Allocate(const char* name, const char* server_name, int value); | |||
| bool Connect(const char* name, const char* server_name); | |||
| bool ConnectInput(const char* name, const char* server_name); | |||
| bool ConnectOutput(const char* name, const char* server_name); | |||
| bool Disconnect(); | |||
| void Destroy(); | |||
| }; | |||
| @@ -65,11 +65,13 @@ JackInternalClient::~JackInternalClient() | |||
| delete fChannel; | |||
| } | |||
| int JackInternalClient::Open(const char* name, jack_options_t options, jack_status_t* status) | |||
| int JackInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int result; | |||
| char name_res[JACK_CLIENT_NAME_SIZE]; | |||
| JackLog("JackInternalClient::Open name = %s\n", name); | |||
| snprintf(fServerName, sizeof(fServerName), server_name); | |||
| fChannel->ClientCheck(name, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result); | |||
| if (result < 0) { | |||
| @@ -154,9 +156,9 @@ JackLoadableInternalClient::~JackLoadableInternalClient() | |||
| UnloadJackModule(fHandle); | |||
| } | |||
| int JackLoadableInternalClient::Open(const char* name, jack_options_t options, jack_status_t* status) | |||
| int JackLoadableInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int res = JackInternalClient::Open(name, options, status); | |||
| int res = JackInternalClient::Open(server_name, name, options, status); | |||
| if (res == 0) | |||
| fInitialize((jack_client_t*)this, fObjectData); | |||
| return res; | |||
| @@ -45,7 +45,7 @@ class JackInternalClient : public JackClient | |||
| JackInternalClient(JackServer* server, JackSynchro** table); | |||
| virtual ~JackInternalClient(); | |||
| int Open(const char* name, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
| JackGraphManager* GetGraphManager() const; | |||
| JackEngineControl* GetEngineControl() const; | |||
| @@ -95,7 +95,7 @@ class JackLoadableInternalClient : public JackInternalClient | |||
| JackLoadableInternalClient(JackServer* server, JackSynchro** table, const char* so_name, const char* object_data); | |||
| virtual ~JackLoadableInternalClient(); | |||
| int Open(const char* name, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
| }; | |||
| @@ -77,7 +77,7 @@ static jack_client_t* jack_client_open_aux(const char* client_name, jack_options | |||
| va_start(ap, status); | |||
| jack_varargs_parse(options, ap, &va); | |||
| va_end(ap); | |||
| JackLog("jack_client_open %s\n", client_name); | |||
| if (client_name == NULL) { | |||
| jack_error("jack_client_new called with a NULL client_name"); | |||
| @@ -100,7 +100,7 @@ static jack_client_t* jack_client_open_aux(const char* client_name, jack_options | |||
| JackClient* client = new JackLibClient(GetSynchroTable()); | |||
| #endif | |||
| int res = client->Open(client_name, options, status); | |||
| int res = client->Open(va.server_name, client_name, options, status); | |||
| if (res < 0) { | |||
| delete client; | |||
| JackLibGlobals::Destroy(); // jack library destruction | |||
| @@ -61,14 +61,16 @@ JackLibClient::~JackLibClient() | |||
| delete fChannel; | |||
| } | |||
| int JackLibClient::Open(const char* name, jack_options_t options, jack_status_t* status) | |||
| int JackLibClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int shared_engine, shared_client, shared_graph, result; | |||
| JackLog("JackLibClient::Open %s\n", name); | |||
| snprintf(fServerName, sizeof(fServerName), server_name); | |||
| // Open server/client channel | |||
| char name_res[JACK_CLIENT_NAME_SIZE]; | |||
| if (fChannel->Open(name, name_res, this, options, status) < 0) { | |||
| if (fChannel->Open(server_name, name, name_res, this, options, status) < 0) { | |||
| jack_error("Cannot connect to the server"); | |||
| goto error; | |||
| } | |||
| @@ -88,9 +90,9 @@ int JackLibClient::Open(const char* name, jack_options_t options, jack_status_t* | |||
| try { | |||
| // Map shared memory segments | |||
| JackLibGlobals::fGlobals->fEngineControl = shared_engine; | |||
| JackLibGlobals::fGlobals->fGraphManager = shared_graph; | |||
| fClientControl = shared_client; | |||
| JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName); | |||
| JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName); | |||
| fClientControl.SetShmIndex(shared_client, fServerName); | |||
| jack_verbose = GetEngineControl()->fVerbose; | |||
| } catch (int n) { | |||
| jack_error("Map shared memory segments exception %d", n); | |||
| @@ -109,7 +111,7 @@ int JackLibClient::Open(const char* name, jack_options_t options, jack_status_t* | |||
| #endif | |||
| */ | |||
| // Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process | |||
| if (!fSynchroTable[fClientControl->fRefNum]->Connect(name_res)) { | |||
| if (!fSynchroTable[fClientControl->fRefNum]->Connect(name_res, fServerName)) { | |||
| jack_error("Cannot ConnectSemaphore %s client", name_res); | |||
| goto error; | |||
| } | |||
| @@ -135,8 +137,8 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int | |||
| case kAddClient: | |||
| JackLog("JackClient::AddClient name = %s, ref = %ld \n", name, refnum); | |||
| // the synchro must be usable in I/O mode when several clients live in the same process | |||
| res = fSynchroTable[refnum]->Connect(name) ? 0 : -1; | |||
| // the synchro must be usable in I/O mode when several clients live in the same process | |||
| res = fSynchroTable[refnum]->Connect(name, fServerName) ? 0 : -1; | |||
| break; | |||
| case kRemoveClient: | |||
| @@ -44,7 +44,7 @@ class JackLibClient : public JackClient | |||
| JackLibClient(JackSynchro** table); | |||
| virtual ~JackLibClient(); | |||
| int Open(const char* name, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); | |||
| int ClientNotifyImp(int refnum, const char* name, int notify, int sync, int value); | |||
| @@ -26,9 +26,9 @@ This program is free software; you can redistribute it and/or modify | |||
| namespace Jack | |||
| { | |||
| void JackPosixSemaphore::BuildName(const char* name, char* res) | |||
| void JackPosixSemaphore::BuildName(const char* name, const char* server_name, char* res) | |||
| { | |||
| sprintf(res, "%s/jack_sem.%s", jack_client_dir, name); | |||
| sprintf(res, "%s/jack_sem.%s_%s", jack_client_dir, server_name, name); | |||
| } | |||
| bool JackPosixSemaphore::Signal() | |||
| @@ -123,9 +123,9 @@ bool JackPosixSemaphore::TimedWait(long usec) | |||
| } | |||
| // Server side : publish the semaphore in the global namespace | |||
| bool JackPosixSemaphore::Allocate(const char* name, int value) | |||
| bool JackPosixSemaphore::Allocate(const char* name, const char* server_name, int value) | |||
| { | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| JackLog("JackPosixSemaphore::Allocate name = %s val = %ld\n", fName, value); | |||
| if ((fSemaphore = sem_open(fName, O_CREAT, 0777, value)) == (sem_t*)SEM_FAILED) { | |||
| @@ -137,9 +137,9 @@ bool JackPosixSemaphore::Allocate(const char* name, int value) | |||
| } | |||
| // Client side : get the published semaphore from server | |||
| bool JackPosixSemaphore::ConnectInput(const char* name) | |||
| bool JackPosixSemaphore::ConnectInput(const char* name, const char* server_name) | |||
| { | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| JackLog("JackPosixSemaphore::Connect %s\n", fName); | |||
| // Temporary... | |||
| @@ -159,14 +159,14 @@ bool JackPosixSemaphore::ConnectInput(const char* name) | |||
| } | |||
| } | |||
| bool JackPosixSemaphore::Connect(const char* name) | |||
| bool JackPosixSemaphore::Connect(const char* name, const char* server_name) | |||
| { | |||
| return ConnectInput(name); | |||
| return ConnectInput(name, server_name); | |||
| } | |||
| bool JackPosixSemaphore::ConnectOutput(const char* name) | |||
| bool JackPosixSemaphore::ConnectOutput(const char* name, const char* server_name) | |||
| { | |||
| return ConnectInput(name); | |||
| return ConnectInput(name, server_name); | |||
| } | |||
| bool JackPosixSemaphore::Disconnect() | |||
| @@ -42,7 +42,7 @@ class JackPosixSemaphore : public JackSynchro | |||
| protected: | |||
| void BuildName(const char* name, char* res); | |||
| void BuildName(const char* name, const char* server_name, char* res); | |||
| public: | |||
| @@ -56,10 +56,10 @@ class JackPosixSemaphore : public JackSynchro | |||
| bool Wait(); | |||
| bool TimedWait(long usec); | |||
| bool Allocate(const char* name, int value); | |||
| bool Connect(const char* name); | |||
| bool ConnectInput(const char* name); | |||
| bool ConnectOutput(const char* name); | |||
| bool Allocate(const char* name, const char* server_name, int value); | |||
| bool Connect(const char* name, const char* server_name); | |||
| bool ConnectInput(const char* name, const char* server_name); | |||
| bool ConnectOutput(const char* name, const char* server_name); | |||
| bool Disconnect(); | |||
| void Destroy(); | |||
| }; | |||
| @@ -137,7 +137,7 @@ class JackInterProcessSync : public JackSyncInterface | |||
| bool Allocate(const char* name) | |||
| { | |||
| return fSynchro->Allocate(name, 0); | |||
| return fSynchro->Allocate(name, "", 0); | |||
| } | |||
| void Destroy() | |||
| @@ -147,7 +147,7 @@ class JackInterProcessSync : public JackSyncInterface | |||
| bool Connect(const char* name) | |||
| { | |||
| return fSynchro->Connect(name); | |||
| return fSynchro->Connect(name, ""); | |||
| } | |||
| bool TimedWait(long usec) | |||
| @@ -46,13 +46,13 @@ namespace Jack | |||
| JackServer* JackServer::fInstance = NULL; | |||
| JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose) | |||
| JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, const char* server_name) | |||
| { | |||
| JackGlobals::InitServer(); | |||
| for (int i = 0; i < CLIENT_NUM; i++) | |||
| fSynchroTable[i] = JackGlobals::MakeSynchro(); | |||
| fGraphManager = new JackGraphManager(); | |||
| fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose); | |||
| fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, server_name); | |||
| fEngine = new JackEngine(fGraphManager, fSynchroTable, fEngineControl); | |||
| fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver("freewheel", fEngine, fSynchroTable)); | |||
| fLoopbackDriver = new JackLoopbackDriver("loopback", fEngine, fSynchroTable); | |||
| @@ -89,7 +89,7 @@ JackServer::~JackServer() | |||
| int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) | |||
| { | |||
| if (fChannel->Open(this) < 0) { | |||
| if (fChannel->Open(fEngineControl->fServerName, this) < 0) { | |||
| jack_error("Server channel open error"); | |||
| return -1; | |||
| } | |||
| @@ -179,7 +179,7 @@ int JackServer::InternalClientLoad(const char* client_name, const char* so_name, | |||
| *status = 0; | |||
| JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); | |||
| assert(client); | |||
| int res = client->Open(client_name, (jack_options_t)options, (jack_status_t*)status); | |||
| int res = client->Open("unused", client_name, (jack_options_t)options, (jack_status_t*)status); | |||
| if (res < 0) { | |||
| delete client; | |||
| *int_ref = 0; | |||
| @@ -61,7 +61,7 @@ class EXPORT JackServer | |||
| public: | |||
| JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose); | |||
| JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, const char* server_name); | |||
| virtual ~JackServer(); | |||
| int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); | |||
| @@ -41,9 +41,6 @@ extern "C" | |||
| { | |||
| #endif | |||
| EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name, const char* dll_name, const char* object_data); | |||
| EXPORT void my_jack_internal_client_close(jack_client_t* ext_client); | |||
| EXPORT jack_client_t * jack_client_open (const char *client_name, | |||
| jack_options_t options, | |||
| jack_status_t *status, ...); | |||
| @@ -56,51 +53,6 @@ extern "C" | |||
| using namespace Jack; | |||
| EXPORT jack_client_t* my_jack_internal_client_new(const char* client_name, const char* dll_name, const char* object_data) | |||
| { | |||
| jack_status_t my_status = (jack_status_t)0; | |||
| JackLog("jack_internal_client_new %s", client_name); | |||
| if (client_name == NULL) { | |||
| jack_error("jack_internal_client_new called with a NULL client_name"); | |||
| return NULL; | |||
| } | |||
| JackClient* client; | |||
| try { | |||
| #ifdef __CLIENTDEBUG__ | |||
| client = new JackDebugClient(new JackLoadableInternalClient(JackServer::fInstance, GetSynchroTable(), dll_name, object_data)); // Debug mode | |||
| #else | |||
| client = new JackLoadableInternalClient(JackServer::fInstance, GetSynchroTable(), dll_name, object_data); // To improve... | |||
| #endif | |||
| } catch (...) { // Allocation or dynamic code loading failure | |||
| return NULL; | |||
| } | |||
| jack_options_t options = JackUseExactName; | |||
| int res = client->Open(client_name, options, &my_status); | |||
| if (res < 0) { | |||
| delete client; | |||
| return NULL; | |||
| } else { | |||
| return (jack_client_t*)client; | |||
| } | |||
| } | |||
| EXPORT void my_jack_internal_client_close(jack_client_t* ext_client) | |||
| { | |||
| JackLog("jack_internal_client_close"); | |||
| JackClient* client = (JackClient*)ext_client; | |||
| if (client == NULL) { | |||
| jack_error("jack_internal_client_close called with a NULL client"); | |||
| } else { | |||
| client->Close(); | |||
| delete client; | |||
| JackLog("jack_internal_client_close OK"); | |||
| } | |||
| } | |||
| EXPORT jack_client_t* jack_client_new(const char* client_name) | |||
| { | |||
| int options = JackUseExactName; | |||
| @@ -150,7 +102,7 @@ EXPORT jack_client_t* jack_client_open(const char* client_name, jack_options_t o | |||
| JackClient* client = new JackInternalClient(JackServer::fInstance, GetSynchroTable()); // To improve... | |||
| #endif | |||
| int res = client->Open(client_name, options, status); | |||
| int res = client->Open(va.server_name, client_name, options, status); | |||
| if (res < 0) { | |||
| delete client; | |||
| JackServerGlobals::Destroy(); // jack server destruction | |||
| @@ -46,7 +46,7 @@ static char* jack_default_server_name(void) | |||
| { | |||
| char* server_name; | |||
| if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL) | |||
| server_name = "jackdmp_default"; | |||
| server_name = "default"; | |||
| return server_name; | |||
| } | |||
| @@ -141,10 +141,10 @@ jack_cleanup_files(const char *server_name) | |||
| #endif | |||
| int JackServerGlobals::JackStart(jack_driver_desc_t* driver_desc, JSList* driver_params, int sync, int temporary, int time_out_ms, int rt, int priority, int loopback, int verbose) | |||
| int JackServerGlobals::JackStart(const char* server_name, jack_driver_desc_t* driver_desc, JSList* driver_params, int sync, int temporary, int time_out_ms, int rt, int priority, int loopback, int verbose) | |||
| { | |||
| JackLog("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld \n", sync, time_out_ms, rt, priority, verbose); | |||
| fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose); | |||
| fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name); | |||
| int res = fServer->Open(driver_desc, driver_params); | |||
| return (res < 0) ? res : fServer->Start(); | |||
| } | |||
| @@ -384,7 +384,7 @@ bool JackServerGlobals::Init() | |||
| free(argv[i]); | |||
| } | |||
| int res = JackStart(driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux); | |||
| int res = JackStart(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux); | |||
| if (res < 0) { | |||
| jack_error("Cannot start server... exit"); | |||
| JackDelete(); | |||
| @@ -46,7 +46,16 @@ struct JackServerGlobals | |||
| static bool Init(); | |||
| static void Destroy(); | |||
| static int JackStart(jack_driver_desc_t* driver_desc, JSList* driver_params, int sync, int temporary, int time_out_ms, int rt, int priority, int loopback, int verbose); | |||
| static int JackStart(const char* server_name, | |||
| jack_driver_desc_t* driver_desc, | |||
| JSList* driver_params, | |||
| int sync, | |||
| int temporary, | |||
| int time_out_ms, | |||
| int rt, | |||
| int priority, | |||
| int loopback, | |||
| int verbose); | |||
| static int JackStop(); | |||
| static int JackDelete(); | |||
| }; | |||
| @@ -26,8 +26,6 @@ namespace Jack | |||
| { | |||
| unsigned long JackShmMem::fSegmentNum = 0; | |||
| unsigned long JackShmMem::fSegmentCount = 0; | |||
| jack_shm_info_t JackShmMem::gInfo; | |||
| size_t JackMem::gSize = 0; | |||
| @@ -39,14 +37,6 @@ void* JackShmMem::operator new(size_t size) | |||
| snprintf(name, sizeof(name), "/jack_shared%ld", JackShmMem::fSegmentNum++); | |||
| if (JackShmMem::fSegmentCount++ == 0) { | |||
| JackLog("jack_initialize_shm\n"); | |||
| if (jack_initialize_shm_server() < 0) { | |||
| jack_error("cannot initialize shm", strerror(errno)); | |||
| goto error; | |||
| } | |||
| } | |||
| if (jack_shmalloc(name, size, &info)) { | |||
| jack_error("cannot create shared memory segment of size = %d", size, strerror(errno)); | |||
| goto error; | |||
| @@ -84,11 +74,6 @@ void JackShmMem::operator delete(void* p, size_t size) | |||
| jack_release_shm(&info); | |||
| jack_destroy_shm(&info); | |||
| if (--JackShmMem::fSegmentCount == 0) { | |||
| JackLog("jack_cleanup_shm\n"); | |||
| jack_cleanup_shm(); | |||
| } | |||
| } | |||
| void LockMemoryImp(void* ptr, size_t size) | |||
| @@ -100,7 +100,6 @@ class JackShmMem | |||
| jack_shm_info_t fInfo; | |||
| static unsigned long fSegmentNum; | |||
| static unsigned long fSegmentCount; | |||
| static jack_shm_info_t gInfo; | |||
| public: | |||
| @@ -152,11 +151,11 @@ class JackShmReadWritePtr | |||
| jack_shm_info_t fInfo; | |||
| void Init(int index) | |||
| void Init(int index, const char* server_name = "default") | |||
| { | |||
| if (fInfo.index < 0 && index >= 0) { | |||
| JackLog("JackShmReadWritePtr::Init %ld %ld\n", index, fInfo.index); | |||
| if (jack_initialize_shm_client() < 0) | |||
| if (jack_initialize_shm(server_name) < 0) | |||
| throw - 1; | |||
| fInfo.index = index; | |||
| if (jack_attach_shm(&fInfo)) { | |||
| @@ -174,9 +173,9 @@ class JackShmReadWritePtr | |||
| fInfo.attached_at = NULL; | |||
| } | |||
| JackShmReadWritePtr(int index) | |||
| JackShmReadWritePtr(int index, const char* server_name) | |||
| { | |||
| Init(index); | |||
| Init(index, server_name); | |||
| } | |||
| virtual ~JackShmReadWritePtr() | |||
| @@ -203,6 +202,11 @@ class JackShmReadWritePtr | |||
| Init(index); | |||
| return *this; | |||
| } | |||
| void SetShmIndex(int index, const char* server_name) | |||
| { | |||
| Init(index, server_name); | |||
| } | |||
| int GetShmIndex() | |||
| { | |||
| @@ -227,11 +231,11 @@ class JackShmReadWritePtr1 | |||
| jack_shm_info_t fInfo; | |||
| void Init(int index) | |||
| void Init(int index, const char* server_name = "default") | |||
| { | |||
| if (fInfo.index < 0 && index >= 0) { | |||
| JackLog("JackShmReadWritePtr1::Init %ld %ld\n", index, fInfo.index); | |||
| if (jack_initialize_shm_client() < 0) | |||
| if (jack_initialize_shm(server_name) < 0) | |||
| throw - 1; | |||
| fInfo.index = index; | |||
| if (jack_attach_shm(&fInfo)) { | |||
| @@ -255,9 +259,9 @@ class JackShmReadWritePtr1 | |||
| fInfo.attached_at = NULL; | |||
| } | |||
| JackShmReadWritePtr1(int index) | |||
| JackShmReadWritePtr1(int index, const char* server_name) | |||
| { | |||
| Init(index); | |||
| Init(index, server_name); | |||
| } | |||
| virtual ~JackShmReadWritePtr1() | |||
| @@ -284,6 +288,11 @@ class JackShmReadWritePtr1 | |||
| Init(index); | |||
| return *this; | |||
| } | |||
| void SetShmIndex(int index, const char* server_name) | |||
| { | |||
| Init(index, server_name); | |||
| } | |||
| int GetShmIndex() | |||
| { | |||
| @@ -308,11 +317,11 @@ class JackShmReadPtr | |||
| jack_shm_info_t fInfo; | |||
| void Init(int index) | |||
| void Init(int index, const char* server_name = "default") | |||
| { | |||
| if (fInfo.index < 0 && index >= 0) { | |||
| JackLog("JackShmPtrRead::Init %ld %ld\n", index, fInfo.index); | |||
| if (jack_initialize_shm_client() < 0) | |||
| if (jack_initialize_shm(server_name) < 0) | |||
| throw - 1; | |||
| fInfo.index = index; | |||
| if (jack_attach_shm_read(&fInfo)) { | |||
| @@ -330,9 +339,9 @@ class JackShmReadPtr | |||
| fInfo.attached_at = NULL; | |||
| } | |||
| JackShmReadPtr(int index) | |||
| JackShmReadPtr(int index, const char* server_name) | |||
| { | |||
| Init(index); | |||
| Init(index, server_name); | |||
| } | |||
| virtual ~JackShmReadPtr() | |||
| @@ -359,6 +368,11 @@ class JackShmReadPtr | |||
| Init(index); | |||
| return *this; | |||
| } | |||
| void SetShmIndex(int index, const char* server_name) | |||
| { | |||
| Init(index, server_name); | |||
| } | |||
| int GetShmIndex() | |||
| { | |||
| @@ -41,6 +41,8 @@ JackSocketClientChannel::~JackSocketClientChannel() | |||
| int JackSocketClientChannel::ServerCheck(const char* server_name) | |||
| { | |||
| JackLog("JackSocketClientChannel::ServerCheck = %s\n", server_name); | |||
| char jack_server_dir_name[512]; | |||
| snprintf(jack_server_dir_name, sizeof(jack_server_dir_name), "%s/%s", jack_server_dir, server_name); | |||
| // Connect to server | |||
| if (fRequestSocket.Connect(jack_server_dir, 0) < 0) { | |||
| @@ -52,12 +54,14 @@ int JackSocketClientChannel::ServerCheck(const char* server_name) | |||
| } | |||
| } | |||
| int JackSocketClientChannel::Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| int JackSocketClientChannel::Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int result = 0; | |||
| JackLog("JackSocketClientChannel::Open name = %s\n", name); | |||
| char jack_server_dir_name[512]; | |||
| snprintf(jack_server_dir_name, sizeof(jack_server_dir_name), "%s/%s", jack_server_dir, server_name); | |||
| if (fRequestSocket.Connect(jack_server_dir, 0) < 0) { | |||
| if (fRequestSocket.Connect(jack_server_dir_name, 0) < 0) { | |||
| jack_error("Cannot connect to server socket"); | |||
| goto error; | |||
| } | |||
| @@ -51,7 +51,7 @@ class JackSocketClientChannel : public JackClientChannelInterface, public JackRu | |||
| JackSocketClientChannel(); | |||
| virtual ~JackSocketClientChannel(); | |||
| int Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); | |||
| void Close(); | |||
| int Start(); | |||
| @@ -44,13 +44,16 @@ JackSocketServerChannel::~JackSocketServerChannel() | |||
| delete[] fPollTable; | |||
| } | |||
| int JackSocketServerChannel::Open(JackServer* server) | |||
| int JackSocketServerChannel::Open(const char* server_name, JackServer* server) | |||
| { | |||
| JackLog("JackSocketServerChannel::Open \n"); | |||
| char jack_server_dir_name[512]; | |||
| snprintf(jack_server_dir_name, sizeof(jack_server_dir_name), "%s/%s", jack_server_dir, server_name); | |||
| fServer = server; | |||
| // Prepare request socket | |||
| if (fRequestListenSocket.Bind(jack_server_dir, 0) < 0) { | |||
| if (fRequestListenSocket.Bind(jack_server_dir_name, 0) < 0) { | |||
| JackLog("JackSocketServerChannel::Open : cannot create result listen socket\n"); | |||
| return -1; | |||
| } | |||
| @@ -57,7 +57,7 @@ class JackSocketServerChannel : public JackServerChannelInterface, public JackRu | |||
| JackSocketServerChannel(); | |||
| virtual ~JackSocketServerChannel(); | |||
| int Open(JackServer* server); // Open the Server/Client connection | |||
| int Open(const char* server_name, JackServer* server); // Open the Server/Client connection | |||
| void Close(); // Close the Server/Client connection | |||
| // JackRunnableInterface interface | |||
| @@ -25,9 +25,12 @@ This program is free software; you can redistribute it and/or modify | |||
| namespace Jack | |||
| { | |||
| int JackSocketServerNotifyChannel::Open() | |||
| int JackSocketServerNotifyChannel::Open(const char* server_name) | |||
| { | |||
| if (fRequestSocket.Connect(jack_server_dir, 0) < 0) { | |||
| char jack_server_dir_name[512]; | |||
| snprintf(jack_server_dir_name, sizeof(jack_server_dir_name), "%s/%s", jack_server_dir, server_name); | |||
| if (fRequestSocket.Connect(jack_server_dir_name, 0) < 0) { | |||
| jack_error("Cannot connect to server socket"); | |||
| return -1; | |||
| } else { | |||
| @@ -43,7 +43,7 @@ class JackSocketServerNotifyChannel : public JackServerNotifyChannelInterface | |||
| virtual ~JackSocketServerNotifyChannel() | |||
| {} | |||
| int Open(); | |||
| int Open(const char* server_name); | |||
| void Close(); | |||
| void ClientNotify(int refnum, int notify, int value); | |||
| @@ -39,7 +39,7 @@ class JackSynchro | |||
| char fName[SYNC_MAX_NAME_SIZE]; | |||
| bool fFlush; // If true, signal are "flushed" : used for drivers that do no consume the signal | |||
| virtual void BuildName(const char* name, char* res) | |||
| virtual void BuildName(const char* name, const char* server_name, char* res) | |||
| {} | |||
| public: | |||
| @@ -65,19 +65,19 @@ class JackSynchro | |||
| { | |||
| return true; | |||
| } | |||
| virtual bool Allocate(const char* name, int value) | |||
| virtual bool Allocate(const char* name, const char* server_name, int value) | |||
| { | |||
| return true; | |||
| } | |||
| virtual bool Connect(const char* name) | |||
| virtual bool Connect(const char* name, const char* server_name) | |||
| { | |||
| return true; | |||
| } | |||
| virtual bool ConnectInput(const char* name) | |||
| virtual bool ConnectInput(const char* name, const char* server_name) | |||
| { | |||
| return true; | |||
| } | |||
| virtual bool ConnectOutput(const char* name) | |||
| virtual bool ConnectOutput(const char* name, const char* server_name) | |||
| { | |||
| return true; | |||
| } | |||
| @@ -73,7 +73,7 @@ static void usage(FILE* file) | |||
| copyright(file); | |||
| fprintf(file, "\n" | |||
| "usage: jackdmp [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n" | |||
| // " [ --name OR -n server-name ]\n" | |||
| " [ --name OR -n server-name ]\n" | |||
| // " [ --no-mlock OR -m ]\n" | |||
| // " [ --unlock OR -u ]\n" | |||
| " [ --timeout OR -t client-timeout-in-msecs ]\n" | |||
| @@ -103,10 +103,10 @@ static void DoNothingHandler(int sig) | |||
| write(1, buf, strlen(buf)); | |||
| } | |||
| static int JackStart(jack_driver_desc_t* driver_desc, JSList* driver_params, int sync, int temporary, int time_out_ms, int rt, int priority, int loopback, int verbose) | |||
| static int JackStart(const char* server_name, jack_driver_desc_t* driver_desc, JSList* driver_params, int sync, int temporary, int time_out_ms, int rt, int priority, int loopback, int verbose) | |||
| { | |||
| JackLog("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld \n", sync, time_out_ms, rt, priority, verbose); | |||
| fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose); | |||
| fServer = new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name); | |||
| int res = fServer->Open(driver_desc, driver_params); | |||
| return (res < 0) ? res : fServer->Start(); | |||
| } | |||
| @@ -141,7 +141,7 @@ static char* jack_default_server_name(void) | |||
| { | |||
| char* server_name; | |||
| if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL) | |||
| server_name = "jackdmp_default"; | |||
| server_name = "default"; | |||
| return server_name; | |||
| } | |||
| @@ -452,7 +452,7 @@ int main(int argc, char* argv[]) | |||
| if (!realtime && client_timeout == 0) | |||
| client_timeout = 500; /* 0.5 sec; usable when non realtime. */ | |||
| int res = JackStart(driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, jack_verbose); | |||
| int res = JackStart(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, jack_verbose); | |||
| if (res < 0) { | |||
| jack_error("Cannot start server... exit"); | |||
| JackDelete(); | |||
| @@ -460,14 +460,6 @@ int main(int argc, char* argv[]) | |||
| } | |||
| /* | |||
| jack_client_t* c1 = my_jack_internal_client_new("c1", "inprocess.so", "untitled"); | |||
| jack_client_t* c2 = my_jack_internal_client_new("c2", "inprocess.so", "untitled"); | |||
| jack_client_t* c3 = my_jack_internal_client_new("c3", "inprocess.so", "untitled"); | |||
| jack_client_t* c4 = my_jack_internal_client_new("c4", "inprocess.so", "untitled"); | |||
| jack_client_t* c5 = my_jack_internal_client_new("c5", "inprocess.so", "untitled"); | |||
| */ | |||
| /* | |||
| For testing purpose... | |||
| InternalMetro* client1 = new InternalMetro(1200, 0.4, 20, 80, "metro1"); | |||
| InternalMetro* client2 = new InternalMetro(600, 0.4, 20, 150, "metro2"); | |||
| @@ -523,15 +515,7 @@ int main(int argc, char* argv[]) | |||
| sigprocmask(SIG_UNBLOCK, &signals, 0); | |||
| } | |||
| /* | |||
| my_jack_internal_client_close(c1); | |||
| my_jack_internal_client_close(c2); | |||
| my_jack_internal_client_close(c3); | |||
| my_jack_internal_client_close(c4); | |||
| my_jack_internal_client_close(c5); | |||
| */ | |||
| JackStop(); | |||
| JackStop(); | |||
| jack_cleanup_shm(); | |||
| jack_cleanup_files(server_name); | |||
| @@ -146,8 +146,6 @@ extern "C" | |||
| const char *load_name, | |||
| const char *load_init); | |||
| jack_client_t* my_jack_internal_client_new(const char* client_name, const char* dll_name, const char* object_data); | |||
| /** | |||
| * Remove an internal client from a JACK server. | |||
| * | |||
| @@ -155,8 +153,6 @@ extern "C" | |||
| */ | |||
| void jack_internal_client_close (const char *client_name); | |||
| void my_jack_internal_client_close (jack_client_t* client); | |||
| /** | |||
| * @param client pointer to JACK client structure. | |||
| * | |||
| @@ -352,18 +352,6 @@ jack_initialize_shm (const char *server_name) | |||
| } | |||
| // steph | |||
| int jack_initialize_shm_server() | |||
| { | |||
| return jack_initialize_shm("default"); | |||
| } | |||
| int jack_initialize_shm_client() | |||
| { | |||
| return jack_initialize_shm("default"); | |||
| } | |||
| char* jack_shm_addr (jack_shm_info_t* si) | |||
| { | |||
| return (char*)si->attached_at; | |||
| @@ -15,7 +15,6 @@ | |||
| * along with this program; if not, write to the Free Software | |||
| * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| * | |||
| * $Id: varargs.h,v 1.3 2005/11/23 11:24:00 letz Exp $ | |||
| */ | |||
| #ifndef __jack_varargs_h__ | |||
| @@ -54,9 +53,12 @@ extern "C" | |||
| jack_varargs_init (va); | |||
| if ((options & JackServerName)) { | |||
| printf("jack_varargs_parse :JackServerName\n"); | |||
| char *sn = va_arg(ap, char *); | |||
| if (sn) | |||
| if (sn) { | |||
| printf("jack_varargs_parse : FOUND SERVER NAME %s\n", sn); | |||
| va->server_name = sn; | |||
| } | |||
| } | |||
| if ((options & JackLoadName)) | |||
| va->load_name = va_arg(ap, char *); | |||
| @@ -44,9 +44,11 @@ JackMachClientChannel::~JackMachClientChannel() | |||
| int JackMachClientChannel::ServerCheck(const char* server_name) | |||
| { | |||
| JackLog("JackMachClientChannel::ServerCheck = %s\n", server_name); | |||
| char jack_server_entry_name[512]; | |||
| snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||
| // Connect to server | |||
| if (!fServerPort.ConnectPort(jack_server_entry)) { | |||
| if (!fServerPort.ConnectPort(jack_server_entry_name)) { | |||
| jack_error("Cannot connect to server Mach port"); | |||
| return -1; | |||
| } else { | |||
| @@ -54,12 +56,14 @@ int JackMachClientChannel::ServerCheck(const char* server_name) | |||
| } | |||
| } | |||
| int JackMachClientChannel::Open(const char* name, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status) | |||
| int JackMachClientChannel::Open(const char* server_name, const char* name, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status) | |||
| { | |||
| JackLog("JackMachClientChannel::Open name = %s\n", name); | |||
| char jack_server_entry_name[512]; | |||
| snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||
| // Connect to server | |||
| if (!fServerPort.ConnectPort(jack_server_entry)) { | |||
| if (!fServerPort.ConnectPort(jack_server_entry_name)) { | |||
| jack_error("Cannot connect to server Mach port"); | |||
| return -1; | |||
| } | |||
| @@ -48,7 +48,7 @@ class JackMachClientChannel : public JackClientChannelInterface, public JackRunn | |||
| JackMachClientChannel(); | |||
| virtual ~JackMachClientChannel(); | |||
| int Open(const char* name, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status); | |||
| void Close(); | |||
| int Start(); | |||
| @@ -27,9 +27,9 @@ namespace Jack | |||
| mach_port_t JackMachSemaphore::fBootPort = 0; | |||
| void JackMachSemaphore::BuildName(const char* name, char* res) | |||
| void JackMachSemaphore::BuildName(const char* name, const char* server_name, char* res) | |||
| { | |||
| sprintf(res, "jack_mach_sem.%s", name); | |||
| sprintf(res, "jack_mach_sem.%s_%s", server_name, name); | |||
| } | |||
| bool JackMachSemaphore::Signal() | |||
| @@ -84,9 +84,9 @@ bool JackMachSemaphore::TimedWait(long usec) | |||
| } | |||
| // Server side : publish the semaphore in the global namespace | |||
| bool JackMachSemaphore::Allocate(const char* name, int value) | |||
| bool JackMachSemaphore::Allocate(const char* name, const char* server_name, int value) | |||
| { | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| mach_port_t task = mach_task_self(); | |||
| kern_return_t res; | |||
| @@ -128,9 +128,9 @@ bool JackMachSemaphore::Allocate(const char* name, int value) | |||
| } | |||
| // Client side : get the published semaphore from server | |||
| bool JackMachSemaphore::ConnectInput(const char* name) | |||
| bool JackMachSemaphore::ConnectInput(const char* name, const char* server_name) | |||
| { | |||
| BuildName(name, fName); | |||
| BuildName(name, server_name, fName); | |||
| kern_return_t res; | |||
| // Temporary... A REVOIR | |||
| @@ -157,14 +157,14 @@ bool JackMachSemaphore::ConnectInput(const char* name) | |||
| return true; | |||
| } | |||
| bool JackMachSemaphore::Connect(const char* name) | |||
| bool JackMachSemaphore::Connect(const char* name, const char* server_name) | |||
| { | |||
| return ConnectInput(name); | |||
| return ConnectInput(name, server_name); | |||
| } | |||
| bool JackMachSemaphore::ConnectOutput(const char* name) | |||
| bool JackMachSemaphore::ConnectOutput(const char* name, const char* server_name) | |||
| { | |||
| return ConnectInput(name); | |||
| return ConnectInput(name, server_name); | |||
| } | |||
| bool JackMachSemaphore::Disconnect() | |||
| @@ -45,7 +45,7 @@ class JackMachSemaphore : public JackSynchro | |||
| protected: | |||
| void BuildName(const char* name, char* res); | |||
| void BuildName(const char* name, const char* server_name, char* res); | |||
| public: | |||
| @@ -59,10 +59,10 @@ class JackMachSemaphore : public JackSynchro | |||
| bool Wait(); | |||
| bool TimedWait(long usec); | |||
| bool Allocate(const char* name, int value); | |||
| bool Connect(const char* name); | |||
| bool ConnectInput(const char* name); | |||
| bool ConnectOutput(const char* name); | |||
| bool Allocate(const char* name, const char* server_name, int value); | |||
| bool Connect(const char* name, const char* server_name); | |||
| bool ConnectInput(const char* name, const char* server_name); | |||
| bool ConnectOutput(const char* name, const char* server_name); | |||
| bool Disconnect(); | |||
| void Destroy(); | |||
| }; | |||
| @@ -42,11 +42,13 @@ JackMachServerChannel::~JackMachServerChannel() | |||
| delete fThread; | |||
| } | |||
| int JackMachServerChannel::Open(JackServer* server) | |||
| int JackMachServerChannel::Open(const char* server_name, JackServer* server) | |||
| { | |||
| JackLog("JackMachServerChannel::Open\n"); | |||
| char jack_server_entry_name[512]; | |||
| snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||
| if (!fServerPort.AllocatePort(jack_server_entry, 16)) { // 16 is the max possible value | |||
| if (!fServerPort.AllocatePort(jack_server_entry_name, 16)) { // 16 is the max possible value | |||
| jack_error("Cannot check in Jack server"); | |||
| return -1; | |||
| } | |||
| @@ -52,7 +52,7 @@ class JackMachServerChannel : public JackServerChannelInterface, public JackRunn | |||
| JackMachServerChannel(); | |||
| virtual ~JackMachServerChannel(); | |||
| int Open(JackServer* server); // Open the Server/Client connection | |||
| int Open(const char* server_name, JackServer* server); // Open the Server/Client connection | |||
| void Close(); // Close the Server/Client connection | |||
| JackEngine* GetEngine(); | |||
| @@ -24,11 +24,13 @@ This program is free software; you can redistribute it and/or modify | |||
| namespace Jack | |||
| { | |||
| int JackMachServerNotifyChannel::Open() | |||
| int JackMachServerNotifyChannel::Open(const char* server_name) | |||
| { | |||
| JackLog("JackMachServerChannel::Open\n"); | |||
| char jack_server_entry_name[512]; | |||
| snprintf(jack_server_entry_name, sizeof(jack_server_entry_name), "%s_%s", jack_server_entry, server_name); | |||
| if (!fClientPort.ConnectPort(jack_server_entry)) { | |||
| if (!fClientPort.ConnectPort(jack_server_entry_name)) { | |||
| jack_error("Cannot connect to server port"); | |||
| return -1; | |||
| } else { | |||
| @@ -44,7 +44,7 @@ class JackMachServerNotifyChannel : public JackServerNotifyChannelInterface | |||
| virtual ~JackMachServerNotifyChannel() | |||
| {} | |||
| int Open(); // Open the Server/Client connection | |||
| int Open(const char* server_name); // Open the Server/Client connection | |||
| void Close(); // Close the Server/Client connection | |||
| void ClientNotify(int refnum, int notify, int value); | |||
| @@ -463,7 +463,8 @@ int main (int argc, char *argv[]) | |||
| { | |||
| const char **inports; // array of PHY input/output | |||
| const char **outports; // array of PHY input/outputs | |||
| const char *server_name = NULL; | |||
| //const char *server_name = NULL; | |||
| const char *server_name = "titititi"; | |||
| const char **connexions1; | |||
| const char **connexions2; | |||
| jack_status_t status; | |||
| @@ -479,10 +480,10 @@ int main (int argc, char *argv[]) | |||
| int connected = 0; // check connect functions of ports | |||
| const char *options = "kRnqvt:"; | |||
| float ratio; // for speed calculation in freewheel mode | |||
| jack_options_t jack_options = JackNullOption; | |||
| jack_options_t jack_options = JackNullOption; | |||
| //jack_options_t jack_options = JackServerName; | |||
| struct option long_options[] = { | |||
| {"realtime", 0, 0, 'R' | |||
| }, | |||
| {"realtime", 0, 0, 'R'}, | |||
| {"non-realtime", 0, 0, 'n'}, | |||
| {"time", 0, 0, 't'}, | |||
| {"quiet", 0, 0, 'q'}, | |||
| @@ -42,8 +42,8 @@ struct ServerThread : public JackRunnableInterface { | |||
| ServerThread() | |||
| { | |||
| fServerSem->Allocate("JackSemServer", 0); | |||
| fClientSem->Allocate("JackSemClient", 0); | |||
| fServerSem->Allocate("JackSemServer", "default", 0); | |||
| fClientSem->Allocate("JackSemClient", "default", 0); | |||
| //fThread = new JackMachThread(this); | |||
| fThread->SetParams(0, 500*1000, 500*1000); | |||
| fThread->Start(); | |||
| @@ -76,8 +76,8 @@ struct ClientThread : public JackRunnableInterface { | |||
| ClientThread() | |||
| { | |||
| fServerSem->Connect("JackSemServer"); | |||
| fClientSem->Connect("JackSemClient"); | |||
| fServerSem->Connect("JackSemServer", "default"); | |||
| fClientSem->Connect("JackSemClient", "default"); | |||
| //fThread = new JackMachThread(this); | |||
| fThread->SetParams(0, 500*1000, 500*1000); | |||
| fThread->Start(); | |||
| @@ -114,7 +114,7 @@ void server(JackSynchro* sem) | |||
| char c; | |||
| printf("server\n"); | |||
| sem->Allocate("JackSem", 0); | |||
| sem->Allocate("JackSem", "default", 0); | |||
| while (((c = getchar()) != 'q')) { | |||
| @@ -141,7 +141,7 @@ void client(JackSynchro* sem) | |||
| char c; | |||
| printf("client\n"); | |||
| sem->Connect("JackSem"); | |||
| sem->Connect("JackSem", "default"); | |||
| while (((c = getchar()) != 'q')) { | |||
| @@ -129,8 +129,8 @@ int main(int ac, char *av []) | |||
| } | |||
| #endif | |||
| sem1->ConnectOutput(SERVER); | |||
| sem2->ConnectInput(CLIENT); | |||
| sem1->ConnectOutput(SERVER, "default"); | |||
| sem2->ConnectInput(CLIENT, "default"); | |||
| obj = new Test2(sem1, sem2); | |||
| @@ -185,8 +185,8 @@ int main(int ac, char *av []) | |||
| } | |||
| #endif | |||
| sem1->Allocate(SERVER, 0); | |||
| sem2->Allocate(CLIENT, 0); | |||
| sem1->Allocate(SERVER, "default", 0); | |||
| sem2->Allocate(CLIENT, "default", 0); | |||
| // run test in RT thread | |||
| obj = new Test1(sem1, sem2); | |||
| @@ -233,10 +233,10 @@ int main(int ac, char *av []) | |||
| } | |||
| #endif | |||
| sem1->Allocate(SERVER, 0); | |||
| sem2->Allocate(CLIENT, 0); | |||
| sem3->ConnectOutput(SERVER); | |||
| sem4->ConnectInput(CLIENT); | |||
| sem1->Allocate(SERVER, "default", 0); | |||
| sem2->Allocate(CLIENT, "default", 0); | |||
| sem3->ConnectOutput(SERVER, "default"); | |||
| sem4->ConnectInput(CLIENT, "default"); | |||
| // run test in RT thread | |||
| obj1 = new Test1(sem1, sem2); | |||
| @@ -49,7 +49,7 @@ int JackWinNamedPipeClientChannel::ServerCheck(const char* server_name) | |||
| } | |||
| } | |||
| int JackWinNamedPipeClientChannel::Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| int JackWinNamedPipeClientChannel::Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) | |||
| { | |||
| int result = 0; | |||
| JackLog("JackWinNamedPipeClientChannel::Open name = %s\n", name); | |||
| @@ -251,41 +251,41 @@ void JackWinNamedPipeClientChannel::SetTimebaseCallback(int refnum, int conditio | |||
| JackSetTimebaseCallbackRequest req(refnum, conditional); | |||
| JackResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| } | |||
| void JackWinNamedPipeClientChannel::GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) | |||
| { | |||
| JackGetInternalClientNameRequest req(refnum, int_ref); | |||
| JackGetInternalClientNameResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| strcpy(name_res, res.fName); | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) | |||
| { | |||
| JackInternalClientHandleRequest req(refnum, client_name); | |||
| JackInternalClientHandleResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *int_ref = res.fIntRefNum; | |||
| *status = res.fStatus; | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result) | |||
| { | |||
| JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options); | |||
| JackInternalClientLoadResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *int_ref = res.fIntRefNum; | |||
| *status = res.fStatus; | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) | |||
| { | |||
| JackInternalClientUnloadRequest req(refnum, int_ref); | |||
| JackInternalClientUnloadResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *status = res.fStatus; | |||
| } | |||
| } | |||
| void JackWinNamedPipeClientChannel::GetInternalClientName(int refnum, int int_ref, char* name_res, int* result) | |||
| { | |||
| JackGetInternalClientNameRequest req(refnum, int_ref); | |||
| JackGetInternalClientNameResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| strcpy(name_res, res.fName); | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result) | |||
| { | |||
| JackInternalClientHandleRequest req(refnum, client_name); | |||
| JackInternalClientHandleResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *int_ref = res.fIntRefNum; | |||
| *status = res.fStatus; | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result) | |||
| { | |||
| JackInternalClientLoadRequest req(refnum, client_name, so_name, objet_data, options); | |||
| JackInternalClientLoadResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *int_ref = res.fIntRefNum; | |||
| *status = res.fStatus; | |||
| } | |||
| void JackWinNamedPipeClientChannel::InternalClientUnload(int refnum, int int_ref, int* status, int* result) | |||
| { | |||
| JackInternalClientUnloadRequest req(refnum, int_ref); | |||
| JackInternalClientUnloadResult res; | |||
| ServerSyncCall(&req, &res, result); | |||
| *status = res.fStatus; | |||
| } | |||
| bool JackWinNamedPipeClientChannel::Init() | |||
| { | |||
| @@ -50,7 +50,7 @@ class JackWinNamedPipeClientChannel : public JackClientChannelInterface, public | |||
| JackWinNamedPipeClientChannel(); | |||
| virtual ~JackWinNamedPipeClientChannel(); | |||
| int Open(const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); | |||
| int Open(const char* server_name, const char* name, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status); | |||
| void Close(); | |||
| int Start(); | |||
| @@ -78,12 +78,12 @@ class JackWinNamedPipeClientChannel : public JackClientChannelInterface, public | |||
| void SetFreewheel(int onoff, int* result); | |||
| void ReleaseTimebase(int refnum, int* result); | |||
| void SetTimebaseCallback(int refnum, int conditional, int* result); | |||
| void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); | |||
| void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); | |||
| virtual void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result); | |||
| virtual void InternalClientUnload(int refnum, int int_ref, int* status, int* result); | |||
| void SetTimebaseCallback(int refnum, int conditional, int* result); | |||
| void GetInternalClientName(int refnum, int int_ref, char* name_res, int* result); | |||
| void InternalClientHandle(int refnum, const char* client_name, int* status, int* int_ref, int* result); | |||
| virtual void InternalClientLoad(int refnum, const char* client_name, const char* so_name, const char* objet_data, int options, int* status, int* int_ref, int* result); | |||
| virtual void InternalClientUnload(int refnum, int int_ref, int* status, int* result); | |||
| // JackRunnableInterface interface | |||
| bool Init(); | |||
| @@ -54,7 +54,7 @@ JackClientPipeThread::~JackClientPipeThread() | |||
| delete fThread; | |||
| } | |||
| int JackClientPipeThread::Open(JackServer* server) // Open the Server/Client connection | |||
| int JackClientPipeThread::Open(const char* server_name, JackServer* server) // Open the Server/Client connection | |||
| { | |||
| fServer = server; | |||
| @@ -257,46 +257,46 @@ int JackClientPipeThread::HandleRequest() | |||
| res.fResult = fServer->GetEngine()->SetTimebaseCallback(req.fRefNum, req.fConditionnal); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kGetInternalClientName: { | |||
| JackLog("JackRequest::kGetInternalClientName\n"); | |||
| JackGetInternalClientNameRequest req; | |||
| JackGetInternalClientNameResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientHandle: { | |||
| JackLog("JackRequest::kInternalClientHandle\n"); | |||
| JackInternalClientHandleRequest req; | |||
| JackInternalClientHandleResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientLoad: { | |||
| JackLog("JackRequest::kInternalClientLoad\n"); | |||
| JackInternalClientLoadRequest req; | |||
| JackInternalClientLoadResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientUnload: { | |||
| JackLog("JackRequest::kInternalClientUnload\n"); | |||
| JackInternalClientUnloadRequest req; | |||
| JackInternalClientUnloadResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kGetInternalClientName: { | |||
| JackLog("JackRequest::kGetInternalClientName\n"); | |||
| JackGetInternalClientNameRequest req; | |||
| JackGetInternalClientNameResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->GetInternalClientName(req.fIntRefNum, res.fName); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientHandle: { | |||
| JackLog("JackRequest::kInternalClientHandle\n"); | |||
| JackInternalClientHandleRequest req; | |||
| JackInternalClientHandleResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->InternalClientHandle(req.fName, &res.fStatus, &res.fIntRefNum); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientLoad: { | |||
| JackLog("JackRequest::kInternalClientLoad\n"); | |||
| JackInternalClientLoadRequest req; | |||
| JackInternalClientLoadResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->InternalClientLoad(req.fName, req.fDllName, req.fLoadInitName, req.fOptions, &res.fIntRefNum, &res.fStatus); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kInternalClientUnload: { | |||
| JackLog("JackRequest::kInternalClientUnload\n"); | |||
| JackInternalClientUnloadRequest req; | |||
| JackInternalClientUnloadResult res; | |||
| if (req.Read(fPipe) == 0) | |||
| res.fResult = fServer->GetEngine()->InternalClientUnload(req.fIntRefNum, &res.fStatus); | |||
| res.Write(fPipe); | |||
| break; | |||
| } | |||
| case JackRequest::kNotification: { | |||
| @@ -50,7 +50,7 @@ class JackClientPipeThread : public JackRunnableInterface | |||
| JackClientPipeThread(JackWinNamedPipeClient* pipe); | |||
| virtual ~JackClientPipeThread(); | |||
| int Open(JackServer* server); // Open the Server/Client connection | |||
| int Open(const char* server_name, JackServer* server); // Open the Server/Client connection | |||
| void Close(); // Close the Server/Client connection | |||
| int HandleRequest(); | |||
| @@ -25,7 +25,7 @@ This program is free software; you can redistribute it and/or modify | |||
| namespace Jack | |||
| { | |||
| int JackWinNamedPipeServerNotifyChannel::Open() | |||
| int JackWinNamedPipeServerNotifyChannel::Open(const char* server_name) | |||
| { | |||
| if (fRequestPipe.Connect(jack_server_dir, 0) < 0) { | |||
| jack_error("Cannot connect to server pipe"); | |||
| @@ -43,7 +43,7 @@ class JackWinNamedPipeServerNotifyChannel : public JackServerNotifyChannelInterf | |||
| virtual ~JackWinNamedPipeServerNotifyChannel() | |||
| {} | |||
| int Open(); | |||
| int Open(const char* server_name); | |||
| void Close(); | |||
| void ClientNotify(int refnum, int notify, int value); | |||