Browse Source

Add jackctl_internals_load and jackctl_server_free_internals.

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2815 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
sletz 17 years ago
parent
commit
cc46a63bbc
3 changed files with 195 additions and 2 deletions
  1. +70
    -0
      common/JackControl.cpp
  2. +122
    -2
      common/JackDriverLoader.cpp
  3. +3
    -0
      common/JackDriverLoader.h

+ 70
- 0
common/JackControl.cpp View File

@@ -527,6 +527,7 @@ EXPORT jackctl_server_t * jackctl_server_create()
}

server_ptr->drivers = NULL;
server_ptr->internals = NULL;
server_ptr->parameters = NULL;
server_ptr->engine = NULL;

@@ -959,3 +960,72 @@ EXPORT bool jackctl_server_unload_internal(
{
return false;
}

static int
jackctl_internals_load(
struct jackctl_server * server_ptr)
{
struct jackctl_driver * internal_ptr;
JSList *node_ptr;
JSList *descriptor_node_ptr;

descriptor_node_ptr = jack_internals_load(NULL);
if (descriptor_node_ptr == NULL)
{
jack_error("could not find any drivers in direver directory!");
return false;
}

while (descriptor_node_ptr != NULL)
{
internal_ptr = (struct jackctl_driver *)malloc(sizeof(struct jackctl_driver));
if (internal_ptr == NULL)
{
jack_error("memory allocation of jackctl_driver structure failed.");
goto next;
}

internal_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data;
internal_ptr->parameters = NULL;
internal_ptr->set_parameters = NULL;

if (!jackctl_add_driver_parameters(internal_ptr))
{
assert(internal_ptr->parameters == NULL);
free(internal_ptr);
goto next;
}

server_ptr->internals = jack_slist_append(server_ptr->internals, internal_ptr);

next:
node_ptr = descriptor_node_ptr;
descriptor_node_ptr = descriptor_node_ptr->next;
free(node_ptr);
}

return true;
}

static
void
jackctl_server_free_internals(
struct jackctl_server * server_ptr)
{
JSList * next_node_ptr;
struct jackctl_driver * internal_ptr;

while (server_ptr->internals)
{
next_node_ptr = server_ptr->internals->next;
internal_ptr = (struct jackctl_driver *)server_ptr->internals->data;

jackctl_free_driver_parameters(internal_ptr);
free(internal_ptr->desc_ptr->params);
free(internal_ptr->desc_ptr);
free(internal_ptr);

free(server_ptr->internals);
server_ptr->internals = next_node_ptr;
}
}

+ 122
- 2
common/JackDriverLoader.cpp View File

@@ -26,11 +26,13 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#pragma warning (disable : 4786)
#endif

/*
#ifndef WIN32
#ifndef ADDON_DIR
#include "config.h"
#endif
#endif
*/

#include "JackDriverLoader.h"
#include "JackConstants.h"
@@ -452,10 +454,10 @@ jack_drivers_get_descriptor (JSList * drivers, const char * sofile)

#ifdef WIN32
if ((so_get_descriptor == NULL) && (dlerr = GetLastError()) != 0) {
jack_log("Jack::jack_drivers_get_descriptor : dll is not a driver, error ld", dlerr);
jack_error("jack_drivers_get_descriptor err = %ld", dlerr);
#else
if ((so_get_descriptor == NULL) && (dlerr = dlerror ()) != NULL) {
jack_error("%s", dlerr);
jack_error("jack_drivers_get_descriptor err = %s", dlerr);
#endif

UnloadDriverModule(dlhandle);
@@ -616,6 +618,124 @@ jack_drivers_load (JSList * drivers) {

#endif

#ifdef WIN32

JSList *
jack_internals_load (JSList * internals) {
char * driver_dir;
char driver_dir_storage[512];
char dll_filename[512];
WIN32_FIND_DATA filedata;
HANDLE file;
const char * ptr = NULL;
JSList * driver_list = NULL;
jack_driver_desc_t * desc;

if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) {
// for WIN32 ADDON_DIR is defined in JackConstants.h as relative path
GetCurrentDirectory(512, driver_dir_storage);
strcat(driver_dir_storage, "/");
strcat(driver_dir_storage, ADDON_DIR);
driver_dir = driver_dir_storage;
}

sprintf(dll_filename, "%s/*.dll", driver_dir);

file = (HANDLE )FindFirstFile(dll_filename, &filedata);

if (file == INVALID_HANDLE_VALUE) {
jack_error("error");
return NULL;
}

do {
ptr = strrchr (filedata.cFileName, '.');
if (!ptr) {
continue;
}
ptr++;
if (strncmp ("dll", ptr, 3) != 0) {
continue;
}

desc = jack_drivers_get_descriptor (internals, filedata.cFileName);
if (desc) {
driver_list = jack_slist_append (driver_list, desc);
}

} while (FindNextFile(file, &filedata));

if (!driver_list) {
jack_error ("could not find any internals in %s!\n", driver_dir);
return NULL;
}

return driver_list;
}

#else

JSList *
jack_internals_load (JSList * internals) {
struct dirent * dir_entry;
DIR * dir_stream;
const char * ptr;
int err;
JSList * driver_list = NULL;
jack_driver_desc_t * desc;

const char* driver_dir;
if ((driver_dir = getenv("JACK_DRIVER_DIR")) == 0) {
driver_dir = ADDON_DIR;
}

/* search through the driver_dir and add get descriptors
from the .so files in it */
dir_stream = opendir (driver_dir);
if (!dir_stream) {
jack_error ("could not open driver directory %s: %s\n",
driver_dir, strerror (errno));
return NULL;
}

while ((dir_entry = readdir(dir_stream))) {

/* check the filename is of the right format */
if (strncmp ("jack_", dir_entry->d_name, 5) != 0) {
continue;
}

ptr = strrchr (dir_entry->d_name, '.');
if (!ptr) {
continue;
}
ptr++;
if (strncmp ("so", ptr, 2) != 0) {
continue;
}

desc = jack_drivers_get_descriptor (internals, dir_entry->d_name);
if (desc) {
driver_list = jack_slist_append (driver_list, desc);
}
}

err = closedir (dir_stream);
if (err) {
jack_error ("error closing internal directory %s: %s\n",
driver_dir, strerror (errno));
}

if (!driver_list) {
jack_error ("could not find any internals in %s!\n", driver_dir);
return NULL;
}

return driver_list;
}

#endif

jack_driver_info_t *
jack_load_driver (jack_driver_desc_t * driver_desc) {
#ifdef WIN32


+ 3
- 0
common/JackDriverLoader.h View File

@@ -62,7 +62,10 @@ jack_driver_info_t;

jack_driver_desc_t * jack_find_driver_descriptor (JSList * drivers, const char * name);
jack_driver_desc_t * jack_drivers_get_descriptor (JSList * drivers, const char * sofile);

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);
EXPORT int jackctl_parse_driver_params (jackctl_driver * driver_ptr, int argc, char* argv[]);
EXPORT void jack_free_driver_params(JSList * param_ptr);


Loading…
Cancel
Save