From 6c6264701c7974f0e786a6e19d13cb0df09fc0e8 Mon Sep 17 00:00:00 2001 From: sletz Date: Thu, 28 Aug 2008 09:40:14 +0000 Subject: [PATCH] New JackLoadableInternalClient1 and JackLoadableInternalClient2 classes. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2826 0c269be4-1314-0410-8aa9-9f06e86f4224 --- common/JackInternalClient.cpp | 85 +++++++++++++++++++++++------------ common/JackInternalClient.h | 47 ++++++++++++++++--- common/JackServer.cpp | 4 +- 3 files changed, 100 insertions(+), 36 deletions(-) diff --git a/common/JackInternalClient.cpp b/common/JackInternalClient.cpp index 9ca36529..f6107877 100644 --- a/common/JackInternalClient.cpp +++ b/common/JackInternalClient.cpp @@ -172,21 +172,6 @@ JackClientControl* JackInternalClient::GetClientControl() const return const_cast(&fClientControl); } -JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackSynchro* table, const char* so_name, const char* object_data) - : JackInternalClient(server, table) -{ - snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data); - fParameters = NULL; - Init(so_name); -} - -JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackSynchro* table, const char* so_name, const JSList* parameters) - : JackInternalClient(server, table) -{ - fParameters = parameters; - Init(so_name); -} - void JackLoadableInternalClient::Init(const char* so_name) { char path_to_so[PATH_MAX + 1]; @@ -200,18 +185,6 @@ void JackLoadableInternalClient::Init(const char* so_name) throw - 1; } - fInitialize = (InitializeCallback)GetJackProc(fHandle, "jack_initialize"); - if (!fInitialize) { - UnloadJackModule(fHandle); - jack_error("symbol jack_initialize cannot be found in %s", so_name); - throw - 1; - } - - fInternalInitialize = (InternalInitializeCallback)GetJackProc(fHandle, "jack_internal_initialize"); - if (!fInternalInitialize) { - jack_info("No jack_internal_initialize entry-point for %s", so_name); - } - fFinish = (FinishCallback)GetJackProc(fHandle, "jack_finish"); if (!fFinish) { UnloadJackModule(fHandle); @@ -225,6 +198,44 @@ void JackLoadableInternalClient::Init(const char* so_name) } } +void JackLoadableInternalClient1::Init(const char* so_name) +{ + JackLoadableInternalClient::Init(so_name); + + fInitialize = (InitializeCallback)GetJackProc(fHandle, "jack_initialize"); + if (!fInitialize) { + UnloadJackModule(fHandle); + jack_error("symbol jack_initialize cannot be found in %s", so_name); + throw - 1; + } +} + +void JackLoadableInternalClient2::Init(const char* so_name) +{ + JackLoadableInternalClient::Init(so_name); + + fInitialize = (InternalInitializeCallback)GetJackProc(fHandle, "jack_internal_initialize"); + if (!fInitialize) { + UnloadJackModule(fHandle); + jack_error("symbol jack_internal_initialize cannot be found in %s", so_name); + throw - 1; + } +} + +JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, JackSynchro* table, const char* so_name, const char* object_data) + : JackLoadableInternalClient(server, table) +{ + snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data); + Init(so_name); +} + +JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, JackSynchro* table, const char* so_name, const JSList* parameters) + : JackLoadableInternalClient(server, table) +{ + fParameters = parameters; + Init(so_name); +} + JackLoadableInternalClient::~JackLoadableInternalClient() { if (fFinish) @@ -232,9 +243,10 @@ JackLoadableInternalClient::~JackLoadableInternalClient() UnloadJackModule(fHandle); } -int JackLoadableInternalClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) +int JackLoadableInternalClient1::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) { int res = -1; + if (JackInternalClient::Open(server_name, name, options, status) == 0) { if (fInitialize((jack_client_t*)this, fObjectData) == 0) { res = 0; @@ -243,6 +255,23 @@ int JackLoadableInternalClient::Open(const char* server_name, const char* name, fFinish = NULL; } } + + return res; +} + +int JackLoadableInternalClient2::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status) +{ + int res = -1; + + if (JackInternalClient::Open(server_name, name, options, status) == 0) { + if (fInitialize((jack_client_t*)this, fParameters) == 0) { + res = 0; + } else { + JackInternalClient::Close(); + fFinish = NULL; + } + } + return res; } diff --git a/common/JackInternalClient.h b/common/JackInternalClient.h index f52090a4..52b109d8 100644 --- a/common/JackInternalClient.h +++ b/common/JackInternalClient.h @@ -87,23 +87,58 @@ typedef jack_driver_desc_t * (*JackDriverDescFunction) (); class JackLoadableInternalClient : public JackInternalClient { - private: + protected: HANDLE fHandle; - InitializeCallback fInitialize; - InternalInitializeCallback fInternalInitialize; FinishCallback fFinish; JackDriverDescFunction fDescriptor; + + virtual void Init(const char* so_name); + + public: + + JackLoadableInternalClient(JackServer* server, JackSynchro* table) + :JackInternalClient(server, table), fHandle(NULL), fFinish(NULL), fDescriptor(NULL) + {} + virtual ~JackLoadableInternalClient(); + +}; + +class JackLoadableInternalClient1 : public JackLoadableInternalClient +{ + + private: + + InitializeCallback fInitialize; char fObjectData[JACK_LOAD_INIT_LIMIT]; + + void Init(const char* so_name); + + public: + + JackLoadableInternalClient1(JackServer* server, JackSynchro* table, const char* so_name, const char* object_data); + virtual ~JackLoadableInternalClient1() + {} + + int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); + +}; + +class JackLoadableInternalClient2 : public JackLoadableInternalClient +{ + + private: + + InternalInitializeCallback fInitialize; const JSList* fParameters; void Init(const char* so_name); public: - JackLoadableInternalClient(JackServer* server, JackSynchro* table, const char* so_name, const char* object_data); - JackLoadableInternalClient(JackServer* server, JackSynchro* table, const char* so_name, const JSList* parameters); - virtual ~JackLoadableInternalClient(); + JackLoadableInternalClient2(JackServer* server, JackSynchro* table, const char* so_name, const JSList* parameters); + virtual ~JackLoadableInternalClient2() + {} int Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status); diff --git a/common/JackServer.cpp b/common/JackServer.cpp index 0eaa082b..9aeaad24 100644 --- a/common/JackServer.cpp +++ b/common/JackServer.cpp @@ -156,7 +156,7 @@ int JackServer::Close() int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status) { try { - JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); + JackLoadableInternalClient* client = new JackLoadableInternalClient1(fInstance, GetSynchroTable(), so_name, objet_data); assert(client); return InternalClientLoadAux(client, client_name, options, int_ref, status); } catch (...) { @@ -170,7 +170,7 @@ int JackServer::InternalClientLoad(const char* client_name, const char* so_name, int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status) { try { - JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, parameters); + JackLoadableInternalClient* client = new JackLoadableInternalClient2(fInstance, GetSynchroTable(), so_name, parameters); assert(client); return InternalClientLoadAux(client, client_name, options, int_ref, status); } catch (...) {