diff --git a/ChangeLog b/ChangeLog index c04d4fd9..4db84e39 100644 --- a/ChangeLog +++ b/ChangeLog @@ -22,6 +22,10 @@ Florian Faber Jackdmp changes log --------------------------- +2008-08-17 Stephane Letz + + * New JackDriverInfo class to cleanup driver loading code. + 2008-08-08 Stephane Letz * Better symbols export for server and client side libraries. diff --git a/common/JackDriverLoader.cpp b/common/JackDriverLoader.cpp index 0097cdfc..de6116e5 100644 --- a/common/JackDriverLoader.cpp +++ b/common/JackDriverLoader.cpp @@ -769,20 +769,20 @@ jack_internals_load (JSList * internals) { #endif -jack_driver_info_t * -jack_load_driver (jack_driver_desc_t * driver_desc) { +Jack::JackDriverClientInterface* JackDriverInfo::Open(jack_driver_desc_t* driver_desc, + Jack::JackLockedEngine* engine, + Jack::JackSynchro* synchro, + const JSList* params) +{ #ifdef WIN32 int errstr; #else const char * errstr; #endif - jack_driver_info_t *info; - - info = (jack_driver_info_t *) calloc (1, sizeof (*info)); - info->handle = LoadDriverModule (driver_desc->file); - - if (info->handle == NULL) { + fHandle = LoadDriverModule (driver_desc->file); + + if (fHandle == NULL) { #ifdef WIN32 if ((errstr = GetLastError ()) != 0) { jack_error ("can't load \"%s\": %ld", driver_desc->file, @@ -794,31 +794,22 @@ jack_load_driver (jack_driver_desc_t * driver_desc) { #endif } else { - jack_error ("bizarre error loading driver shared " - "object %s", driver_desc->file); + jack_error ("bizarre error loading driver shared object %s", driver_desc->file); } - goto fail; + return NULL; } - info->initialize = (initialize)GetProc(info->handle, "driver_initialize"); + fInitialize = (driverInitialize)GetProc(fHandle, "driver_initialize"); #ifdef WIN32 - if ((info->initialize == NULL) && (errstr = GetLastError ()) != 0) { + if ((fInitialize == NULL) && (errstr = GetLastError ()) != 0) { #else - if ((info->initialize == NULL) && (errstr = dlerror ()) != 0) { + if ((fInitialize == NULL) && (errstr = dlerror ()) != 0) { #endif - jack_error ("no initialize function in shared object %s\n", - driver_desc->file); - goto fail; + jack_error("no initialize function in shared object %s\n", driver_desc->file); + return NULL; } - return info; - -fail: - if (info->handle) { - UnloadDriverModule(info->handle); - } - free (info); - return NULL; + return fInitialize(engine, synchro, params); } diff --git a/common/JackDriverLoader.h b/common/JackDriverLoader.h index bc0137e3..209df729 100644 --- a/common/JackDriverLoader.h +++ b/common/JackDriverLoader.h @@ -33,21 +33,35 @@ namespace Jack }; typedef jack_driver_desc_t * (*JackDriverDescFunction) (); -typedef Jack::JackDriverClientInterface* (*initialize) (Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); +typedef Jack::JackDriverClientInterface* (*driverInitialize) (Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); -typedef struct _jack_driver_info +class JackDriverInfo { - Jack::JackDriverClientInterface* (*initialize)(Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); - DRIVER_HANDLE handle; -} -jack_driver_info_t; + + private: + + driverInitialize fInitialize; + DRIVER_HANDLE fHandle; + + public: + + JackDriverInfo():fInitialize(NULL),fHandle(NULL) + {} + ~JackDriverInfo() + { + if (fHandle) + UnloadDriverModule(fHandle); + } + + Jack::JackDriverClientInterface* Open(jack_driver_desc_t* driver_desc, Jack::JackLockedEngine*, Jack::JackSynchro*, const JSList*); + +}; jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name); JSList * jack_drivers_load (JSList * drivers); JSList * jack_internals_load (JSList * internals); -jack_driver_info_t * jack_load_driver (jack_driver_desc_t * driver_desc); SERVER_EXPORT int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]); SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); diff --git a/common/JackServer.cpp b/common/JackServer.cpp index 7ed272e1..84a3ed58 100644 --- a/common/JackServer.cpp +++ b/common/JackServer.cpp @@ -23,7 +23,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #endif #include "JackSystemDeps.h" - #include "JackServer.h" #include "JackTime.h" #include "JackFreewheelDriver.h" @@ -58,10 +57,10 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long pr fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl); fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable())); fLoopbackDriver = new JackLoopbackDriver(fEngine, GetSynchroTable()); + fDriverInfo = new JackDriverInfo(); + fAudioDriver = NULL; fFreewheel = false; fLoopback = loopback; - fDriverInfo = NULL; - fAudioDriver = NULL; fInstance = this; // Unique instance jack_verbose = verbose; } @@ -74,10 +73,7 @@ JackServer::~JackServer() delete fLoopbackDriver; delete fEngine; delete fEngineControl; - if (fDriverInfo) { - UnloadDriverModule(fDriverInfo->handle); - free(fDriverInfo); - } + delete fDriverInfo; } int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) @@ -95,11 +91,7 @@ int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) goto fail_close2; } - if ((fDriverInfo = jack_load_driver(driver_desc)) == NULL) { - goto fail_close3; - } - - if ((fAudioDriver = fDriverInfo->initialize(fEngine, GetSynchroTable(), driver_params)) == NULL) { + if ((fAudioDriver = fDriverInfo->Open(driver_desc, fEngine, GetSynchroTable(), driver_params)) == NULL) { jack_error("Cannot initialize driver"); goto fail_close3; } diff --git a/common/JackServer.h b/common/JackServer.h index 9d33464a..8c6d4a38 100644 --- a/common/JackServer.h +++ b/common/JackServer.h @@ -25,11 +25,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "driver_interface.h" #include "JackDriverLoader.h" #include "JackConnectionManager.h" -#include "jslist.h" - #include "JackGlobals.h" #include "JackPlatformPlug.h" - +#include "jslist.h" namespace Jack { @@ -49,7 +47,7 @@ class SERVER_EXPORT JackServer private: - jack_driver_info_t* fDriverInfo; + JackDriverInfo* fDriverInfo; JackDriverClientInterface* fAudioDriver; JackDriverClientInterface* fFreewheelDriver; JackDriverClientInterface* fLoopbackDriver; diff --git a/macosx/JackMachThread.cpp b/macosx/JackMachThread.cpp index 7ed47760..bad943be 100644 --- a/macosx/JackMachThread.cpp +++ b/macosx/JackMachThread.cpp @@ -161,9 +161,9 @@ int JackMachThread::AcquireRealTime() { jack_log("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld", long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); - return (fThread) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; } + int JackMachThread::AcquireRealTime(int priority) { fPriority = priority;