Browse Source

Implement jackctl_server_load_internal and jackctl_server_unload_internal.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2821 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 17 years ago
parent
commit
d95ea4826a
7 changed files with 91 additions and 8 deletions
  1. +11
    -2
      common/JackControl.cpp
  2. +20
    -1
      common/JackInternalClient.cpp
  3. +6
    -0
      common/JackInternalClient.h
  4. +14
    -2
      common/JackServer.cpp
  5. +4
    -1
      common/JackServer.h
  6. +1
    -1
      common/Jackdmp.cpp
  7. +35
    -1
      tests/jack_server_control.cpp

+ 11
- 2
common/JackControl.cpp View File

@@ -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;
}
}



+ 20
- 1
common/JackInternalClient.cpp View File

@@ -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) {


+ 6
- 0
common/JackInternalClient.h View File

@@ -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);


+ 14
- 2
common/JackServer.cpp View File

@@ -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;


+ 4
- 1
common/JackServer.h View File

@@ -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


+ 1
- 1
common/Jackdmp.cpp View File

@@ -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;
}



+ 35
- 1
tests/jack_server_control.cpp View File

@@ -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;
}

Loading…
Cancel
Save