git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2924 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -22,6 +22,10 @@ Florian Faber | |||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2008-08-17 Stephane Letz <letz@grame.fr> | |||||
* New JackDriverInfo class to cleanup driver loading code. | |||||
2008-08-08 Stephane Letz <letz@grame.fr> | 2008-08-08 Stephane Letz <letz@grame.fr> | ||||
* Better symbols export for server and client side libraries. | * Better symbols export for server and client side libraries. | ||||
@@ -769,20 +769,20 @@ jack_internals_load (JSList * internals) { | |||||
#endif | #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 | #ifdef WIN32 | ||||
int errstr; | int errstr; | ||||
#else | #else | ||||
const char * errstr; | const char * errstr; | ||||
#endif | #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 | #ifdef WIN32 | ||||
if ((errstr = GetLastError ()) != 0) { | if ((errstr = GetLastError ()) != 0) { | ||||
jack_error ("can't load \"%s\": %ld", driver_desc->file, | jack_error ("can't load \"%s\": %ld", driver_desc->file, | ||||
@@ -794,31 +794,22 @@ jack_load_driver (jack_driver_desc_t * driver_desc) { | |||||
#endif | #endif | ||||
} else { | } 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 | #ifdef WIN32 | ||||
if ((info->initialize == NULL) && (errstr = GetLastError ()) != 0) { | |||||
if ((fInitialize == NULL) && (errstr = GetLastError ()) != 0) { | |||||
#else | #else | ||||
if ((info->initialize == NULL) && (errstr = dlerror ()) != 0) { | |||||
if ((fInitialize == NULL) && (errstr = dlerror ()) != 0) { | |||||
#endif | #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); | |||||
} | } | ||||
@@ -33,21 +33,35 @@ namespace Jack | |||||
}; | }; | ||||
typedef jack_driver_desc_t * (*JackDriverDescFunction) (); | 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); | jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name); | ||||
JSList * jack_drivers_load (JSList * drivers); | JSList * jack_drivers_load (JSList * drivers); | ||||
JSList * jack_internals_load (JSList * internals); | 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 int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]); | ||||
SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); | SERVER_EXPORT void jack_free_driver_params(JSList * param_ptr); | ||||
@@ -23,7 +23,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#endif | #endif | ||||
#include "JackSystemDeps.h" | #include "JackSystemDeps.h" | ||||
#include "JackServer.h" | #include "JackServer.h" | ||||
#include "JackTime.h" | #include "JackTime.h" | ||||
#include "JackFreewheelDriver.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); | fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl); | ||||
fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable())); | fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable())); | ||||
fLoopbackDriver = new JackLoopbackDriver(fEngine, GetSynchroTable()); | fLoopbackDriver = new JackLoopbackDriver(fEngine, GetSynchroTable()); | ||||
fDriverInfo = new JackDriverInfo(); | |||||
fAudioDriver = NULL; | |||||
fFreewheel = false; | fFreewheel = false; | ||||
fLoopback = loopback; | fLoopback = loopback; | ||||
fDriverInfo = NULL; | |||||
fAudioDriver = NULL; | |||||
fInstance = this; // Unique instance | fInstance = this; // Unique instance | ||||
jack_verbose = verbose; | jack_verbose = verbose; | ||||
} | } | ||||
@@ -74,10 +73,7 @@ JackServer::~JackServer() | |||||
delete fLoopbackDriver; | delete fLoopbackDriver; | ||||
delete fEngine; | delete fEngine; | ||||
delete fEngineControl; | delete fEngineControl; | ||||
if (fDriverInfo) { | |||||
UnloadDriverModule(fDriverInfo->handle); | |||||
free(fDriverInfo); | |||||
} | |||||
delete fDriverInfo; | |||||
} | } | ||||
int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params) | 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; | 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"); | jack_error("Cannot initialize driver"); | ||||
goto fail_close3; | goto fail_close3; | ||||
} | } | ||||
@@ -25,11 +25,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||||
#include "driver_interface.h" | #include "driver_interface.h" | ||||
#include "JackDriverLoader.h" | #include "JackDriverLoader.h" | ||||
#include "JackConnectionManager.h" | #include "JackConnectionManager.h" | ||||
#include "jslist.h" | |||||
#include "JackGlobals.h" | #include "JackGlobals.h" | ||||
#include "JackPlatformPlug.h" | #include "JackPlatformPlug.h" | ||||
#include "jslist.h" | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -49,7 +47,7 @@ class SERVER_EXPORT JackServer | |||||
private: | private: | ||||
jack_driver_info_t* fDriverInfo; | |||||
JackDriverInfo* fDriverInfo; | |||||
JackDriverClientInterface* fAudioDriver; | JackDriverClientInterface* fAudioDriver; | ||||
JackDriverClientInterface* fFreewheelDriver; | JackDriverClientInterface* fFreewheelDriver; | ||||
JackDriverClientInterface* fLoopbackDriver; | JackDriverClientInterface* fLoopbackDriver; | ||||
@@ -161,9 +161,9 @@ int JackMachThread::AcquireRealTime() | |||||
{ | { | ||||
jack_log("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld", | jack_log("JackMachThread::AcquireRealTime fPeriod = %ld fComputation = %ld fConstraint = %ld", | ||||
long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | long(fPeriod / 1000), long(fComputation / 1000), long(fConstraint / 1000)); | ||||
return (fThread) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; | return (fThread) ? AcquireRealTimeImp(fThread, fPeriod, fComputation, fConstraint) : -1; | ||||
} | } | ||||
int JackMachThread::AcquireRealTime(int priority) | int JackMachThread::AcquireRealTime(int priority) | ||||
{ | { | ||||
fPriority = priority; | fPriority = priority; | ||||