git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2821 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
| @@ -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; | |||
| } | |||
| } | |||
| @@ -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) { | |||
| @@ -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); | |||
| @@ -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; | |||
| @@ -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 | |||
| @@ -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; | |||
| } | |||
| @@ -26,7 +26,33 @@ | |||
| #include <jack/jack.h> | |||
| #include <jack/control.h> | |||
| 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; | |||
| } | |||