diff --git a/common/JackControl.cpp b/common/JackControl.cpp index 55952508..07d816e6 100644 --- a/common/JackControl.cpp +++ b/common/JackControl.cpp @@ -44,6 +44,7 @@ #include "shm.h" #include "JackTools.h" #include "control_types.h" +#include "JackLockedEngine.h" using namespace Jack; @@ -104,6 +105,7 @@ struct jackctl_internal jack_driver_desc_t * desc_ptr; JSList * parameters; JSList * set_parameters; + int refnum; }; struct jackctl_parameter @@ -1033,14 +1035,21 @@ EXPORT bool jackctl_server_load_internal( jackctl_server * server, jackctl_internal * internal) { - return false; + int status; + server->engine->InternalClientLoad(internal->desc_ptr->name, internal->desc_ptr->name, internal->set_parameters, JackNullOption, &internal->refnum, &status); + return (internal->refnum > 0); } EXPORT bool jackctl_server_unload_internal( jackctl_server * server, jackctl_internal * internal) { - return false; + int status; + if (internal->refnum > 0) { + return (server->engine->GetEngine()->InternalClientUnload(internal->refnum, &status)); + } else { + return false; + } } diff --git a/common/JackInternalClient.cpp b/common/JackInternalClient.cpp index e51e996d..e87db41b 100644 --- a/common/JackInternalClient.cpp +++ b/common/JackInternalClient.cpp @@ -174,10 +174,24 @@ JackClientControl* JackInternalClient::GetClientControl() const 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]; BuildClientPath(path_to_so, sizeof(path_to_so), so_name); - snprintf(fObjectData, JACK_LOAD_INIT_LIMIT, object_data); + fHandle = LoadJackModule(path_to_so); jack_log("JackLoadableInternalClient::JackLoadableInternalClient path_to_so = %s", path_to_so); @@ -193,6 +207,11 @@ JackLoadableInternalClient::JackLoadableInternalClient(JackServer* server, JackS 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) { diff --git a/common/JackInternalClient.h b/common/JackInternalClient.h index 30df814c..f52090a4 100644 --- a/common/JackInternalClient.h +++ b/common/JackInternalClient.h @@ -80,6 +80,7 @@ class JackInternalClient : public JackClient #endif typedef int (*InitializeCallback)(jack_client_t*, const char*); +typedef int (*InternalInitializeCallback)(jack_client_t*, const JSList* params); typedef void (*FinishCallback)(void *); typedef jack_driver_desc_t * (*JackDriverDescFunction) (); @@ -90,13 +91,18 @@ class JackLoadableInternalClient : public JackInternalClient HANDLE fHandle; InitializeCallback fInitialize; + InternalInitializeCallback fInternalInitialize; FinishCallback fFinish; JackDriverDescFunction fDescriptor; char fObjectData[JACK_LOAD_INIT_LIMIT]; + 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(); 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 e5266c8a..ca9b26b6 100644 --- a/common/JackServer.cpp +++ b/common/JackServer.cpp @@ -154,12 +154,24 @@ 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) +{ + JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); + assert(client); + return InternalClientLoadAux(client, client_name, options, int_ref, status); +} + +int JackServer::InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status) +{ + JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, parameters); + assert(client); + return InternalClientLoadAux(client, client_name, options, int_ref, status); +} + +int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const char* client_name, int options, int* int_ref, int* status) { try { // Clear status *status = 0; - JackLoadableInternalClient* client = new JackLoadableInternalClient(fInstance, GetSynchroTable(), so_name, objet_data); - assert(client); int res = client->Open(JACK_DEFAULT_SERVER_NAME, client_name, (jack_options_t)options, (jack_status_t*)status); if (res < 0) { delete client; diff --git a/common/JackServer.h b/common/JackServer.h index bb7cba07..8d96fc8f 100644 --- a/common/JackServer.h +++ b/common/JackServer.h @@ -29,7 +29,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. #include "JackGlobals.h" #include "JackPlatformSynchro.h" -#include "JackPlatformSynchro.h" #include "JackPlatformServerChannel.h" @@ -40,6 +39,7 @@ class JackGraphManager; class JackDriverClientInterface; struct JackEngineControl; class JackLockedEngine; +class JackLoadableInternalClient; /*! \brief The Jack server. @@ -62,6 +62,8 @@ class EXPORT JackServer JackSynchro fSynchroTable[CLIENT_NUM]; bool fFreewheel; long fLoopback; + + int InternalClientLoadAux(JackLoadableInternalClient* client, const char* client_name, int options, int* int_ref, int* status); public: @@ -81,6 +83,7 @@ class EXPORT JackServer int SetBufferSize(jack_nframes_t buffer_size); int SetFreewheel(bool onoff); int InternalClientLoad(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int* status); + int InternalClientLoad(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int* status); void ClientKill(int refnum); // Transport management diff --git a/common/Jackdmp.cpp b/common/Jackdmp.cpp index d29229b7..46f1438f 100644 --- a/common/Jackdmp.cpp +++ b/common/Jackdmp.cpp @@ -319,7 +319,7 @@ int main(int argc, char* argv[]) driver_ctl = jackctl_server_get_driver(server_ctl, driver_name); if (driver_ctl == NULL) { - fprintf(stderr, "Unkown driver \"%s\"\n", driver_name); + fprintf(stderr, "Unkown driver \"%s\"\n", driver_name); goto fail_free; } diff --git a/tests/jack_server_control.cpp b/tests/jack_server_control.cpp index 779d6a09..a624af95 100644 --- a/tests/jack_server_control.cpp +++ b/tests/jack_server_control.cpp @@ -26,7 +26,33 @@ #include #include -jackctl_server_t * server; +static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name) +{ + const JSList * node_ptr = jackctl_server_get_drivers_list(server); + + while (node_ptr) { + if (strcmp(jackctl_driver_get_name((jackctl_driver_t *)node_ptr->data), driver_name) == 0) { + return (jackctl_driver_t *)node_ptr->data; + } + node_ptr = jack_slist_next(node_ptr); + } + + return NULL; +} + +static jackctl_internal_t * jackctl_server_get_internal(jackctl_server_t *server, const char *internal_name) +{ + const JSList * node_ptr = jackctl_server_get_internals_list(server); + + while (node_ptr) { + if (strcmp(jackctl_internal_get_name((jackctl_internal_t *)node_ptr->data), internal_name) == 0) { + return (jackctl_internal_t *)node_ptr->data; + } + node_ptr = jack_slist_next(node_ptr); + } + + return NULL; +} static void print_value(union jackctl_parameter_value value, jackctl_param_type_t type) { @@ -85,9 +111,11 @@ static void print_internal(jackctl_internal_t * internal) int main(int argc, char *argv[]) { + jackctl_server_t * server; const JSList * drivers; const JSList * internals; const JSList * node_ptr; + sigset_t signals; server = jackctl_server_create(); @@ -113,6 +141,12 @@ int main(int argc, char *argv[]) node_ptr = jack_slist_next(node_ptr); } + jackctl_server_start(server, jackctl_server_get_driver(server, "dummy")); + jackctl_server_load_internal(server, jackctl_server_get_internal(server, "audioadapter")); + + signals = jackctl_setup_signals(0); + jackctl_wait_signals(signals); + jackctl_server_destroy(server); return 0; }