git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2340 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -0,0 +1,921 @@ | |||
/* -*- Mode: C++ ; c-basic-offset: 4 -*- */ | |||
/* | |||
JACK control API implementation | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef WIN32 | |||
#include <stdbool.h> | |||
#include <stdint.h> | |||
#include <dirent.h> | |||
#include <pthread.h> | |||
#endif | |||
#include "types.h" | |||
#include <string.h> | |||
#include <errno.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <signal.h> | |||
#include "jslist.h" | |||
#include "driver_interface.h" | |||
#include "JackError.h" | |||
#include "JackServer.h" | |||
#include "shm.h" | |||
#include "JackTools.h" | |||
#include "control_types.h" | |||
using namespace Jack; | |||
struct jackctl_server | |||
{ | |||
JSList * drivers; | |||
JSList * parameters; | |||
class JackServer * engine; | |||
/* string, server name */ | |||
union jackctl_parameter_value name; | |||
union jackctl_parameter_value default_name; | |||
/* bool, whether to be "realtime" */ | |||
union jackctl_parameter_value realtime; | |||
union jackctl_parameter_value default_realtime; | |||
/* int32_t */ | |||
union jackctl_parameter_value realtime_priority; | |||
union jackctl_parameter_value default_realtime_priority; | |||
/* bool, whether to exit once all clients have closed their connections */ | |||
union jackctl_parameter_value temporary; | |||
union jackctl_parameter_value default_temporary; | |||
/* bool, whether to be verbose */ | |||
union jackctl_parameter_value verbose; | |||
union jackctl_parameter_value default_verbose; | |||
/* int32_t, msecs; if zero, use period size. */ | |||
union jackctl_parameter_value client_timeout; | |||
union jackctl_parameter_value default_client_timeout; | |||
/* uint32_t, ports of the loopback driver */ | |||
union jackctl_parameter_value loopback_ports; | |||
union jackctl_parameter_value default_loopback_ports; | |||
/* bool */ | |||
union jackctl_parameter_value replace_registry; | |||
union jackctl_parameter_value default_replace_registry; | |||
/* bool, synchronous or asynchronous engine mode */ | |||
union jackctl_parameter_value sync; | |||
union jackctl_parameter_value default_sync; | |||
}; | |||
struct jackctl_driver | |||
{ | |||
jack_driver_desc_t * desc_ptr; | |||
JSList * parameters; | |||
JSList * set_parameters; | |||
}; | |||
struct jackctl_parameter | |||
{ | |||
const char * name; | |||
const char * short_description; | |||
const char * long_description; | |||
jackctl_param_type_t type; | |||
bool is_set; | |||
union jackctl_parameter_value * value_ptr; | |||
union jackctl_parameter_value * default_value_ptr; | |||
union jackctl_parameter_value value; | |||
union jackctl_parameter_value default_value; | |||
struct jackctl_driver * driver_ptr; | |||
char id; | |||
jack_driver_param_t * driver_parameter_ptr; | |||
}; | |||
static | |||
struct jackctl_parameter * | |||
jackctl_add_parameter( | |||
JSList ** parameters_list_ptr_ptr, | |||
const char * name, | |||
const char * short_description, | |||
const char * long_description, | |||
jackctl_param_type_t type, | |||
union jackctl_parameter_value * value_ptr, | |||
union jackctl_parameter_value * default_value_ptr, | |||
union jackctl_parameter_value value) | |||
{ | |||
struct jackctl_parameter * parameter_ptr; | |||
parameter_ptr = (struct jackctl_parameter *)malloc(sizeof(struct jackctl_parameter)); | |||
if (parameter_ptr == NULL) | |||
{ | |||
jack_error("Cannot allocate memory for jackctl_parameter structure."); | |||
goto fail; | |||
} | |||
parameter_ptr->name = name; | |||
parameter_ptr->short_description = short_description; | |||
parameter_ptr->long_description = long_description; | |||
parameter_ptr->type = type; | |||
parameter_ptr->is_set = false; | |||
if (value_ptr == NULL) | |||
{ | |||
value_ptr = ¶meter_ptr->value; | |||
} | |||
if (default_value_ptr == NULL) | |||
{ | |||
default_value_ptr = ¶meter_ptr->default_value; | |||
} | |||
parameter_ptr->value_ptr = value_ptr; | |||
parameter_ptr->default_value_ptr = default_value_ptr; | |||
*value_ptr = *default_value_ptr = value; | |||
parameter_ptr->driver_ptr = NULL; | |||
parameter_ptr->driver_parameter_ptr = NULL; | |||
parameter_ptr->id = 0; | |||
*parameters_list_ptr_ptr = jack_slist_append(*parameters_list_ptr_ptr, parameter_ptr); | |||
return parameter_ptr; | |||
fail: | |||
return NULL; | |||
} | |||
static | |||
void | |||
jackctl_free_driver_parameters( | |||
struct jackctl_driver * driver_ptr) | |||
{ | |||
JSList * next_node_ptr; | |||
while (driver_ptr->parameters) | |||
{ | |||
next_node_ptr = driver_ptr->parameters->next; | |||
free(driver_ptr->parameters->data); | |||
free(driver_ptr->parameters); | |||
driver_ptr->parameters = next_node_ptr; | |||
} | |||
while (driver_ptr->set_parameters) | |||
{ | |||
next_node_ptr = driver_ptr->set_parameters->next; | |||
free(driver_ptr->set_parameters->data); | |||
free(driver_ptr->set_parameters); | |||
driver_ptr->set_parameters = next_node_ptr; | |||
} | |||
} | |||
static | |||
bool | |||
jackctl_add_driver_parameters( | |||
struct jackctl_driver * driver_ptr) | |||
{ | |||
uint32_t i; | |||
union jackctl_parameter_value jackctl_value; | |||
jackctl_param_type_t jackctl_type; | |||
struct jackctl_parameter * parameter_ptr; | |||
jack_driver_param_desc_t * descriptor_ptr; | |||
for (i = 0 ; i < driver_ptr->desc_ptr->nparams ; i++) | |||
{ | |||
descriptor_ptr = driver_ptr->desc_ptr->params + i; | |||
switch (descriptor_ptr->type) | |||
{ | |||
case JackDriverParamInt: | |||
jackctl_type = JackParamInt; | |||
jackctl_value.i = descriptor_ptr->value.i; | |||
break; | |||
case JackDriverParamUInt: | |||
jackctl_type = JackParamUInt; | |||
jackctl_value.ui = descriptor_ptr->value.ui; | |||
break; | |||
case JackDriverParamChar: | |||
jackctl_type = JackParamChar; | |||
jackctl_value.c = descriptor_ptr->value.c; | |||
break; | |||
case JackDriverParamString: | |||
jackctl_type = JackParamString; | |||
strcpy(jackctl_value.str, descriptor_ptr->value.str); | |||
break; | |||
case JackDriverParamBool: | |||
jackctl_type = JackParamBool; | |||
jackctl_value.b = descriptor_ptr->value.i; | |||
break; | |||
default: | |||
jack_error("unknown driver parameter type %i", (int)descriptor_ptr->type); | |||
assert(0); | |||
goto fail; | |||
} | |||
parameter_ptr = jackctl_add_parameter( | |||
&driver_ptr->parameters, | |||
descriptor_ptr->name, | |||
descriptor_ptr->short_desc, | |||
descriptor_ptr->long_desc, | |||
jackctl_type, | |||
NULL, | |||
NULL, | |||
jackctl_value); | |||
if (parameter_ptr == NULL) | |||
{ | |||
goto fail; | |||
} | |||
parameter_ptr->driver_ptr = driver_ptr; | |||
parameter_ptr->id = descriptor_ptr->character; | |||
} | |||
return true; | |||
fail: | |||
jackctl_free_driver_parameters(driver_ptr); | |||
return false; | |||
} | |||
static int | |||
jackctl_drivers_load( | |||
struct jackctl_server * server_ptr) | |||
{ | |||
struct jackctl_driver * driver_ptr; | |||
JSList *node_ptr; | |||
JSList *descriptor_node_ptr; | |||
descriptor_node_ptr = jack_drivers_load(NULL); | |||
if (descriptor_node_ptr == NULL) | |||
{ | |||
jack_error("could not find any drivers in direver directory!"); | |||
return false; | |||
} | |||
while (descriptor_node_ptr != NULL) | |||
{ | |||
driver_ptr = (struct jackctl_driver *)malloc(sizeof(struct jackctl_driver)); | |||
if (driver_ptr == NULL) | |||
{ | |||
jack_error("memory allocation of jackctl_driver structure failed."); | |||
goto next; | |||
} | |||
driver_ptr->desc_ptr = (jack_driver_desc_t *)descriptor_node_ptr->data; | |||
driver_ptr->parameters = NULL; | |||
driver_ptr->set_parameters = NULL; | |||
if (!jackctl_add_driver_parameters(driver_ptr)) | |||
{ | |||
assert(driver_ptr->parameters == NULL); | |||
free(driver_ptr); | |||
goto next; | |||
} | |||
server_ptr->drivers = jack_slist_append(server_ptr->drivers, driver_ptr); | |||
next: | |||
node_ptr = descriptor_node_ptr; | |||
descriptor_node_ptr = descriptor_node_ptr->next; | |||
free(node_ptr); | |||
} | |||
return true; | |||
} | |||
static | |||
void | |||
jackctl_server_free_drivers( | |||
struct jackctl_server * server_ptr) | |||
{ | |||
JSList * next_node_ptr; | |||
struct jackctl_driver * driver_ptr; | |||
while (server_ptr->drivers) | |||
{ | |||
next_node_ptr = server_ptr->drivers->next; | |||
driver_ptr = (struct jackctl_driver *)server_ptr->drivers->data; | |||
jackctl_free_driver_parameters(driver_ptr); | |||
free(driver_ptr->desc_ptr->params); | |||
free(driver_ptr->desc_ptr); | |||
free(driver_ptr); | |||
free(server_ptr->drivers); | |||
server_ptr->drivers = next_node_ptr; | |||
} | |||
} | |||
static | |||
void | |||
jackctl_server_free_parameters( | |||
struct jackctl_server * server_ptr) | |||
{ | |||
JSList * next_node_ptr; | |||
while (server_ptr->parameters) | |||
{ | |||
next_node_ptr = server_ptr->parameters->next; | |||
free(server_ptr->parameters->data); | |||
free(server_ptr->parameters); | |||
server_ptr->parameters = next_node_ptr; | |||
} | |||
} | |||
#ifdef WIN32 | |||
static HANDLE waitEvent; | |||
static void do_nothing_handler(int signum) | |||
{ | |||
printf("jack main caught signal %d\n", signum); | |||
(void) signal(SIGINT, SIG_DFL); | |||
SetEvent(waitEvent); | |||
} | |||
sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags) | |||
{ | |||
if ((waitEvent = CreateEvent(NULL, FALSE, FALSE, NULL)) == NULL) { | |||
jack_error("CreateEvent fails err = %ld", GetLastError()); | |||
return 0; | |||
} | |||
(void) signal(SIGINT, do_nothing_handler); | |||
(void) signal(SIGABRT, do_nothing_handler); | |||
(void) signal(SIGTERM, do_nothing_handler); | |||
return waitEvent; | |||
} | |||
void jackctl_wait_signals(sigset_t signals) | |||
{ | |||
if (WaitForSingleObject(waitEvent, INFINITE) != WAIT_OBJECT_0) { | |||
jack_error("WaitForSingleObject fails err = %ld", GetLastError()); | |||
} | |||
} | |||
#else | |||
static | |||
void | |||
do_nothing_handler(int sig) | |||
{ | |||
/* this is used by the child (active) process, but it never | |||
gets called unless we are already shutting down after | |||
another signal. | |||
*/ | |||
char buf[64]; | |||
snprintf (buf, sizeof(buf), | |||
"received signal %d during shutdown (ignored)\n", sig); | |||
write (1, buf, strlen (buf)); | |||
} | |||
EXPORT sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags) | |||
{ | |||
sigset_t signals; | |||
sigset_t allsignals; | |||
struct sigaction action; | |||
int i; | |||
/* ensure that we are in our own process group so that | |||
kill (SIG, -pgrp) does the right thing. | |||
*/ | |||
setsid(); | |||
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); | |||
/* what's this for? | |||
POSIX says that signals are delivered like this: | |||
* if a thread has blocked that signal, it is not | |||
a candidate to receive the signal. | |||
* of all threads not blocking the signal, pick | |||
one at random, and deliver the signal. | |||
this means that a simple-minded multi-threaded program can | |||
expect to get POSIX signals delivered randomly to any one | |||
of its threads, | |||
here, we block all signals that we think we might receive | |||
and want to catch. all "child" threads will inherit this | |||
setting. if we create a thread that calls sigwait() on the | |||
same set of signals, implicitly unblocking all those | |||
signals. any of those signals that are delivered to the | |||
process will be delivered to that thread, and that thread | |||
alone. this makes cleanup for a signal-driven exit much | |||
easier, since we know which thread is doing it and more | |||
importantly, we are free to call async-unsafe functions, | |||
because the code is executing in normal thread context | |||
after a return from sigwait(). | |||
*/ | |||
sigemptyset(&signals); | |||
sigaddset(&signals, SIGHUP); | |||
sigaddset(&signals, SIGINT); | |||
sigaddset(&signals, SIGQUIT); | |||
sigaddset(&signals, SIGPIPE); | |||
sigaddset(&signals, SIGTERM); | |||
sigaddset(&signals, SIGUSR1); | |||
sigaddset(&signals, SIGUSR2); | |||
/* all child threads will inherit this mask unless they | |||
* explicitly reset it | |||
*/ | |||
pthread_sigmask(SIG_BLOCK, &signals, 0); | |||
/* install a do-nothing handler because otherwise pthreads | |||
behaviour is undefined when we enter sigwait. | |||
*/ | |||
sigfillset(&allsignals); | |||
action.sa_handler = do_nothing_handler; | |||
action.sa_mask = allsignals; | |||
action.sa_flags = SA_RESTART|SA_RESETHAND; | |||
for (i = 1; i < NSIG; i++) | |||
{ | |||
if (sigismember (&signals, i)) | |||
{ | |||
sigaction(i, &action, 0); | |||
} | |||
} | |||
return signals; | |||
} | |||
EXPORT void | |||
jackctl_wait_signals(sigset_t signals) | |||
{ | |||
int sig; | |||
bool waiting = true; | |||
while (waiting) { | |||
sigwait(&signals, &sig); | |||
fprintf(stderr, "jack main caught signal %d\n", sig); | |||
switch (sig) { | |||
case SIGUSR1: | |||
//jack_dump_configuration(engine, 1); | |||
break; | |||
case SIGUSR2: | |||
// driver exit | |||
waiting = false; | |||
break; | |||
default: | |||
waiting = false; | |||
break; | |||
} | |||
} | |||
if (sig != SIGSEGV) { | |||
// unblock signals so we can see them during shutdown. | |||
// this will help prod developers not to lose sight of | |||
// bugs that cause segfaults etc. during shutdown. | |||
sigprocmask(SIG_UNBLOCK, &signals, 0); | |||
} | |||
} | |||
#endif | |||
EXPORT jackctl_server_t * jackctl_server_create() | |||
{ | |||
struct jackctl_server * server_ptr; | |||
union jackctl_parameter_value value; | |||
server_ptr = (struct jackctl_server *)malloc(sizeof(struct jackctl_server)); | |||
if (server_ptr == NULL) | |||
{ | |||
jack_error("Cannot allocate memory for jackctl_server structure."); | |||
goto fail; | |||
} | |||
server_ptr->drivers = NULL; | |||
server_ptr->parameters = NULL; | |||
server_ptr->engine = NULL; | |||
strcpy(value.str, JACK_DEFAULT_SERVER_NAME); | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"name", | |||
"server name to use", | |||
"", | |||
JackParamString, | |||
&server_ptr->name, | |||
&server_ptr->default_name, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.b = false; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"realtime", | |||
"Whether to use realtime mode", | |||
"Use realtime scheduling. This is needed for reliable low-latency performance. On most systems, it requires JACK to run with special scheduler and memory allocation privileges, which may be obtained in several ways. On Linux you should use PAM.", | |||
JackParamBool, | |||
&server_ptr->realtime, | |||
&server_ptr->default_realtime, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.i = 10; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"realtime-priority", | |||
"Scheduler priority when running in realtime mode.", | |||
"", | |||
JackParamInt, | |||
&server_ptr->realtime_priority, | |||
&server_ptr->default_realtime_priority, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.b = false; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"temporary", | |||
"Exit once all clients have closed their connections.", | |||
"", | |||
JackParamBool, | |||
&server_ptr->temporary, | |||
&server_ptr->default_temporary, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.b = false; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"verbose", | |||
"Verbose mode.", | |||
"", | |||
JackParamBool, | |||
&server_ptr->verbose, | |||
&server_ptr->default_verbose, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.i = 0; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"client-timeout", | |||
"Client timeout limit in milliseconds", | |||
"", | |||
JackParamInt, | |||
&server_ptr->client_timeout, | |||
&server_ptr->default_client_timeout, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.ui = 0; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"loopback-ports", | |||
"Number of loopback ports", | |||
"", | |||
JackParamUInt, | |||
&server_ptr->loopback_ports, | |||
&server_ptr->default_loopback_ports, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.b = false; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"replace-registry", | |||
"Replace registry", | |||
"", | |||
JackParamBool, | |||
&server_ptr->replace_registry, | |||
&server_ptr->default_replace_registry, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
value.b = false; | |||
if (jackctl_add_parameter( | |||
&server_ptr->parameters, | |||
"sync", | |||
"Use synchronous mode", | |||
"", | |||
JackParamBool, | |||
&server_ptr->sync, | |||
&server_ptr->default_sync, | |||
value) == NULL) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
if (!jackctl_drivers_load(server_ptr)) | |||
{ | |||
goto fail_free_parameters; | |||
} | |||
return server_ptr; | |||
fail_free_parameters: | |||
jackctl_server_free_parameters(server_ptr); | |||
free(server_ptr); | |||
fail: | |||
return NULL; | |||
} | |||
EXPORT void jackctl_server_destroy(jackctl_server *server_ptr) | |||
{ | |||
jackctl_server_free_drivers(server_ptr); | |||
jackctl_server_free_parameters(server_ptr); | |||
free(server_ptr); | |||
} | |||
EXPORT const JSList * jackctl_server_get_drivers_list(jackctl_server *server_ptr) | |||
{ | |||
return server_ptr->drivers; | |||
} | |||
EXPORT bool jackctl_server_stop(jackctl_server *server_ptr) | |||
{ | |||
server_ptr->engine->Stop(); | |||
server_ptr->engine->Close(); | |||
delete server_ptr->engine; | |||
/* clean up shared memory and files from this server instance */ | |||
jack_log("cleaning up shared memory"); | |||
jack_cleanup_shm(); | |||
jack_log("cleaning up files"); | |||
JackTools::CleanupFiles(server_ptr->name.str); | |||
jack_log("unregistering server `%s'", server_ptr->name.str); | |||
jack_unregister_server(server_ptr->name.str); | |||
server_ptr->engine = NULL; | |||
return true; | |||
} | |||
EXPORT const JSList * jackctl_server_get_parameters(jackctl_server *server_ptr) | |||
{ | |||
return server_ptr->parameters; | |||
} | |||
EXPORT bool | |||
jackctl_server_start( | |||
jackctl_server *server_ptr, | |||
jackctl_driver *driver_ptr) | |||
{ | |||
int rc; | |||
rc = jack_register_server(server_ptr->name.str, server_ptr->replace_registry.b); | |||
switch (rc) | |||
{ | |||
case EEXIST: | |||
jack_error("`%s' server already active", server_ptr->name.str); | |||
goto fail; | |||
case ENOSPC: | |||
jack_error("too many servers already active"); | |||
goto fail; | |||
case ENOMEM: | |||
jack_error("no access to shm registry"); | |||
goto fail; | |||
} | |||
jack_log("server `%s' registered", server_ptr->name.str); | |||
/* clean up shared memory and files from any previous | |||
* instance of this server name */ | |||
jack_cleanup_shm(); | |||
JackTools::CleanupFiles(server_ptr->name.str); | |||
if (!server_ptr->realtime.b && server_ptr->client_timeout.i == 0) | |||
server_ptr->client_timeout.i = 500; /* 0.5 sec; usable when non realtime. */ | |||
/* get the engine/driver started */ | |||
server_ptr->engine = new JackServer( | |||
server_ptr->sync.b, | |||
server_ptr->temporary.b, | |||
server_ptr->client_timeout.i, | |||
server_ptr->realtime.b, | |||
server_ptr->realtime_priority.i, | |||
server_ptr->loopback_ports.ui, | |||
server_ptr->verbose.b, | |||
server_ptr->name.str); | |||
if (server_ptr->engine == NULL) | |||
{ | |||
jack_error("Failed to create new JackServer object"); | |||
goto fail_unregister; | |||
} | |||
rc = server_ptr->engine->Open(driver_ptr->desc_ptr, driver_ptr->set_parameters); | |||
if (rc < 0) | |||
{ | |||
jack_error("JackServer::Open() failed with %d", rc); | |||
goto fail_delete; | |||
} | |||
rc = server_ptr->engine->Start(); | |||
if (rc < 0) | |||
{ | |||
jack_error("JackServer::Start() failed with %d", rc); | |||
goto fail_close; | |||
} | |||
return true; | |||
fail_close: | |||
server_ptr->engine->Close(); | |||
fail_delete: | |||
delete server_ptr->engine; | |||
server_ptr->engine = NULL; | |||
fail_unregister: | |||
jack_log("cleaning up shared memory"); | |||
jack_cleanup_shm(); | |||
jack_log("cleaning up files"); | |||
JackTools::CleanupFiles(server_ptr->name.str); | |||
jack_log("unregistering server `%s'", server_ptr->name.str); | |||
jack_unregister_server(server_ptr->name.str); | |||
fail: | |||
return false; | |||
} | |||
EXPORT const char * jackctl_driver_get_name(jackctl_driver *driver_ptr) | |||
{ | |||
return driver_ptr->desc_ptr->name; | |||
} | |||
EXPORT const JSList * jackctl_driver_get_parameters(jackctl_driver *driver_ptr) | |||
{ | |||
return driver_ptr->parameters; | |||
} | |||
EXPORT jack_driver_desc_t * jackctl_driver_get_desc(jackctl_driver_t * driver_ptr) | |||
{ | |||
return driver_ptr->desc_ptr; | |||
} | |||
EXPORT const char * jackctl_parameter_get_name(jackctl_parameter *parameter_ptr) | |||
{ | |||
return parameter_ptr->name; | |||
} | |||
EXPORT const char * jackctl_parameter_get_short_description(jackctl_parameter *parameter_ptr) | |||
{ | |||
return parameter_ptr->short_description; | |||
} | |||
EXPORT const char * jackctl_parameter_get_long_description(jackctl_parameter *parameter_ptr) | |||
{ | |||
return parameter_ptr->long_description; | |||
} | |||
EXPORT jackctl_param_type_t jackctl_parameter_get_type(jackctl_parameter *parameter_ptr) | |||
{ | |||
return parameter_ptr->type; | |||
} | |||
EXPORT char jackctl_parameter_get_id(jackctl_parameter_t * parameter_ptr) | |||
{ | |||
return parameter_ptr->id; | |||
} | |||
EXPORT bool jackctl_parameter_is_set(jackctl_parameter *parameter_ptr) | |||
{ | |||
return parameter_ptr->is_set; | |||
} | |||
EXPORT union jackctl_parameter_value jackctl_parameter_get_value(jackctl_parameter *parameter_ptr) | |||
{ | |||
return *parameter_ptr->value_ptr; | |||
} | |||
EXPORT bool jackctl_parameter_reset_value(jackctl_parameter *parameter_ptr) | |||
{ | |||
if (!parameter_ptr->is_set) | |||
{ | |||
return true; | |||
} | |||
parameter_ptr->is_set = true; | |||
*parameter_ptr->value_ptr = *parameter_ptr->default_value_ptr; | |||
return true; | |||
} | |||
EXPORT bool jackctl_parameter_set_value(jackctl_parameter *parameter_ptr, const union jackctl_parameter_value * value_ptr) | |||
{ | |||
bool new_driver_parameter; | |||
/* for driver parameters, set the parameter by adding jack_driver_param_t in the set_parameters list */ | |||
if (parameter_ptr->driver_ptr != NULL) | |||
{ | |||
/* jack_info("setting driver parameter %p ...", parameter_ptr); */ | |||
new_driver_parameter = parameter_ptr->driver_parameter_ptr == NULL; | |||
if (new_driver_parameter) | |||
{ | |||
/* jack_info("new driver parameter..."); */ | |||
parameter_ptr->driver_parameter_ptr = (jack_driver_param_t *)malloc(sizeof(jack_driver_param_t)); | |||
if (parameter_ptr->driver_parameter_ptr == NULL) | |||
{ | |||
jack_error ("Allocation of jack_driver_param_t structure failed"); | |||
return false; | |||
} | |||
parameter_ptr->driver_parameter_ptr->character = parameter_ptr->id; | |||
parameter_ptr->driver_ptr->set_parameters = jack_slist_append(parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); | |||
} | |||
switch (parameter_ptr->type) | |||
{ | |||
case JackParamInt: | |||
parameter_ptr->driver_parameter_ptr->value.i = value_ptr->i; | |||
break; | |||
case JackParamUInt: | |||
parameter_ptr->driver_parameter_ptr->value.ui = value_ptr->ui; | |||
break; | |||
case JackParamChar: | |||
parameter_ptr->driver_parameter_ptr->value.c = value_ptr->c; | |||
break; | |||
case JackParamString: | |||
strcpy(parameter_ptr->driver_parameter_ptr->value.str, value_ptr->str); | |||
break; | |||
case JackParamBool: | |||
parameter_ptr->driver_parameter_ptr->value.i = value_ptr->b; | |||
break; | |||
default: | |||
jack_error("unknown parameter type %i", (int)parameter_ptr->type); | |||
assert(0); | |||
if (new_driver_parameter) | |||
{ | |||
parameter_ptr->driver_ptr->set_parameters = jack_slist_remove(parameter_ptr->driver_ptr->set_parameters, parameter_ptr->driver_parameter_ptr); | |||
} | |||
return false; | |||
} | |||
} | |||
parameter_ptr->is_set = true; | |||
*parameter_ptr->value_ptr = *value_ptr; | |||
return true; | |||
} | |||
EXPORT union jackctl_parameter_value jackctl_parameter_get_default_value(jackctl_parameter *parameter_ptr) | |||
{ | |||
return *parameter_ptr->default_value_ptr; | |||
} |
@@ -0,0 +1,134 @@ | |||
/* | |||
Copyright (C) 2001 Paul Davis | |||
Copyright (C) 2004-2008 Grame | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdarg.h> | |||
#include <stdio.h> | |||
#include "JackError.h" | |||
#include "JackGlobals.h" | |||
#include "JackMessageBuffer.h" | |||
int jack_verbose = 0; | |||
void change_thread_log_function(jack_log_function_t log_function) | |||
{ | |||
if (!jack_tls_set(g_key_log_function, (void*)log_function)) | |||
{ | |||
jack_error("failed to set thread log function"); | |||
} | |||
} | |||
EXPORT void set_threaded_log_function() | |||
{ | |||
change_thread_log_function(Jack::JackMessageBufferAdd); | |||
} | |||
void jack_log_function(int level, const char *message) | |||
{ | |||
void (* log_callback)(const char *); | |||
switch (level) | |||
{ | |||
case LOG_LEVEL_INFO: | |||
log_callback = jack_info_callback; | |||
break; | |||
case LOG_LEVEL_ERROR: | |||
log_callback = jack_error_callback; | |||
break; | |||
default: | |||
return; | |||
} | |||
log_callback(message); | |||
} | |||
static | |||
void | |||
jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap) | |||
{ | |||
char buffer[300]; | |||
size_t len; | |||
jack_log_function_t log_function; | |||
if (prefix != NULL) { | |||
len = strlen(prefix); | |||
memcpy(buffer, prefix, len); | |||
} else { | |||
len = 0; | |||
} | |||
vsnprintf(buffer + len, sizeof(buffer) - len, fmt, ap); | |||
log_function = (jack_log_function_t)jack_tls_get(g_key_log_function); | |||
/* if log function is not overriden for thread, use default one */ | |||
if (log_function == NULL) | |||
{ | |||
log_function = jack_log_function; | |||
//log_function(LOG_LEVEL_INFO, "------ Using default log function"); | |||
} | |||
else | |||
{ | |||
//log_function(LOG_LEVEL_INFO, "++++++ Using thread-specific log function"); | |||
} | |||
log_function(level, buffer); | |||
} | |||
EXPORT void jack_error(const char *fmt, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, fmt); | |||
jack_format_and_log(LOG_LEVEL_ERROR, NULL, fmt, ap); | |||
va_end(ap); | |||
} | |||
EXPORT void jack_info(const char *fmt, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, fmt); | |||
jack_format_and_log(LOG_LEVEL_INFO, NULL, fmt, ap); | |||
va_end(ap); | |||
} | |||
EXPORT void jack_log(const char *fmt,...) | |||
{ | |||
if (jack_verbose) { | |||
va_list ap; | |||
va_start(ap, fmt); | |||
jack_format_and_log(LOG_LEVEL_INFO, "Jack: ", fmt, ap); | |||
va_end(ap); | |||
} | |||
} | |||
static void default_jack_error_callback(const char *desc) | |||
{ | |||
fprintf(stderr, "%s\n", desc); | |||
fflush(stderr); | |||
} | |||
static void default_jack_info_callback (const char *desc) | |||
{ | |||
fprintf(stdout, "%s\n", desc); | |||
fflush(stdout); | |||
} | |||
void (*jack_error_callback)(const char *desc) = &default_jack_error_callback; | |||
void (*jack_info_callback)(const char *desc) = &default_jack_info_callback; |
@@ -0,0 +1,120 @@ | |||
/* | |||
* messagebuffer.h -- realtime-safe message interface for jackd. | |||
* | |||
* This function is included in libjack so backend drivers can use | |||
* it, *not* for external client processes. The VERBOSE() and | |||
* MESSAGE() macros are realtime-safe. | |||
*/ | |||
/* | |||
* Copyright (C) 2004 Rui Nuno Capela, Steve Harris | |||
* Copyright (C) 2008 Nedko Arnaudov | |||
* Copyright (C) 2008 Grame | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU Lesser General Public License as published by | |||
* the Free Software Foundation; either version 2.1 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software | |||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
* | |||
*/ | |||
#include "JackMessageBuffer.h" | |||
#include "JackGlobals.h" | |||
#include "JackError.h" | |||
namespace Jack | |||
{ | |||
JackMessageBuffer* JackMessageBuffer::fInstance = NULL; | |||
JackMessageBuffer::JackMessageBuffer():fInBuffer(0),fOutBuffer(0),fOverruns(0) | |||
{ | |||
fThread = JackGlobals::MakeThread(this); | |||
fSignal = JackGlobals::MakeInterProcessSync(); | |||
fMutex = new JackMutex(); | |||
fThread->Start(); | |||
} | |||
JackMessageBuffer::~JackMessageBuffer() | |||
{ | |||
if (fOverruns > 0) { | |||
jack_error("WARNING: %d message buffer overruns!", fOverruns); | |||
} else { | |||
jack_info("no message buffer overruns"); | |||
} | |||
fThread->SetStatus(JackThread::kIdle); | |||
fSignal->SignalAll(); | |||
fThread->Stop(); | |||
Flush(); | |||
delete fThread; | |||
delete fMutex; | |||
delete fSignal; | |||
} | |||
void JackMessageBuffer::Flush() | |||
{ | |||
while (fOutBuffer != fInBuffer) { | |||
jack_log_function(fBuffers[fOutBuffer].level, fBuffers[fOutBuffer].message); | |||
fOutBuffer = MB_NEXT(fOutBuffer); | |||
} | |||
} | |||
void JackMessageBuffer::AddMessage(int level, const char *message) | |||
{ | |||
if (fMutex->Trylock()) { | |||
fBuffers[fInBuffer].level = level; | |||
strncpy(fBuffers[fInBuffer].message, message, MB_BUFFERSIZE); | |||
fInBuffer = MB_NEXT(fInBuffer); | |||
fSignal->SignalAll(); | |||
fMutex->Unlock(); | |||
} else { /* lock collision */ | |||
INC_ATOMIC(&fOverruns); | |||
} | |||
} | |||
bool JackMessageBuffer::Execute() | |||
{ | |||
fSignal->Wait(); | |||
fMutex->Lock(); | |||
Flush(); | |||
fMutex->Unlock(); | |||
return true; | |||
} | |||
void JackMessageBuffer::Create() | |||
{ | |||
if (fInstance == NULL) { | |||
fInstance = new JackMessageBuffer(); | |||
} | |||
} | |||
void JackMessageBuffer::Destroy() | |||
{ | |||
if (fInstance != NULL) { | |||
delete fInstance; | |||
fInstance = NULL; | |||
} | |||
} | |||
void JackMessageBufferAdd(int level, const char *message) | |||
{ | |||
if (Jack::JackMessageBuffer::fInstance == NULL) { | |||
/* Unable to print message with realtime safety. | |||
* Complain and print it anyway. */ | |||
jack_log_function(LOG_LEVEL_ERROR, "messagebuffer not initialized, skip message"); | |||
} else { | |||
Jack::JackMessageBuffer::fInstance->AddMessage(level, message); | |||
} | |||
} | |||
}; | |||
@@ -0,0 +1,192 @@ | |||
/* | |||
* messagebuffer.h -- realtime-safe message interface for jackd. | |||
* | |||
* This function is included in libjack so backend drivers can use | |||
* it, *not* for external client processes. The VERBOSE() and | |||
* MESSAGE() macros are realtime-safe. | |||
*/ | |||
/* | |||
* Copyright (C) 2004 Rui Nuno Capela, Steve Harris | |||
* Copyright (C) 2008 Nedko Arnaudov | |||
* Copyright (C) 2008 Grame | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU Lesser General Public License as published by | |||
* the Free Software Foundation; either version 2.1 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software | |||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
* | |||
*/ | |||
#ifndef __JackMessageBuffer__ | |||
#define __JackMessageBuffer__ | |||
#include "JackThread.h" | |||
#include "JackMutex.h" | |||
#include "JackAtomic.h" | |||
#include "JackSyncInterface.h" | |||
namespace Jack | |||
{ | |||
/* MB_NEXT() relies on the fact that MB_BUFFERS is a power of two */ | |||
#define MB_BUFFERS 128 | |||
#define MB_NEXT(index) ((index+1) & (MB_BUFFERS-1)) | |||
#define MB_BUFFERSIZE 256 /* message length limit */ | |||
struct JackMessage | |||
{ | |||
int level; | |||
char message[MB_BUFFERSIZE]; | |||
}; | |||
class JackMessageBuffer : public JackRunnableInterface | |||
{ | |||
private: | |||
JackMessage fBuffers[MB_BUFFERS]; | |||
JackMutex* fMutex; | |||
JackThread* fThread; | |||
JackSyncInterface* fSignal; | |||
volatile unsigned int fInBuffer; | |||
volatile unsigned int fOutBuffer; | |||
SInt32 fOverruns; | |||
void Flush(); | |||
public: | |||
JackMessageBuffer(); | |||
~JackMessageBuffer(); | |||
// JackRunnableInterface interface | |||
bool Execute(); | |||
void static Create(); | |||
void static Destroy(); | |||
void AddMessage(int level, const char *message); | |||
static JackMessageBuffer* fInstance; | |||
}; | |||
#ifdef __cplusplus | |||
extern "C" | |||
{ | |||
#endif | |||
void JackMessageBufferAdd(int level, const char *message); | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
}; | |||
#endif | |||
/* | |||
* messagebuffer.h -- realtime-safe message interface for jackd. | |||
* | |||
* This function is included in libjack so backend drivers can use | |||
* it, *not* for external client processes. The VERBOSE() and | |||
* MESSAGE() macros are realtime-safe. | |||
*/ | |||
/* | |||
* Copyright (C) 2004 Rui Nuno Capela, Steve Harris | |||
* Copyright (C) 2008 Nedko Arnaudov | |||
* Copyright (C) 2008 Grame | |||
* | |||
* This program is free software; you can redistribute it and/or modify | |||
* it under the terms of the GNU Lesser General Public License as published by | |||
* the Free Software Foundation; either version 2.1 of the License, or | |||
* (at your option) any later version. | |||
* | |||
* This program is distributed in the hope that it will be useful, | |||
* but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
* GNU Lesser General Public License for more details. | |||
* | |||
* You should have received a copy of the GNU Lesser General Public License | |||
* along with this program; if not, write to the Free Software | |||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
* | |||
*/ | |||
#ifndef __JackMessageBuffer__ | |||
#define __JackMessageBuffer__ | |||
#include "JackThread.h" | |||
#include "JackMutex.h" | |||
#include "JackAtomic.h" | |||
#include "JackSyncInterface.h" | |||
namespace Jack | |||
{ | |||
/* MB_NEXT() relies on the fact that MB_BUFFERS is a power of two */ | |||
#define MB_BUFFERS 128 | |||
#define MB_NEXT(index) ((index+1) & (MB_BUFFERS-1)) | |||
#define MB_BUFFERSIZE 256 /* message length limit */ | |||
struct JackMessage | |||
{ | |||
int level; | |||
char message[MB_BUFFERSIZE]; | |||
}; | |||
class JackMessageBuffer : public JackRunnableInterface | |||
{ | |||
private: | |||
JackMessage fBuffers[MB_BUFFERS]; | |||
JackMutex* fMutex; | |||
JackThread* fThread; | |||
JackSyncInterface* fSignal; | |||
volatile unsigned int fInBuffer; | |||
volatile unsigned int fOutBuffer; | |||
SInt32 fOverruns; | |||
void Flush(); | |||
public: | |||
JackMessageBuffer(); | |||
~JackMessageBuffer(); | |||
// JackRunnableInterface interface | |||
bool Execute(); | |||
void static Create(); | |||
void static Destroy(); | |||
void AddMessage(int level, const char *message); | |||
static JackMessageBuffer* fInstance; | |||
}; | |||
#ifdef __cplusplus | |||
extern "C" | |||
{ | |||
#endif | |||
void JackMessageBufferAdd(int level, const char *message); | |||
#ifdef __cplusplus | |||
} | |||
#endif | |||
}; | |||
#endif |
@@ -0,0 +1,75 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include "JackProcessSync.h" | |||
#include "JackError.h" | |||
namespace Jack | |||
{ | |||
bool JackProcessSync::TimedWait(long usec) | |||
{ | |||
struct timeval T0, T1; | |||
timespec time; | |||
struct timeval now; | |||
int res; | |||
pthread_mutex_lock(&fLock); | |||
jack_log("JackProcessSync::TimedWait time out = %ld", usec); | |||
gettimeofday(&T0, 0); | |||
gettimeofday(&now, 0); | |||
unsigned int next_date_usec = now.tv_usec + usec; | |||
time.tv_sec = now.tv_sec + (next_date_usec / 1000000); | |||
time.tv_nsec = (next_date_usec % 1000000) * 1000; | |||
res = pthread_cond_timedwait(&fCond, &fLock, &time); | |||
if (res != 0) | |||
jack_error("pthread_cond_timedwait error usec = %ld err = %s", usec, strerror(res)); | |||
gettimeofday(&T1, 0); | |||
pthread_mutex_unlock(&fLock); | |||
jack_log("JackProcessSync::TimedWait finished delta = %5.1lf", | |||
(1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec)); | |||
return (res == 0); | |||
} | |||
void JackProcessSync::Wait() | |||
{ | |||
int res; | |||
pthread_mutex_lock(&fLock); | |||
//jack_log("JackProcessSync::Wait..."); | |||
if ((res = pthread_cond_wait(&fCond, &fLock)) != 0) | |||
jack_error("pthread_cond_wait error err = %s", strerror(errno)); | |||
pthread_mutex_unlock(&fLock); | |||
//jack_log("JackProcessSync::Wait finished"); | |||
} | |||
bool JackInterProcessSync::TimedWait(long usec) | |||
{ | |||
struct timeval T0, T1; | |||
//jack_log("JackInterProcessSync::TimedWait..."); | |||
gettimeofday(&T0, 0); | |||
bool res = fSynchro->TimedWait(usec); | |||
gettimeofday(&T1, 0); | |||
//jack_log("JackInterProcessSync::TimedWait finished delta = %5.1lf", (1e6 * T1.tv_sec - 1e6 * T0.tv_sec + T1.tv_usec - T0.tv_usec)); | |||
return res; | |||
} | |||
} // end of namespace | |||
@@ -0,0 +1,648 @@ | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __control_types__ | |||
#define __control_types__ | |||
#include "jslist.h" | |||
#include "JackExports.h" | |||
#ifdef WIN32 | |||
typedef HANDLE sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
EXPORT sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
EXPORT void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
EXPORT jackctl_server_t * | |||
jackctl_server_create(); | |||
EXPORT void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
EXPORT bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
EXPORT bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
EXPORT const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
EXPORT const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
EXPORT const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
EXPORT char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __control_types__ | |||
#define __control_types__ | |||
#include "jslist.h" | |||
#include "JackExports.h" | |||
#ifdef WIN32 | |||
typedef HANDLE sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
EXPORT sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
EXPORT void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
EXPORT jackctl_server_t * | |||
jackctl_server_create(); | |||
EXPORT void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
EXPORT bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
EXPORT bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
EXPORT const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
EXPORT const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
EXPORT const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
EXPORT char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __control_types__ | |||
#define __control_types__ | |||
#include "jslist.h" | |||
#include "JackExports.h" | |||
#ifdef WIN32 | |||
typedef HANDLE sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
EXPORT sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
EXPORT void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
EXPORT jackctl_server_t * | |||
jackctl_server_create(); | |||
EXPORT void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
EXPORT bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
EXPORT bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
EXPORT const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
EXPORT const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
EXPORT const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
EXPORT char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef __control_types__ | |||
#define __control_types__ | |||
#include "jslist.h" | |||
#include "JackExports.h" | |||
#ifdef WIN32 | |||
typedef HANDLE sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
EXPORT sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
EXPORT void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
EXPORT jackctl_server_t * | |||
jackctl_server_create(); | |||
EXPORT void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
EXPORT bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
EXPORT bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
EXPORT const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
EXPORT const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
EXPORT const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
EXPORT const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
EXPORT jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
EXPORT char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
EXPORT bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
EXPORT union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif |
@@ -0,0 +1,702 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
/** | |||
* @file jack/control.h | |||
* @ingroup publicheader | |||
* @brief JACK control API | |||
* | |||
*/ | |||
#ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED | |||
#define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED | |||
#include <jack/jslist.h> | |||
#ifdef WIN32 | |||
typedef unsigned long sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
/** | |||
* Call this function to setup process signal handling. As a general | |||
* rule, it is required for proper operation for the server object. | |||
* | |||
* @param flags signals setup flags, use 0 for none. Currently no | |||
* flags are defined | |||
* | |||
* @return the configurated signal set. | |||
*/ | |||
sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
/** | |||
* Call this function to wait on a signal set. | |||
* | |||
* @param signals signals set to wait on | |||
*/ | |||
void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
/** | |||
* Call this function to create server object. | |||
* | |||
* @return server object handle, NULL if creation of server object | |||
* failed. Successfully created server object must be destroyed with | |||
* paired call to ::jackctl_server_destroy | |||
*/ | |||
jackctl_server_t * | |||
jackctl_server_create(); | |||
/** | |||
* Call this function to destroy server object. | |||
* | |||
* @param server server object handle to destroy | |||
*/ | |||
void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get list of available drivers. List node data | |||
* pointers is a driver object handle (::jackctl_driver_t). | |||
* | |||
* @param server server object handle to get drivers for | |||
* | |||
* @return Single linked list of driver object handles. Must not be | |||
* modified. Always same for same server object. | |||
*/ | |||
const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to start JACK server | |||
* | |||
* @param server server object handle | |||
* @param driver driver to use | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to stop JACK server | |||
* | |||
* @param server server object handle | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get list of server parameters. List node data | |||
* pointers is a parameter object handle (::jackctl_parameter_t). | |||
* | |||
* @param server server object handle to get parameters for | |||
* | |||
* @return Single linked list of parameter object handles. Must not be | |||
* modified. Always same for same server object. | |||
*/ | |||
const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get name of driver. | |||
* | |||
* @param driver driver object handle to get name of | |||
* | |||
* @return driver name. Must not be modified. Always same for same | |||
* driver object. | |||
*/ | |||
const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to get list of driver parameters. List node data | |||
* pointers is a parameter object handle (::jackctl_parameter_t). | |||
* | |||
* @param driver driver object handle to get parameters for | |||
* | |||
* @return Single linked list of parameter object handles. Must not be | |||
* modified. Always same for same driver object. | |||
*/ | |||
const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to get parameter name. | |||
* | |||
* @param parameter parameter object handle to get name of | |||
* | |||
* @return parameter name. Must not be modified. Always same for same | |||
* parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter short description. | |||
* | |||
* @param parameter parameter object handle to get short description of | |||
* | |||
* @return parameter short description. Must not be modified. Always | |||
* same for same parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter long description. | |||
* | |||
* @param parameter parameter object handle to get long description of | |||
* | |||
* @return parameter long description. Must not be modified. Always | |||
* same for same parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter type. | |||
* | |||
* @param parameter parameter object handle to get type of | |||
* | |||
* @return parameter type. Always same for same parameter object. | |||
*/ | |||
jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter character. | |||
* | |||
* @param parameter parameter object handle to get character of | |||
* | |||
* @return character. | |||
*/ | |||
char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to check whether parameter has been set, or its | |||
* default value is being used. | |||
* | |||
* @param parameter parameter object handle to check | |||
* | |||
* @return true - parameter is set, false - parameter is using default | |||
* value. | |||
*/ | |||
bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to reset parameter to its default value. | |||
* | |||
* @param parameter parameter object handle to reset value of | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter value. | |||
* | |||
* @param parameter parameter object handle to get value of | |||
* | |||
* @return parameter value. | |||
*/ | |||
union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to set parameter value. | |||
* | |||
* @param parameter parameter object handle to get value of | |||
* @param value_ptr pointer to variable containing parameter value | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
/** | |||
* Call this function to get parameter default value. | |||
* | |||
* @param parameter parameter object handle to get default value of | |||
* | |||
* @return parameter default value. | |||
*/ | |||
union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to log an error message. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_error( | |||
const char *format, | |||
...); | |||
/** | |||
* Call this function to log an information message. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_info( | |||
const char *format, | |||
...); | |||
/** | |||
* Call this function to log an information message but only when | |||
* verbose mode is enabled. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_log( | |||
const char *format, | |||
...); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif /* #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
JACK control API | |||
Copyright (C) 2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
/** | |||
* @file jack/control.h | |||
* @ingroup publicheader | |||
* @brief JACK control API | |||
* | |||
*/ | |||
#ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED | |||
#define JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED | |||
#include <jack/jslist.h> | |||
#ifdef WIN32 | |||
typedef unsigned long sigset_t; | |||
#endif | |||
/** Parameter types, intentionally similar to jack_driver_param_type_t */ | |||
typedef enum | |||
{ | |||
JackParamInt = 1, /**< @brief value type is a signed integer */ | |||
JackParamUInt, /**< @brief value type is an unsigned integer */ | |||
JackParamChar, /**< @brief value type is a char */ | |||
JackParamString, /**< @brief value type is a string with max size of ::JACK_PARAM_STRING_MAX+1 chars */ | |||
JackParamBool, /**< @brief value type is a boolean */ | |||
} jackctl_param_type_t; | |||
/** @brief Max value that jackctl_param_type_t type can have */ | |||
#define JACK_PARAM_MAX (JackParamBool + 1) | |||
/** @brief Max length of string parameter value, excluding terminating nul char */ | |||
#define JACK_PARAM_STRING_MAX 63 | |||
/** @brief Type for parameter value */ | |||
/* intentionally similar to jack_driver_param_value_t */ | |||
union jackctl_parameter_value | |||
{ | |||
uint32_t ui; /**< @brief member used for ::JackParamUInt */ | |||
int32_t i; /**< @brief member used for ::JackParamInt */ | |||
char c; /**< @brief member used for ::JackParamChar */ | |||
char str[JACK_PARAM_STRING_MAX + 1]; /**< @brief member used for ::JackParamString */ | |||
bool b; /**< @brief member used for ::JackParamBool */ | |||
}; | |||
/** opaque type for server object */ | |||
typedef struct jackctl_server jackctl_server_t; | |||
/** opaque type for driver object */ | |||
typedef struct jackctl_driver jackctl_driver_t; | |||
/** opaque type for parameter object */ | |||
typedef struct jackctl_parameter jackctl_parameter_t; | |||
#ifdef __cplusplus | |||
extern "C" { | |||
#endif | |||
#if 0 | |||
} /* Adjust editor indent */ | |||
#endif | |||
/** | |||
* Call this function to setup process signal handling. As a general | |||
* rule, it is required for proper operation for the server object. | |||
* | |||
* @param flags signals setup flags, use 0 for none. Currently no | |||
* flags are defined | |||
* | |||
* @return the configurated signal set. | |||
*/ | |||
sigset_t | |||
jackctl_setup_signals( | |||
unsigned int flags); | |||
/** | |||
* Call this function to wait on a signal set. | |||
* | |||
* @param signals signals set to wait on | |||
*/ | |||
void | |||
jackctl_wait_signals( | |||
sigset_t signals); | |||
/** | |||
* Call this function to create server object. | |||
* | |||
* @return server object handle, NULL if creation of server object | |||
* failed. Successfully created server object must be destroyed with | |||
* paired call to ::jackctl_server_destroy | |||
*/ | |||
jackctl_server_t * | |||
jackctl_server_create(); | |||
/** | |||
* Call this function to destroy server object. | |||
* | |||
* @param server server object handle to destroy | |||
*/ | |||
void | |||
jackctl_server_destroy( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get list of available drivers. List node data | |||
* pointers is a driver object handle (::jackctl_driver_t). | |||
* | |||
* @param server server object handle to get drivers for | |||
* | |||
* @return Single linked list of driver object handles. Must not be | |||
* modified. Always same for same server object. | |||
*/ | |||
const JSList * | |||
jackctl_server_get_drivers_list( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to start JACK server | |||
* | |||
* @param server server object handle | |||
* @param driver driver to use | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_server_start( | |||
jackctl_server_t * server, | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to stop JACK server | |||
* | |||
* @param server server object handle | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_server_stop( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get list of server parameters. List node data | |||
* pointers is a parameter object handle (::jackctl_parameter_t). | |||
* | |||
* @param server server object handle to get parameters for | |||
* | |||
* @return Single linked list of parameter object handles. Must not be | |||
* modified. Always same for same server object. | |||
*/ | |||
const JSList * | |||
jackctl_server_get_parameters( | |||
jackctl_server_t * server); | |||
/** | |||
* Call this function to get name of driver. | |||
* | |||
* @param driver driver object handle to get name of | |||
* | |||
* @return driver name. Must not be modified. Always same for same | |||
* driver object. | |||
*/ | |||
const char * | |||
jackctl_driver_get_name( | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to get list of driver parameters. List node data | |||
* pointers is a parameter object handle (::jackctl_parameter_t). | |||
* | |||
* @param driver driver object handle to get parameters for | |||
* | |||
* @return Single linked list of parameter object handles. Must not be | |||
* modified. Always same for same driver object. | |||
*/ | |||
const JSList * | |||
jackctl_driver_get_parameters( | |||
jackctl_driver_t * driver); | |||
/** | |||
* Call this function to get parameter name. | |||
* | |||
* @param parameter parameter object handle to get name of | |||
* | |||
* @return parameter name. Must not be modified. Always same for same | |||
* parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_name( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter short description. | |||
* | |||
* @param parameter parameter object handle to get short description of | |||
* | |||
* @return parameter short description. Must not be modified. Always | |||
* same for same parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_short_description( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter long description. | |||
* | |||
* @param parameter parameter object handle to get long description of | |||
* | |||
* @return parameter long description. Must not be modified. Always | |||
* same for same parameter object. | |||
*/ | |||
const char * | |||
jackctl_parameter_get_long_description( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter type. | |||
* | |||
* @param parameter parameter object handle to get type of | |||
* | |||
* @return parameter type. Always same for same parameter object. | |||
*/ | |||
jackctl_param_type_t | |||
jackctl_parameter_get_type( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter character. | |||
* | |||
* @param parameter parameter object handle to get character of | |||
* | |||
* @return character. | |||
*/ | |||
char | |||
jackctl_parameter_get_id( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to check whether parameter has been set, or its | |||
* default value is being used. | |||
* | |||
* @param parameter parameter object handle to check | |||
* | |||
* @return true - parameter is set, false - parameter is using default | |||
* value. | |||
*/ | |||
bool | |||
jackctl_parameter_is_set( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to reset parameter to its default value. | |||
* | |||
* @param parameter parameter object handle to reset value of | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_parameter_reset( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to get parameter value. | |||
* | |||
* @param parameter parameter object handle to get value of | |||
* | |||
* @return parameter value. | |||
*/ | |||
union jackctl_parameter_value | |||
jackctl_parameter_get_value( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to set parameter value. | |||
* | |||
* @param parameter parameter object handle to get value of | |||
* @param value_ptr pointer to variable containing parameter value | |||
* | |||
* @return success status: true - success, false - fail | |||
*/ | |||
bool | |||
jackctl_parameter_set_value( | |||
jackctl_parameter_t * parameter, | |||
const union jackctl_parameter_value * value_ptr); | |||
/** | |||
* Call this function to get parameter default value. | |||
* | |||
* @param parameter parameter object handle to get default value of | |||
* | |||
* @return parameter default value. | |||
*/ | |||
union jackctl_parameter_value | |||
jackctl_parameter_get_default_value( | |||
jackctl_parameter_t * parameter); | |||
/** | |||
* Call this function to log an error message. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_error( | |||
const char *format, | |||
...); | |||
/** | |||
* Call this function to log an information message. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_info( | |||
const char *format, | |||
...); | |||
/** | |||
* Call this function to log an information message but only when | |||
* verbose mode is enabled. | |||
* | |||
* @param format string | |||
*/ | |||
void | |||
jack_log( | |||
const char *format, | |||
...); | |||
#if 0 | |||
{ /* Adjust editor indent */ | |||
#endif | |||
#ifdef __cplusplus | |||
} /* extern "C" */ | |||
#endif | |||
#endif /* #ifndef JACKCTL_H__2EEDAD78_DF4C_4B26_83B7_4FF1A446A47E__INCLUDED */ |
@@ -0,0 +1,574 @@ | |||
/* | |||
Based on gslist.c from glib-1.2.9 (LGPL). | |||
Adaption to JACK, Copyright (C) 2002 Kai Vehmanen. | |||
- replaced use of gtypes with normal ANSI C types | |||
- glib's memory allocation routines replaced with | |||
malloc/free calls | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
#ifndef __jack_jslist_h__ | |||
#define __jack_jslist_h__ | |||
#include <stdlib.h> | |||
#ifdef WIN32 | |||
#define __inline__ inline | |||
#endif | |||
typedef struct _JSList JSList; | |||
typedef int (*JCompareFunc) (void* a, void* b); | |||
struct _JSList | |||
{ | |||
void *data; | |||
JSList *next; | |||
}; | |||
static __inline__ | |||
JSList* | |||
jack_slist_alloc (void) | |||
{ | |||
JSList *new_list; | |||
new_list = (JSList*)malloc(sizeof(JSList)); | |||
new_list->data = NULL; | |||
new_list->next = NULL; | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_prepend (JSList* list, void* data) | |||
{ | |||
JSList *new_list; | |||
new_list = (JSList*)malloc(sizeof(JSList)); | |||
new_list->data = data; | |||
new_list->next = list; | |||
return new_list; | |||
} | |||
#define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL) | |||
static __inline__ | |||
JSList* | |||
jack_slist_last (JSList *list) | |||
{ | |||
if (list) { | |||
while (list->next) | |||
list = list->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_remove_link (JSList *list, | |||
JSList *link) | |||
{ | |||
JSList *tmp; | |||
JSList *prev; | |||
prev = NULL; | |||
tmp = list; | |||
while (tmp) { | |||
if (tmp == link) { | |||
if (prev) | |||
prev->next = tmp->next; | |||
if (list == tmp) | |||
list = list->next; | |||
tmp->next = NULL; | |||
break; | |||
} | |||
prev = tmp; | |||
tmp = tmp->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
void | |||
jack_slist_free (JSList *list) | |||
{ | |||
while (list) { | |||
JSList *next = list->next; | |||
free(list); | |||
list = next; | |||
} | |||
} | |||
static __inline__ | |||
void | |||
jack_slist_free_1 (JSList *list) | |||
{ | |||
if (list) { | |||
free(list); | |||
} | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_remove (JSList *list, | |||
void *data) | |||
{ | |||
JSList *tmp; | |||
JSList *prev; | |||
prev = NULL; | |||
tmp = list; | |||
while (tmp) { | |||
if (tmp->data == data) { | |||
if (prev) | |||
prev->next = tmp->next; | |||
if (list == tmp) | |||
list = list->next; | |||
tmp->next = NULL; | |||
jack_slist_free (tmp); | |||
break; | |||
} | |||
prev = tmp; | |||
tmp = tmp->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
unsigned int | |||
jack_slist_length (JSList *list) | |||
{ | |||
unsigned int length; | |||
length = 0; | |||
while (list) { | |||
length++; | |||
list = list->next; | |||
} | |||
return length; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_find (JSList *list, | |||
void *data) | |||
{ | |||
while (list) { | |||
if (list->data == data) | |||
break; | |||
list = list->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_copy (JSList *list) | |||
{ | |||
JSList *new_list = NULL; | |||
if (list) { | |||
JSList *last; | |||
new_list = jack_slist_alloc (); | |||
new_list->data = list->data; | |||
last = new_list; | |||
list = list->next; | |||
while (list) { | |||
last->next = jack_slist_alloc (); | |||
last = last->next; | |||
last->data = list->data; | |||
list = list->next; | |||
} | |||
} | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_append (JSList *list, | |||
void *data) | |||
{ | |||
JSList *new_list; | |||
JSList *last; | |||
new_list = jack_slist_alloc (); | |||
new_list->data = data; | |||
if (list) { | |||
last = jack_slist_last (list); | |||
last->next = new_list; | |||
return list; | |||
} else | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_sort_merge (JSList *l1, | |||
JSList *l2, | |||
JCompareFunc compare_func) | |||
{ | |||
JSList list, *l; | |||
l = &list; | |||
while (l1 && l2) { | |||
if (compare_func(l1->data, l2->data) < 0) { | |||
l = l->next = l1; | |||
l1 = l1->next; | |||
} else { | |||
l = l->next = l2; | |||
l2 = l2->next; | |||
} | |||
} | |||
l->next = l1 ? l1 : l2; | |||
return list.next; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_sort (JSList *list, | |||
JCompareFunc compare_func) | |||
{ | |||
JSList *l1, *l2; | |||
if (!list) | |||
return NULL; | |||
if (!list->next) | |||
return list; | |||
l1 = list; | |||
l2 = list->next; | |||
while ((l2 = l2->next) != NULL) { | |||
if ((l2 = l2->next) == NULL) | |||
break; | |||
l1 = l1->next; | |||
} | |||
l2 = l1->next; | |||
l1->next = NULL; | |||
return jack_slist_sort_merge (jack_slist_sort (list, compare_func), | |||
jack_slist_sort (l2, compare_func), | |||
compare_func); | |||
} | |||
#endif /* __jack_jslist_h__ */ | |||
/* | |||
Based on gslist.c from glib-1.2.9 (LGPL). | |||
Adaption to JACK, Copyright (C) 2002 Kai Vehmanen. | |||
- replaced use of gtypes with normal ANSI C types | |||
- glib's memory allocation routines replaced with | |||
malloc/free calls | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU Lesser General Public License as published by | |||
the Free Software Foundation; either version 2.1 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU Lesser General Public License for more details. | |||
You should have received a copy of the GNU Lesser General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
*/ | |||
#ifndef __jack_jslist_h__ | |||
#define __jack_jslist_h__ | |||
#include <stdlib.h> | |||
#ifdef WIN32 | |||
#define __inline__ inline | |||
#endif | |||
typedef struct _JSList JSList; | |||
typedef int (*JCompareFunc) (void* a, void* b); | |||
struct _JSList | |||
{ | |||
void *data; | |||
JSList *next; | |||
}; | |||
static __inline__ | |||
JSList* | |||
jack_slist_alloc (void) | |||
{ | |||
JSList *new_list; | |||
new_list = (JSList*)malloc(sizeof(JSList)); | |||
new_list->data = NULL; | |||
new_list->next = NULL; | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_prepend (JSList* list, void* data) | |||
{ | |||
JSList *new_list; | |||
new_list = (JSList*)malloc(sizeof(JSList)); | |||
new_list->data = data; | |||
new_list->next = list; | |||
return new_list; | |||
} | |||
#define jack_slist_next(slist) ((slist) ? (((JSList *)(slist))->next) : NULL) | |||
static __inline__ | |||
JSList* | |||
jack_slist_last (JSList *list) | |||
{ | |||
if (list) { | |||
while (list->next) | |||
list = list->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_remove_link (JSList *list, | |||
JSList *link) | |||
{ | |||
JSList *tmp; | |||
JSList *prev; | |||
prev = NULL; | |||
tmp = list; | |||
while (tmp) { | |||
if (tmp == link) { | |||
if (prev) | |||
prev->next = tmp->next; | |||
if (list == tmp) | |||
list = list->next; | |||
tmp->next = NULL; | |||
break; | |||
} | |||
prev = tmp; | |||
tmp = tmp->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
void | |||
jack_slist_free (JSList *list) | |||
{ | |||
while (list) { | |||
JSList *next = list->next; | |||
free(list); | |||
list = next; | |||
} | |||
} | |||
static __inline__ | |||
void | |||
jack_slist_free_1 (JSList *list) | |||
{ | |||
if (list) { | |||
free(list); | |||
} | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_remove (JSList *list, | |||
void *data) | |||
{ | |||
JSList *tmp; | |||
JSList *prev; | |||
prev = NULL; | |||
tmp = list; | |||
while (tmp) { | |||
if (tmp->data == data) { | |||
if (prev) | |||
prev->next = tmp->next; | |||
if (list == tmp) | |||
list = list->next; | |||
tmp->next = NULL; | |||
jack_slist_free (tmp); | |||
break; | |||
} | |||
prev = tmp; | |||
tmp = tmp->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
unsigned int | |||
jack_slist_length (JSList *list) | |||
{ | |||
unsigned int length; | |||
length = 0; | |||
while (list) { | |||
length++; | |||
list = list->next; | |||
} | |||
return length; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_find (JSList *list, | |||
void *data) | |||
{ | |||
while (list) { | |||
if (list->data == data) | |||
break; | |||
list = list->next; | |||
} | |||
return list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_copy (JSList *list) | |||
{ | |||
JSList *new_list = NULL; | |||
if (list) { | |||
JSList *last; | |||
new_list = jack_slist_alloc (); | |||
new_list->data = list->data; | |||
last = new_list; | |||
list = list->next; | |||
while (list) { | |||
last->next = jack_slist_alloc (); | |||
last = last->next; | |||
last->data = list->data; | |||
list = list->next; | |||
} | |||
} | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_append (JSList *list, | |||
void *data) | |||
{ | |||
JSList *new_list; | |||
JSList *last; | |||
new_list = jack_slist_alloc (); | |||
new_list->data = data; | |||
if (list) { | |||
last = jack_slist_last (list); | |||
last->next = new_list; | |||
return list; | |||
} else | |||
return new_list; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_sort_merge (JSList *l1, | |||
JSList *l2, | |||
JCompareFunc compare_func) | |||
{ | |||
JSList list, *l; | |||
l = &list; | |||
while (l1 && l2) { | |||
if (compare_func(l1->data, l2->data) < 0) { | |||
l = l->next = l1; | |||
l1 = l1->next; | |||
} else { | |||
l = l->next = l2; | |||
l2 = l2->next; | |||
} | |||
} | |||
l->next = l1 ? l1 : l2; | |||
return list.next; | |||
} | |||
static __inline__ | |||
JSList* | |||
jack_slist_sort (JSList *list, | |||
JCompareFunc compare_func) | |||
{ | |||
JSList *l1, *l2; | |||
if (!list) | |||
return NULL; | |||
if (!list->next) | |||
return list; | |||
l1 = list; | |||
l2 = list->next; | |||
while ((l2 = l2->next) != NULL) { | |||
if ((l2 = l2->next) == NULL) | |||
break; | |||
l1 = l1->next; | |||
} | |||
l2 = l1->next; | |||
l1->next = NULL; | |||
return jack_slist_sort_merge (jack_slist_sort (list, compare_func), | |||
jack_slist_sort (l2, compare_func), | |||
compare_func); | |||
} | |||
#endif /* __jack_jslist_h__ */ |
@@ -0,0 +1,518 @@ | |||
#!/usr/bin/env python | |||
name_base = 'org.jackaudio' | |||
control_interface_name = name_base + '.JackControl' | |||
configure_interface_name = name_base + '.JackConfigure' | |||
service_name = name_base + '.service' | |||
import sys | |||
import os | |||
from traceback import print_exc | |||
import dbus | |||
def bool_convert(str_value): | |||
if str_value.lower() == "false": | |||
return False | |||
if str_value.lower() == "off": | |||
return False | |||
if str_value.lower() == "no": | |||
return False | |||
if str_value == "0": | |||
return False | |||
if str_value.lower() == "(null)": | |||
return False | |||
return bool(str_value) | |||
def dbus_type_to_python_type(dbus_value): | |||
if type(dbus_value) == dbus.Boolean: | |||
return bool(dbus_value) | |||
if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32: | |||
return int(dbus_value) | |||
return dbus_value | |||
def python_type_to_jackdbus_type(value, type_char): | |||
type_char = str(type_char) | |||
if type_char == "b": | |||
return bool_convert(value); | |||
elif type_char == "y": | |||
return dbus.Byte(value); | |||
elif type_char == "i": | |||
return dbus.Int32(value) | |||
elif type_char == "u": | |||
return dbus.UInt32(value) | |||
return value | |||
def dbus_type_to_type_string(dbus_value): | |||
if type(dbus_value) == dbus.Boolean: | |||
return "bool" | |||
if type(dbus_value) == dbus.Int32: | |||
return "sint" | |||
if type(dbus_value) == dbus.UInt32: | |||
return "uint" | |||
if type(dbus_value) == dbus.Byte: | |||
return "char" | |||
if type(dbus_value) == dbus.String: | |||
return "str" | |||
return None # throw exception here? | |||
def dbus_typesig_to_type_string(type_char): | |||
type_char = str(type_char) | |||
if type_char == 'i': | |||
return "sint" | |||
if type_char == 'u': | |||
return "uint" | |||
if type_char == 'y': | |||
return "char" | |||
if type_char == 's': | |||
return "str" | |||
if type_char == 'b': | |||
return "bool" | |||
print 'shit' | |||
return None # throw exception here? | |||
def main(): | |||
if len(sys.argv) == 1: | |||
print "Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0]) | |||
print "Commands:" | |||
print " exit - exit jack dbus service (stops jack server if currently running)" | |||
print " status - check whether jack server is started, return value is 0 if runing and 1 otherwise" | |||
print " start - start jack server if not currently started" | |||
print " stop - stop jack server if currenly started" | |||
print " dl - get list of available drivers" | |||
print " dg - get currently selected driver" | |||
print " ds <driver> - select driver" | |||
print " dp - get parameters of currently selected driver" | |||
print " dpd <param> - get long description for driver parameter" | |||
print " dps <param> <value> - set driver parameter" | |||
print " ep - get engine parameters" | |||
print " epd <param> - get long description for engine parameter" | |||
print " eps <param> <value> - set engine parameter" | |||
sys.exit(0) | |||
bus = dbus.SessionBus() | |||
controller = bus.get_object(service_name, "/org/jackaudio/Controller") | |||
control_iface = dbus.Interface(controller, control_interface_name) | |||
configure_iface = dbus.Interface(controller, configure_interface_name) | |||
# check arguments | |||
index = 1 | |||
while index < len(sys.argv): | |||
arg = sys.argv[index] | |||
index += 1 | |||
try: | |||
if arg == "exit": | |||
print "--- exit" | |||
control_iface.Exit() | |||
elif arg == "status": | |||
print "--- status" | |||
if control_iface.IsStarted(): | |||
print "started" | |||
sys.exit(0) | |||
else: | |||
print "stopped" | |||
sys.exit(1) | |||
elif arg == 'start': | |||
print "--- start" | |||
control_iface.StartServer() | |||
elif arg == 'stop': | |||
print "--- stop" | |||
control_iface.StopServer() | |||
elif arg == 'ism': | |||
if control_iface.IsManuallyActivated(): | |||
print "Manually activated" | |||
else: | |||
print "Automatically activated" | |||
elif arg == 'dl': | |||
print "--- drivers list" | |||
drivers = configure_iface.GetAvailableDrivers() | |||
for driver in drivers: | |||
print driver | |||
elif arg == 'dg': | |||
print "--- get selected driver" | |||
driver = configure_iface.GetSelectedDriver() | |||
if not driver: | |||
print "no driver selected" | |||
else: | |||
print driver | |||
elif arg == 'ds': | |||
if index >= len(sys.argv): | |||
print "driver select command requires driver name argument" | |||
sys.exit() | |||
arg = sys.argv[index] | |||
index += 1 | |||
print "--- driver select \"%s\"" % arg | |||
configure_iface.SelectDriver(arg) | |||
elif arg == 'dp': | |||
print "--- get driver parameters (type:isset:default:value)" | |||
params = configure_iface.GetDriverParametersInfo() | |||
#print params | |||
for param in params: | |||
typestr = dbus_typesig_to_type_string(param[0]) | |||
name = param[1] | |||
#print name | |||
descr = param[2] | |||
#print descr | |||
isset, default, value = configure_iface.GetDriverParameterValue(name) | |||
#print typestr | |||
if bool(isset): | |||
isset = "set" | |||
else: | |||
isset = "notset" | |||
value = dbus_type_to_python_type(value) | |||
default = dbus_type_to_python_type(default) | |||
print "%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value) | |||
elif arg == 'dpd': | |||
if index >= len(sys.argv): | |||
print "get driver parameter long description command requires driver name argument" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
print "--- get driver parameter description (%s)" % param | |||
type_char, name, short_descr, long_descr = configure_iface.GetDriverParameterInfo(param) | |||
print long_descr, | |||
elif arg == 'dps': | |||
if index + 1 >= len(sys.argv): | |||
print "driver parameter set command requires parametr name and value arguments" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
value = sys.argv[index] | |||
index += 1 | |||
print "--- driver param set \"%s\" -> \"%s\"" % (param, value) | |||
type_char, name, short_descr, long_descr = configure_iface.GetDriverParameterInfo(param) | |||
configure_iface.SetDriverParameterValue(param, python_type_to_jackdbus_type(value, type_char)) | |||
elif arg == 'ep': | |||
print "--- get engine parameters (type:isset:default:value)" | |||
params = configure_iface.GetEngineParametersInfo() | |||
#print params | |||
for param in params: | |||
typestr = dbus_typesig_to_type_string(param[0]) | |||
name = param[1] | |||
#print name | |||
descr = param[2] | |||
#print descr | |||
isset, default, value = configure_iface.GetEngineParameterValue(name) | |||
#print typestr | |||
if bool(isset): | |||
isset = "set" | |||
else: | |||
isset = "notset" | |||
value = dbus_type_to_python_type(value) | |||
default = dbus_type_to_python_type(default) | |||
print "%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value) | |||
elif arg == 'epd': | |||
if index >= len(sys.argv): | |||
print "get engine parameter long description command requires driver name argument" | |||
sys.exit() | |||
param_name = sys.argv[index] | |||
index += 1 | |||
print "--- get engine parameter description (%s)" % param_name | |||
type_char, name, short_descr, long_descr = configure_iface.GetEngineParameterInfo(param_name) | |||
print long_descr, | |||
elif arg == 'eps': | |||
if index + 1 >= len(sys.argv): | |||
print "engine parameter set command requires parametr name and value arguments" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
value = sys.argv[index] | |||
index += 1 | |||
print "--- engine param set \"%s\" -> \"%s\"" % (param, value) | |||
type_char, name, short_descr, long_descr = configure_iface.GetEngineParameterInfo(param) | |||
configure_iface.SetEngineParameterValue(param, python_type_to_jackdbus_type(value, type_char)) | |||
else: | |||
print "Unknown command '%s'" % arg | |||
except dbus.DBusException, e: | |||
print "DBus exception: %s" % str(e) | |||
if __name__ == '__main__': | |||
main() | |||
#!/usr/bin/env python | |||
name_base = 'org.jackaudio' | |||
control_interface_name = name_base + '.JackControl' | |||
configure_interface_name = name_base + '.JackConfigure' | |||
service_name = name_base + '.service' | |||
import sys | |||
import os | |||
from traceback import print_exc | |||
import dbus | |||
def bool_convert(str_value): | |||
if str_value.lower() == "false": | |||
return False | |||
if str_value.lower() == "off": | |||
return False | |||
if str_value.lower() == "no": | |||
return False | |||
if str_value == "0": | |||
return False | |||
if str_value.lower() == "(null)": | |||
return False | |||
return bool(str_value) | |||
def dbus_type_to_python_type(dbus_value): | |||
if type(dbus_value) == dbus.Boolean: | |||
return bool(dbus_value) | |||
if type(dbus_value) == dbus.Int32 or type(dbus_value) == dbus.UInt32: | |||
return int(dbus_value) | |||
return dbus_value | |||
def python_type_to_jackdbus_type(value, type_char): | |||
type_char = str(type_char) | |||
if type_char == "b": | |||
return bool_convert(value); | |||
elif type_char == "y": | |||
return dbus.Byte(value); | |||
elif type_char == "i": | |||
return dbus.Int32(value) | |||
elif type_char == "u": | |||
return dbus.UInt32(value) | |||
return value | |||
def dbus_type_to_type_string(dbus_value): | |||
if type(dbus_value) == dbus.Boolean: | |||
return "bool" | |||
if type(dbus_value) == dbus.Int32: | |||
return "sint" | |||
if type(dbus_value) == dbus.UInt32: | |||
return "uint" | |||
if type(dbus_value) == dbus.Byte: | |||
return "char" | |||
if type(dbus_value) == dbus.String: | |||
return "str" | |||
return None # throw exception here? | |||
def dbus_typesig_to_type_string(type_char): | |||
type_char = str(type_char) | |||
if type_char == 'i': | |||
return "sint" | |||
if type_char == 'u': | |||
return "uint" | |||
if type_char == 'y': | |||
return "char" | |||
if type_char == 's': | |||
return "str" | |||
if type_char == 'b': | |||
return "bool" | |||
print 'shit' | |||
return None # throw exception here? | |||
def main(): | |||
if len(sys.argv) == 1: | |||
print "Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0]) | |||
print "Commands:" | |||
print " exit - exit jack dbus service (stops jack server if currently running)" | |||
print " status - check whether jack server is started, return value is 0 if runing and 1 otherwise" | |||
print " start - start jack server if not currently started" | |||
print " stop - stop jack server if currenly started" | |||
print " dl - get list of available drivers" | |||
print " dg - get currently selected driver" | |||
print " ds <driver> - select driver" | |||
print " dp - get parameters of currently selected driver" | |||
print " dpd <param> - get long description for driver parameter" | |||
print " dps <param> <value> - set driver parameter" | |||
print " ep - get engine parameters" | |||
print " epd <param> - get long description for engine parameter" | |||
print " eps <param> <value> - set engine parameter" | |||
sys.exit(0) | |||
bus = dbus.SessionBus() | |||
controller = bus.get_object(service_name, "/org/jackaudio/Controller") | |||
control_iface = dbus.Interface(controller, control_interface_name) | |||
configure_iface = dbus.Interface(controller, configure_interface_name) | |||
# check arguments | |||
index = 1 | |||
while index < len(sys.argv): | |||
arg = sys.argv[index] | |||
index += 1 | |||
try: | |||
if arg == "exit": | |||
print "--- exit" | |||
control_iface.Exit() | |||
elif arg == "status": | |||
print "--- status" | |||
if control_iface.IsStarted(): | |||
print "started" | |||
sys.exit(0) | |||
else: | |||
print "stopped" | |||
sys.exit(1) | |||
elif arg == 'start': | |||
print "--- start" | |||
control_iface.StartServer() | |||
elif arg == 'stop': | |||
print "--- stop" | |||
control_iface.StopServer() | |||
elif arg == 'ism': | |||
if control_iface.IsManuallyActivated(): | |||
print "Manually activated" | |||
else: | |||
print "Automatically activated" | |||
elif arg == 'dl': | |||
print "--- drivers list" | |||
drivers = configure_iface.GetAvailableDrivers() | |||
for driver in drivers: | |||
print driver | |||
elif arg == 'dg': | |||
print "--- get selected driver" | |||
driver = configure_iface.GetSelectedDriver() | |||
if not driver: | |||
print "no driver selected" | |||
else: | |||
print driver | |||
elif arg == 'ds': | |||
if index >= len(sys.argv): | |||
print "driver select command requires driver name argument" | |||
sys.exit() | |||
arg = sys.argv[index] | |||
index += 1 | |||
print "--- driver select \"%s\"" % arg | |||
configure_iface.SelectDriver(arg) | |||
elif arg == 'dp': | |||
print "--- get driver parameters (type:isset:default:value)" | |||
params = configure_iface.GetDriverParametersInfo() | |||
#print params | |||
for param in params: | |||
typestr = dbus_typesig_to_type_string(param[0]) | |||
name = param[1] | |||
#print name | |||
descr = param[2] | |||
#print descr | |||
isset, default, value = configure_iface.GetDriverParameterValue(name) | |||
#print typestr | |||
if bool(isset): | |||
isset = "set" | |||
else: | |||
isset = "notset" | |||
value = dbus_type_to_python_type(value) | |||
default = dbus_type_to_python_type(default) | |||
print "%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value) | |||
elif arg == 'dpd': | |||
if index >= len(sys.argv): | |||
print "get driver parameter long description command requires driver name argument" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
print "--- get driver parameter description (%s)" % param | |||
type_char, name, short_descr, long_descr = configure_iface.GetDriverParameterInfo(param) | |||
print long_descr, | |||
elif arg == 'dps': | |||
if index + 1 >= len(sys.argv): | |||
print "driver parameter set command requires parametr name and value arguments" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
value = sys.argv[index] | |||
index += 1 | |||
print "--- driver param set \"%s\" -> \"%s\"" % (param, value) | |||
type_char, name, short_descr, long_descr = configure_iface.GetDriverParameterInfo(param) | |||
configure_iface.SetDriverParameterValue(param, python_type_to_jackdbus_type(value, type_char)) | |||
elif arg == 'ep': | |||
print "--- get engine parameters (type:isset:default:value)" | |||
params = configure_iface.GetEngineParametersInfo() | |||
#print params | |||
for param in params: | |||
typestr = dbus_typesig_to_type_string(param[0]) | |||
name = param[1] | |||
#print name | |||
descr = param[2] | |||
#print descr | |||
isset, default, value = configure_iface.GetEngineParameterValue(name) | |||
#print typestr | |||
if bool(isset): | |||
isset = "set" | |||
else: | |||
isset = "notset" | |||
value = dbus_type_to_python_type(value) | |||
default = dbus_type_to_python_type(default) | |||
print "%20s: %s (%s:%s:%s:%s)" %(name, descr, typestr, isset, default, value) | |||
elif arg == 'epd': | |||
if index >= len(sys.argv): | |||
print "get engine parameter long description command requires driver name argument" | |||
sys.exit() | |||
param_name = sys.argv[index] | |||
index += 1 | |||
print "--- get engine parameter description (%s)" % param_name | |||
type_char, name, short_descr, long_descr = configure_iface.GetEngineParameterInfo(param_name) | |||
print long_descr, | |||
elif arg == 'eps': | |||
if index + 1 >= len(sys.argv): | |||
print "engine parameter set command requires parametr name and value arguments" | |||
sys.exit() | |||
param = sys.argv[index] | |||
index += 1 | |||
value = sys.argv[index] | |||
index += 1 | |||
print "--- engine param set \"%s\" -> \"%s\"" % (param, value) | |||
type_char, name, short_descr, long_descr = configure_iface.GetEngineParameterInfo(param) | |||
configure_iface.SetEngineParameterValue(param, python_type_to_jackdbus_type(value, type_char)) | |||
else: | |||
print "Unknown command '%s'" % arg | |||
except dbus.DBusException, e: | |||
print "DBus exception: %s" % str(e) | |||
if __name__ == '__main__': | |||
main() |
@@ -0,0 +1,316 @@ | |||
# | |||
# Copyright (C) 2008 Nedko Arnaudov | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, version 2 of the License. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# | |||
import os | |||
from string import Template | |||
from SCons.Script.SConscript import SConsEnvironment | |||
def pkg_config_get_value(module, args): | |||
return env.backtick('pkg-config ' + args + ' ' + module).strip() | |||
def merge_pkg_config_append_string(env, envvar, module, args): | |||
value = pkg_config_get_value(module, args) | |||
#print value | |||
if env._dict.has_key(envvar): | |||
env._dict[envvar] += value | |||
else: | |||
env._dict[envvar] = value | |||
def merge_pkg_config_libs(env, module): | |||
for lib in pkg_config_get_value(module, "--libs").split(' '): | |||
if lib[:2] == '-l': | |||
env._dict['LIBS'].append(lib[2:]) | |||
elif lib[:2] == '-L': | |||
env._dict['LIBPATH'].append(lib[2:]) | |||
def merge_pkg_config_variable(env, envvar, module, pkgvar): | |||
merge_pkg_config_append_string(env, envvar, module, '--variable=' + pkgvar) | |||
def merge_pkg_config_std(env, module): | |||
merge_pkg_config_append_string(env, 'CCFLAGS', module, '--cflags') | |||
merge_pkg_config_libs(env, module) | |||
Import('env') | |||
jackenv = env.Copy() | |||
#print "LIBS (orig): " + repr(jackenv['LIBS']) | |||
#print "SERVERLIB: " + repr(jackenv['SERVERLIB']) | |||
jackenv.Append(LIBS=[jackenv['SERVERLIB'], 'dl', 'expat']) | |||
merge_pkg_config_variable(jackenv, 'DBUS_SERVICES_DIR', 'dbus-1', 'session_bus_services_dir') | |||
merge_pkg_config_std(jackenv, 'dbus-1') | |||
#print "CFLAGS: " + jackenv['CFLAGS'] | |||
#print "CCFLAGS: " + jackenv['CCFLAGS'] | |||
#print "LINKFLAGS: " + repr(jackenv['LINKFLAGS']) | |||
#print "LIBPATH: " + repr(jackenv['LIBPATH']) | |||
#print "LIBS: " + repr(jackenv['LIBS']) | |||
#print "DBUS_SERVICES_DIR: " + jackenv['DBUS_SERVICES_DIR'] | |||
jackenv.Install(env['BINDIR'], jackenv.Program('jackdbus', [ | |||
'jackdbus.c', | |||
'controller.c', | |||
'controller_iface_configure.c', | |||
'controller_iface_control.c', | |||
'controller_iface_introspectable.c', | |||
'controller_iface_patchbay.c', | |||
'controller_iface_transport.c', | |||
'xml.c', | |||
'xml_expat.c', | |||
# 'xml_libxml.c', | |||
# 'xml_nop.c', | |||
'xml_write_raw.c', | |||
])) | |||
jackenv.Alias('install', env['BINDIR']) | |||
jackenv.ScanReplace('org.jackaudio.service.in') | |||
jackenv.Install(jackenv['DBUS_SERVICES_DIR'], 'org.jackaudio.service') | |||
jackenv.Alias('install', jackenv['DBUS_SERVICES_DIR']) | |||
# | |||
# Copyright (C) 2008 Nedko Arnaudov | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, version 2 of the License. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# | |||
import os | |||
from string import Template | |||
from SCons.Script.SConscript import SConsEnvironment | |||
def pkg_config_get_value(module, args): | |||
return env.backtick('pkg-config ' + args + ' ' + module).strip() | |||
def merge_pkg_config_append_string(env, envvar, module, args): | |||
value = pkg_config_get_value(module, args) | |||
#print value | |||
if env._dict.has_key(envvar): | |||
env._dict[envvar] += value | |||
else: | |||
env._dict[envvar] = value | |||
def merge_pkg_config_libs(env, module): | |||
for lib in pkg_config_get_value(module, "--libs").split(' '): | |||
if lib[:2] == '-l': | |||
env._dict['LIBS'].append(lib[2:]) | |||
elif lib[:2] == '-L': | |||
env._dict['LIBPATH'].append(lib[2:]) | |||
def merge_pkg_config_variable(env, envvar, module, pkgvar): | |||
merge_pkg_config_append_string(env, envvar, module, '--variable=' + pkgvar) | |||
def merge_pkg_config_std(env, module): | |||
merge_pkg_config_append_string(env, 'CCFLAGS', module, '--cflags') | |||
merge_pkg_config_libs(env, module) | |||
Import('env') | |||
jackenv = env.Copy() | |||
#print "LIBS (orig): " + repr(jackenv['LIBS']) | |||
#print "SERVERLIB: " + repr(jackenv['SERVERLIB']) | |||
jackenv.Append(LIBS=[jackenv['SERVERLIB'], 'dl', 'expat']) | |||
merge_pkg_config_variable(jackenv, 'DBUS_SERVICES_DIR', 'dbus-1', 'session_bus_services_dir') | |||
merge_pkg_config_std(jackenv, 'dbus-1') | |||
#print "CFLAGS: " + jackenv['CFLAGS'] | |||
#print "CCFLAGS: " + jackenv['CCFLAGS'] | |||
#print "LINKFLAGS: " + repr(jackenv['LINKFLAGS']) | |||
#print "LIBPATH: " + repr(jackenv['LIBPATH']) | |||
#print "LIBS: " + repr(jackenv['LIBS']) | |||
#print "DBUS_SERVICES_DIR: " + jackenv['DBUS_SERVICES_DIR'] | |||
jackenv.Install(env['BINDIR'], jackenv.Program('jackdbus', [ | |||
'jackdbus.c', | |||
'controller.c', | |||
'controller_iface_configure.c', | |||
'controller_iface_control.c', | |||
'controller_iface_introspectable.c', | |||
'controller_iface_patchbay.c', | |||
'controller_iface_transport.c', | |||
'xml.c', | |||
'xml_expat.c', | |||
# 'xml_libxml.c', | |||
# 'xml_nop.c', | |||
'xml_write_raw.c', | |||
])) | |||
jackenv.Alias('install', env['BINDIR']) | |||
jackenv.ScanReplace('org.jackaudio.service.in') | |||
jackenv.Install(jackenv['DBUS_SERVICES_DIR'], 'org.jackaudio.service') | |||
jackenv.Alias('install', jackenv['DBUS_SERVICES_DIR']) | |||
# | |||
# Copyright (C) 2008 Nedko Arnaudov | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, version 2 of the License. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# | |||
import os | |||
from string import Template | |||
from SCons.Script.SConscript import SConsEnvironment | |||
def pkg_config_get_value(module, args): | |||
return env.backtick('pkg-config ' + args + ' ' + module).strip() | |||
def merge_pkg_config_append_string(env, envvar, module, args): | |||
value = pkg_config_get_value(module, args) | |||
#print value | |||
if env._dict.has_key(envvar): | |||
env._dict[envvar] += value | |||
else: | |||
env._dict[envvar] = value | |||
def merge_pkg_config_libs(env, module): | |||
for lib in pkg_config_get_value(module, "--libs").split(' '): | |||
if lib[:2] == '-l': | |||
env._dict['LIBS'].append(lib[2:]) | |||
elif lib[:2] == '-L': | |||
env._dict['LIBPATH'].append(lib[2:]) | |||
def merge_pkg_config_variable(env, envvar, module, pkgvar): | |||
merge_pkg_config_append_string(env, envvar, module, '--variable=' + pkgvar) | |||
def merge_pkg_config_std(env, module): | |||
merge_pkg_config_append_string(env, 'CCFLAGS', module, '--cflags') | |||
merge_pkg_config_libs(env, module) | |||
Import('env') | |||
jackenv = env.Copy() | |||
#print "LIBS (orig): " + repr(jackenv['LIBS']) | |||
#print "SERVERLIB: " + repr(jackenv['SERVERLIB']) | |||
jackenv.Append(LIBS=[jackenv['SERVERLIB'], 'dl', 'expat']) | |||
merge_pkg_config_variable(jackenv, 'DBUS_SERVICES_DIR', 'dbus-1', 'session_bus_services_dir') | |||
merge_pkg_config_std(jackenv, 'dbus-1') | |||
#print "CFLAGS: " + jackenv['CFLAGS'] | |||
#print "CCFLAGS: " + jackenv['CCFLAGS'] | |||
#print "LINKFLAGS: " + repr(jackenv['LINKFLAGS']) | |||
#print "LIBPATH: " + repr(jackenv['LIBPATH']) | |||
#print "LIBS: " + repr(jackenv['LIBS']) | |||
#print "DBUS_SERVICES_DIR: " + jackenv['DBUS_SERVICES_DIR'] | |||
jackenv.Install(env['BINDIR'], jackenv.Program('jackdbus', [ | |||
'jackdbus.c', | |||
'controller.c', | |||
'controller_iface_configure.c', | |||
'controller_iface_control.c', | |||
'controller_iface_introspectable.c', | |||
'controller_iface_patchbay.c', | |||
'controller_iface_transport.c', | |||
'xml.c', | |||
'xml_expat.c', | |||
# 'xml_libxml.c', | |||
# 'xml_nop.c', | |||
'xml_write_raw.c', | |||
])) | |||
jackenv.Alias('install', env['BINDIR']) | |||
jackenv.ScanReplace('org.jackaudio.service.in') | |||
jackenv.Install(jackenv['DBUS_SERVICES_DIR'], 'org.jackaudio.service') | |||
jackenv.Alias('install', jackenv['DBUS_SERVICES_DIR']) | |||
# | |||
# Copyright (C) 2008 Nedko Arnaudov | |||
# | |||
# This program is free software: you can redistribute it and/or modify | |||
# it under the terms of the GNU General Public License as published by | |||
# the Free Software Foundation, version 2 of the License. | |||
# | |||
# This program is distributed in the hope that it will be useful, | |||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
# GNU General Public License for more details. | |||
# | |||
# You should have received a copy of the GNU General Public License | |||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |||
# | |||
import os | |||
from string import Template | |||
from SCons.Script.SConscript import SConsEnvironment | |||
def pkg_config_get_value(module, args): | |||
return env.backtick('pkg-config ' + args + ' ' + module).strip() | |||
def merge_pkg_config_append_string(env, envvar, module, args): | |||
value = pkg_config_get_value(module, args) | |||
#print value | |||
if env._dict.has_key(envvar): | |||
env._dict[envvar] += value | |||
else: | |||
env._dict[envvar] = value | |||
def merge_pkg_config_libs(env, module): | |||
for lib in pkg_config_get_value(module, "--libs").split(' '): | |||
if lib[:2] == '-l': | |||
env._dict['LIBS'].append(lib[2:]) | |||
elif lib[:2] == '-L': | |||
env._dict['LIBPATH'].append(lib[2:]) | |||
def merge_pkg_config_variable(env, envvar, module, pkgvar): | |||
merge_pkg_config_append_string(env, envvar, module, '--variable=' + pkgvar) | |||
def merge_pkg_config_std(env, module): | |||
merge_pkg_config_append_string(env, 'CCFLAGS', module, '--cflags') | |||
merge_pkg_config_libs(env, module) | |||
Import('env') | |||
jackenv = env.Copy() | |||
#print "LIBS (orig): " + repr(jackenv['LIBS']) | |||
#print "SERVERLIB: " + repr(jackenv['SERVERLIB']) | |||
jackenv.Append(LIBS=[jackenv['SERVERLIB'], 'dl', 'expat']) | |||
merge_pkg_config_variable(jackenv, 'DBUS_SERVICES_DIR', 'dbus-1', 'session_bus_services_dir') | |||
merge_pkg_config_std(jackenv, 'dbus-1') | |||
#print "CFLAGS: " + jackenv['CFLAGS'] | |||
#print "CCFLAGS: " + jackenv['CCFLAGS'] | |||
#print "LINKFLAGS: " + repr(jackenv['LINKFLAGS']) | |||
#print "LIBPATH: " + repr(jackenv['LIBPATH']) | |||
#print "LIBS: " + repr(jackenv['LIBS']) | |||
#print "DBUS_SERVICES_DIR: " + jackenv['DBUS_SERVICES_DIR'] | |||
jackenv.Install(env['BINDIR'], jackenv.Program('jackdbus', [ | |||
'jackdbus.c', | |||
'controller.c', | |||
'controller_iface_configure.c', | |||
'controller_iface_control.c', | |||
'controller_iface_introspectable.c', | |||
'controller_iface_patchbay.c', | |||
'controller_iface_transport.c', | |||
'xml.c', | |||
'xml_expat.c', | |||
# 'xml_libxml.c', | |||
# 'xml_nop.c', | |||
'xml_write_raw.c', | |||
])) | |||
jackenv.Alias('install', env['BINDIR']) | |||
jackenv.ScanReplace('org.jackaudio.service.in') | |||
jackenv.Install(jackenv['DBUS_SERVICES_DIR'], 'org.jackaudio.service') | |||
jackenv.Alias('install', jackenv['DBUS_SERVICES_DIR']) |
@@ -0,0 +1,124 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
#define CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
void * | |||
jack_controller_create( | |||
DBusConnection *connection); | |||
void | |||
jack_controller_destroy( | |||
void *controller_ptr); | |||
#endif /* #ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
#define CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
void * | |||
jack_controller_create( | |||
DBusConnection *connection); | |||
void | |||
jack_controller_destroy( | |||
void *controller_ptr); | |||
#endif /* #ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
#define CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
void * | |||
jack_controller_create( | |||
DBusConnection *connection); | |||
void | |||
jack_controller_destroy( | |||
void *controller_ptr); | |||
#endif /* #ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
#define CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED | |||
void * | |||
jack_controller_create( | |||
DBusConnection *connection); | |||
void | |||
jack_controller_destroy( | |||
void *controller_ptr); | |||
#endif /* #ifndef CONTROLLER_H__2CC80B1E_8D5D_45E3_A9D8_9086DDF68BB5__INCLUDED */ |
@@ -0,0 +1,916 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
#include "controller_internal.h" | |||
#define controller_ptr ((struct jack_controller *)call->context) | |||
/* | |||
* Check if the supplied method name exists in org.jackaudio.JackControl, | |||
* if it does execute it and return true. Otherwise return false. | |||
*/ | |||
static | |||
bool | |||
jack_control_run_method( | |||
struct jack_dbus_method_call * call, | |||
const struct jack_dbus_interface_method_descriptor * methods) | |||
{ | |||
int ret; | |||
int type; | |||
message_arg_t arg; | |||
/* use empty reply if not overriden in the code that follows */ | |||
type = DBUS_TYPE_INVALID; | |||
if (strcmp (call->method_name, "Exit") == 0) | |||
{ | |||
g_exit_command = TRUE; | |||
} | |||
else if (strcmp (call->method_name, "IsStarted") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE); | |||
} | |||
else if (strcmp (call->method_name, "StartServer") == 0) | |||
{ | |||
if (!jack_controller_start_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to start server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "StopServer") == 0) | |||
{ | |||
if (!jack_controller_stop_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to stop server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "GetLoad") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = jack_cpu_load(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetXruns") == 0) | |||
{ | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = controller_ptr->xruns; | |||
} | |||
else if (strcmp (call->method_name, "GetSampleRate") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_sample_rate(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetLatency") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f; | |||
} | |||
else if (strcmp (call->method_name, "GetBufferSize") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_buffer_size(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "SetBufferSize") == 0) | |||
{ | |||
dbus_uint32_t buffer_size; | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID)) | |||
{ | |||
/* jack_dbus_get_method_args() has set reply for us */ | |||
goto exit; | |||
} | |||
ret = jack_set_buffer_size(controller_ptr->client, buffer_size); | |||
if (ret != 0) | |||
{ | |||
jack_dbus_error( | |||
call, | |||
JACK_DBUS_ERROR_GENERIC, | |||
"jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret); | |||
goto exit; | |||
} | |||
} | |||
else if (strcmp (call->method_name, "IsRealtime") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE; | |||
} | |||
else if (strcmp (call->method_name, "ResetXruns") == 0) | |||
{ | |||
controller_ptr->xruns = 0; | |||
} | |||
else | |||
{ | |||
return false; | |||
} | |||
jack_dbus_construct_method_return_single(call, type, arg); | |||
return true; | |||
not_started: | |||
jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | |||
"Can't execute method '%s' with stopped JACK server", call->method_name); | |||
exit: | |||
return true; | |||
} | |||
#undef controller_ptr | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted) | |||
JACK_DBUS_METHOD_ARGUMENT("started", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad) | |||
JACK_DBUS_METHOD_ARGUMENT("load", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns) | |||
JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate) | |||
JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency) | |||
JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime) | |||
JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl") | |||
JACK_DBUS_IFACE_HANDLER(jack_control_run_method) | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
#include "controller_internal.h" | |||
#define controller_ptr ((struct jack_controller *)call->context) | |||
/* | |||
* Check if the supplied method name exists in org.jackaudio.JackControl, | |||
* if it does execute it and return true. Otherwise return false. | |||
*/ | |||
static | |||
bool | |||
jack_control_run_method( | |||
struct jack_dbus_method_call * call, | |||
const struct jack_dbus_interface_method_descriptor * methods) | |||
{ | |||
int ret; | |||
int type; | |||
message_arg_t arg; | |||
/* use empty reply if not overriden in the code that follows */ | |||
type = DBUS_TYPE_INVALID; | |||
if (strcmp (call->method_name, "Exit") == 0) | |||
{ | |||
g_exit_command = TRUE; | |||
} | |||
else if (strcmp (call->method_name, "IsStarted") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE); | |||
} | |||
else if (strcmp (call->method_name, "StartServer") == 0) | |||
{ | |||
if (!jack_controller_start_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to start server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "StopServer") == 0) | |||
{ | |||
if (!jack_controller_stop_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to stop server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "GetLoad") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = jack_cpu_load(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetXruns") == 0) | |||
{ | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = controller_ptr->xruns; | |||
} | |||
else if (strcmp (call->method_name, "GetSampleRate") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_sample_rate(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetLatency") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f; | |||
} | |||
else if (strcmp (call->method_name, "GetBufferSize") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_buffer_size(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "SetBufferSize") == 0) | |||
{ | |||
dbus_uint32_t buffer_size; | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID)) | |||
{ | |||
/* jack_dbus_get_method_args() has set reply for us */ | |||
goto exit; | |||
} | |||
ret = jack_set_buffer_size(controller_ptr->client, buffer_size); | |||
if (ret != 0) | |||
{ | |||
jack_dbus_error( | |||
call, | |||
JACK_DBUS_ERROR_GENERIC, | |||
"jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret); | |||
goto exit; | |||
} | |||
} | |||
else if (strcmp (call->method_name, "IsRealtime") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE; | |||
} | |||
else if (strcmp (call->method_name, "ResetXruns") == 0) | |||
{ | |||
controller_ptr->xruns = 0; | |||
} | |||
else | |||
{ | |||
return false; | |||
} | |||
jack_dbus_construct_method_return_single(call, type, arg); | |||
return true; | |||
not_started: | |||
jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | |||
"Can't execute method '%s' with stopped JACK server", call->method_name); | |||
exit: | |||
return true; | |||
} | |||
#undef controller_ptr | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted) | |||
JACK_DBUS_METHOD_ARGUMENT("started", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad) | |||
JACK_DBUS_METHOD_ARGUMENT("load", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns) | |||
JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate) | |||
JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency) | |||
JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime) | |||
JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl") | |||
JACK_DBUS_IFACE_HANDLER(jack_control_run_method) | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
#include "controller_internal.h" | |||
#define controller_ptr ((struct jack_controller *)call->context) | |||
/* | |||
* Check if the supplied method name exists in org.jackaudio.JackControl, | |||
* if it does execute it and return true. Otherwise return false. | |||
*/ | |||
static | |||
bool | |||
jack_control_run_method( | |||
struct jack_dbus_method_call * call, | |||
const struct jack_dbus_interface_method_descriptor * methods) | |||
{ | |||
int ret; | |||
int type; | |||
message_arg_t arg; | |||
/* use empty reply if not overriden in the code that follows */ | |||
type = DBUS_TYPE_INVALID; | |||
if (strcmp (call->method_name, "Exit") == 0) | |||
{ | |||
g_exit_command = TRUE; | |||
} | |||
else if (strcmp (call->method_name, "IsStarted") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE); | |||
} | |||
else if (strcmp (call->method_name, "StartServer") == 0) | |||
{ | |||
if (!jack_controller_start_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to start server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "StopServer") == 0) | |||
{ | |||
if (!jack_controller_stop_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to stop server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "GetLoad") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = jack_cpu_load(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetXruns") == 0) | |||
{ | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = controller_ptr->xruns; | |||
} | |||
else if (strcmp (call->method_name, "GetSampleRate") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_sample_rate(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetLatency") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f; | |||
} | |||
else if (strcmp (call->method_name, "GetBufferSize") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_buffer_size(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "SetBufferSize") == 0) | |||
{ | |||
dbus_uint32_t buffer_size; | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID)) | |||
{ | |||
/* jack_dbus_get_method_args() has set reply for us */ | |||
goto exit; | |||
} | |||
ret = jack_set_buffer_size(controller_ptr->client, buffer_size); | |||
if (ret != 0) | |||
{ | |||
jack_dbus_error( | |||
call, | |||
JACK_DBUS_ERROR_GENERIC, | |||
"jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret); | |||
goto exit; | |||
} | |||
} | |||
else if (strcmp (call->method_name, "IsRealtime") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE; | |||
} | |||
else if (strcmp (call->method_name, "ResetXruns") == 0) | |||
{ | |||
controller_ptr->xruns = 0; | |||
} | |||
else | |||
{ | |||
return false; | |||
} | |||
jack_dbus_construct_method_return_single(call, type, arg); | |||
return true; | |||
not_started: | |||
jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | |||
"Can't execute method '%s' with stopped JACK server", call->method_name); | |||
exit: | |||
return true; | |||
} | |||
#undef controller_ptr | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted) | |||
JACK_DBUS_METHOD_ARGUMENT("started", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad) | |||
JACK_DBUS_METHOD_ARGUMENT("load", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns) | |||
JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate) | |||
JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency) | |||
JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime) | |||
JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl") | |||
JACK_DBUS_IFACE_HANDLER(jack_control_run_method) | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
#include "controller_internal.h" | |||
#define controller_ptr ((struct jack_controller *)call->context) | |||
/* | |||
* Check if the supplied method name exists in org.jackaudio.JackControl, | |||
* if it does execute it and return true. Otherwise return false. | |||
*/ | |||
static | |||
bool | |||
jack_control_run_method( | |||
struct jack_dbus_method_call * call, | |||
const struct jack_dbus_interface_method_descriptor * methods) | |||
{ | |||
int ret; | |||
int type; | |||
message_arg_t arg; | |||
/* use empty reply if not overriden in the code that follows */ | |||
type = DBUS_TYPE_INVALID; | |||
if (strcmp (call->method_name, "Exit") == 0) | |||
{ | |||
g_exit_command = TRUE; | |||
} | |||
else if (strcmp (call->method_name, "IsStarted") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = (dbus_bool_t) (controller_ptr->started ? TRUE : FALSE); | |||
} | |||
else if (strcmp (call->method_name, "StartServer") == 0) | |||
{ | |||
if (!jack_controller_start_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to start server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "StopServer") == 0) | |||
{ | |||
if (!jack_controller_stop_server(controller_ptr, call)) | |||
{ | |||
jack_error ("Failed to stop server"); | |||
} | |||
} | |||
else if (strcmp (call->method_name, "GetLoad") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = jack_cpu_load(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetXruns") == 0) | |||
{ | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = controller_ptr->xruns; | |||
} | |||
else if (strcmp (call->method_name, "GetSampleRate") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_sample_rate(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "GetLatency") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_DOUBLE; | |||
arg.doubl = ((float)jack_get_buffer_size(controller_ptr->client) / (float)jack_get_sample_rate(controller_ptr->client)) * 1000.0f; | |||
} | |||
else if (strcmp (call->method_name, "GetBufferSize") == 0) | |||
{ | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
type = DBUS_TYPE_UINT32; | |||
arg.uint32 = jack_get_buffer_size(controller_ptr->client); | |||
} | |||
else if (strcmp (call->method_name, "SetBufferSize") == 0) | |||
{ | |||
dbus_uint32_t buffer_size; | |||
if (!controller_ptr->started) | |||
{ | |||
goto not_started; | |||
} | |||
if (!jack_dbus_get_method_args(call, DBUS_TYPE_UINT32, &buffer_size, DBUS_TYPE_INVALID)) | |||
{ | |||
/* jack_dbus_get_method_args() has set reply for us */ | |||
goto exit; | |||
} | |||
ret = jack_set_buffer_size(controller_ptr->client, buffer_size); | |||
if (ret != 0) | |||
{ | |||
jack_dbus_error( | |||
call, | |||
JACK_DBUS_ERROR_GENERIC, | |||
"jack_set_buffer_size(%u) failed with error %d", (unsigned int)buffer_size, ret); | |||
goto exit; | |||
} | |||
} | |||
else if (strcmp (call->method_name, "IsRealtime") == 0) | |||
{ | |||
type = DBUS_TYPE_BOOLEAN; | |||
arg.boolean = jack_is_realtime(controller_ptr->client) ? TRUE : FALSE; | |||
} | |||
else if (strcmp (call->method_name, "ResetXruns") == 0) | |||
{ | |||
controller_ptr->xruns = 0; | |||
} | |||
else | |||
{ | |||
return false; | |||
} | |||
jack_dbus_construct_method_return_single(call, type, arg); | |||
return true; | |||
not_started: | |||
jack_dbus_error (call, JACK_DBUS_ERROR_SERVER_NOT_RUNNING, | |||
"Can't execute method '%s' with stopped JACK server", call->method_name); | |||
exit: | |||
return true; | |||
} | |||
#undef controller_ptr | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsStarted) | |||
JACK_DBUS_METHOD_ARGUMENT("started", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StartServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(StopServer) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLoad) | |||
JACK_DBUS_METHOD_ARGUMENT("load", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetXruns) | |||
JACK_DBUS_METHOD_ARGUMENT("xruns_count", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetSampleRate) | |||
JACK_DBUS_METHOD_ARGUMENT("sample_rate", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetLatency) | |||
JACK_DBUS_METHOD_ARGUMENT("latency_ms", "d", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(GetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(SetBufferSize) | |||
JACK_DBUS_METHOD_ARGUMENT("buffer_size_frames", "u", false) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(IsRealtime) | |||
JACK_DBUS_METHOD_ARGUMENT("realtime", "b", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(ResetXruns) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(IsStarted, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StartServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(StopServer, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLoad, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetXruns, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetSampleRate, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetLatency, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(GetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(SetBufferSize, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(IsRealtime, NULL) | |||
JACK_DBUS_METHOD_DESCRIBE(ResetXruns, NULL) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_control, "org.jackaudio.JackControl") | |||
JACK_DBUS_IFACE_HANDLER(jack_control_run_method) | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END |
@@ -0,0 +1,608 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007-2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
static char g_xml_data[102400]; | |||
static | |||
void | |||
jack_controller_dbus_introspect( | |||
struct jack_dbus_method_call * call) | |||
{ | |||
jack_dbus_construct_method_return_single( | |||
call, | |||
DBUS_TYPE_STRING, | |||
(message_arg_t)(const char *)g_xml_data); | |||
} | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(Introspect) | |||
JACK_DBUS_METHOD_ARGUMENT("xml_data", "s", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(Introspect, jack_controller_dbus_introspect) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_introspectable, "org.freedesktop.DBus.Introspectable") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
static char * g_buffer_ptr; | |||
static | |||
void | |||
write_line_format(const char * format, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, format); | |||
g_buffer_ptr += vsprintf(g_buffer_ptr, format, ap); | |||
va_end(ap); | |||
} | |||
static | |||
void | |||
write_line(const char * line) | |||
{ | |||
write_line_format("%s\n", line); | |||
} | |||
void jack_controller_introspect_init() __attribute__((constructor)); | |||
void | |||
jack_controller_introspect_init() | |||
{ | |||
struct jack_dbus_interface_descriptor ** interface_ptr_ptr; | |||
const struct jack_dbus_interface_method_descriptor * method_ptr; | |||
const struct jack_dbus_interface_method_argument_descriptor * method_argument_ptr; | |||
const struct jack_dbus_interface_signal_descriptor * signal_ptr; | |||
const struct jack_dbus_interface_signal_argument_descriptor * signal_argument_ptr; | |||
g_buffer_ptr = g_xml_data; | |||
write_line("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\""); | |||
write_line("\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">"); | |||
write_line("<node name=\"" JACK_CONTROLLER_OBJECT_PATH "\">"); | |||
interface_ptr_ptr = g_jackcontroller_interfaces; | |||
while (*interface_ptr_ptr != NULL) | |||
{ | |||
write_line_format(" <interface name=\"%s\">\n", (*interface_ptr_ptr)->name); | |||
if ((*interface_ptr_ptr)->methods != NULL) | |||
{ | |||
method_ptr = (*interface_ptr_ptr)->methods; | |||
while (method_ptr->name != NULL) | |||
{ | |||
write_line_format(" <method name=\"%s\">\n", method_ptr->name); | |||
method_argument_ptr = method_ptr->arguments; | |||
while (method_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" direction=\"%s\" />\n", | |||
method_argument_ptr->name, | |||
method_argument_ptr->type, | |||
method_argument_ptr->direction_out ? "out" : "in"); | |||
method_argument_ptr++; | |||
} | |||
write_line(" </method>"); | |||
method_ptr++; | |||
} | |||
} | |||
if ((*interface_ptr_ptr)->signals != NULL) | |||
{ | |||
signal_ptr = (*interface_ptr_ptr)->signals; | |||
while (signal_ptr->name != NULL) | |||
{ | |||
write_line_format(" <signal name=\"%s\">\n", signal_ptr->name); | |||
signal_argument_ptr = signal_ptr->arguments; | |||
while (signal_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" />\n", | |||
signal_argument_ptr->name, | |||
signal_argument_ptr->type); | |||
signal_argument_ptr++; | |||
} | |||
write_line(" </signal>"); | |||
signal_ptr++; | |||
} | |||
} | |||
write_line(" </interface>"); | |||
interface_ptr_ptr++; | |||
} | |||
write_line("</node>"); | |||
*g_buffer_ptr = 0; | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007-2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
static char g_xml_data[102400]; | |||
static | |||
void | |||
jack_controller_dbus_introspect( | |||
struct jack_dbus_method_call * call) | |||
{ | |||
jack_dbus_construct_method_return_single( | |||
call, | |||
DBUS_TYPE_STRING, | |||
(message_arg_t)(const char *)g_xml_data); | |||
} | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(Introspect) | |||
JACK_DBUS_METHOD_ARGUMENT("xml_data", "s", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(Introspect, jack_controller_dbus_introspect) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_introspectable, "org.freedesktop.DBus.Introspectable") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
static char * g_buffer_ptr; | |||
static | |||
void | |||
write_line_format(const char * format, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, format); | |||
g_buffer_ptr += vsprintf(g_buffer_ptr, format, ap); | |||
va_end(ap); | |||
} | |||
static | |||
void | |||
write_line(const char * line) | |||
{ | |||
write_line_format("%s\n", line); | |||
} | |||
void jack_controller_introspect_init() __attribute__((constructor)); | |||
void | |||
jack_controller_introspect_init() | |||
{ | |||
struct jack_dbus_interface_descriptor ** interface_ptr_ptr; | |||
const struct jack_dbus_interface_method_descriptor * method_ptr; | |||
const struct jack_dbus_interface_method_argument_descriptor * method_argument_ptr; | |||
const struct jack_dbus_interface_signal_descriptor * signal_ptr; | |||
const struct jack_dbus_interface_signal_argument_descriptor * signal_argument_ptr; | |||
g_buffer_ptr = g_xml_data; | |||
write_line("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\""); | |||
write_line("\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">"); | |||
write_line("<node name=\"" JACK_CONTROLLER_OBJECT_PATH "\">"); | |||
interface_ptr_ptr = g_jackcontroller_interfaces; | |||
while (*interface_ptr_ptr != NULL) | |||
{ | |||
write_line_format(" <interface name=\"%s\">\n", (*interface_ptr_ptr)->name); | |||
if ((*interface_ptr_ptr)->methods != NULL) | |||
{ | |||
method_ptr = (*interface_ptr_ptr)->methods; | |||
while (method_ptr->name != NULL) | |||
{ | |||
write_line_format(" <method name=\"%s\">\n", method_ptr->name); | |||
method_argument_ptr = method_ptr->arguments; | |||
while (method_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" direction=\"%s\" />\n", | |||
method_argument_ptr->name, | |||
method_argument_ptr->type, | |||
method_argument_ptr->direction_out ? "out" : "in"); | |||
method_argument_ptr++; | |||
} | |||
write_line(" </method>"); | |||
method_ptr++; | |||
} | |||
} | |||
if ((*interface_ptr_ptr)->signals != NULL) | |||
{ | |||
signal_ptr = (*interface_ptr_ptr)->signals; | |||
while (signal_ptr->name != NULL) | |||
{ | |||
write_line_format(" <signal name=\"%s\">\n", signal_ptr->name); | |||
signal_argument_ptr = signal_ptr->arguments; | |||
while (signal_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" />\n", | |||
signal_argument_ptr->name, | |||
signal_argument_ptr->type); | |||
signal_argument_ptr++; | |||
} | |||
write_line(" </signal>"); | |||
signal_ptr++; | |||
} | |||
} | |||
write_line(" </interface>"); | |||
interface_ptr_ptr++; | |||
} | |||
write_line("</node>"); | |||
*g_buffer_ptr = 0; | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007-2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
static char g_xml_data[102400]; | |||
static | |||
void | |||
jack_controller_dbus_introspect( | |||
struct jack_dbus_method_call * call) | |||
{ | |||
jack_dbus_construct_method_return_single( | |||
call, | |||
DBUS_TYPE_STRING, | |||
(message_arg_t)(const char *)g_xml_data); | |||
} | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(Introspect) | |||
JACK_DBUS_METHOD_ARGUMENT("xml_data", "s", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(Introspect, jack_controller_dbus_introspect) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_introspectable, "org.freedesktop.DBus.Introspectable") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
static char * g_buffer_ptr; | |||
static | |||
void | |||
write_line_format(const char * format, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, format); | |||
g_buffer_ptr += vsprintf(g_buffer_ptr, format, ap); | |||
va_end(ap); | |||
} | |||
static | |||
void | |||
write_line(const char * line) | |||
{ | |||
write_line_format("%s\n", line); | |||
} | |||
void jack_controller_introspect_init() __attribute__((constructor)); | |||
void | |||
jack_controller_introspect_init() | |||
{ | |||
struct jack_dbus_interface_descriptor ** interface_ptr_ptr; | |||
const struct jack_dbus_interface_method_descriptor * method_ptr; | |||
const struct jack_dbus_interface_method_argument_descriptor * method_argument_ptr; | |||
const struct jack_dbus_interface_signal_descriptor * signal_ptr; | |||
const struct jack_dbus_interface_signal_argument_descriptor * signal_argument_ptr; | |||
g_buffer_ptr = g_xml_data; | |||
write_line("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\""); | |||
write_line("\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">"); | |||
write_line("<node name=\"" JACK_CONTROLLER_OBJECT_PATH "\">"); | |||
interface_ptr_ptr = g_jackcontroller_interfaces; | |||
while (*interface_ptr_ptr != NULL) | |||
{ | |||
write_line_format(" <interface name=\"%s\">\n", (*interface_ptr_ptr)->name); | |||
if ((*interface_ptr_ptr)->methods != NULL) | |||
{ | |||
method_ptr = (*interface_ptr_ptr)->methods; | |||
while (method_ptr->name != NULL) | |||
{ | |||
write_line_format(" <method name=\"%s\">\n", method_ptr->name); | |||
method_argument_ptr = method_ptr->arguments; | |||
while (method_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" direction=\"%s\" />\n", | |||
method_argument_ptr->name, | |||
method_argument_ptr->type, | |||
method_argument_ptr->direction_out ? "out" : "in"); | |||
method_argument_ptr++; | |||
} | |||
write_line(" </method>"); | |||
method_ptr++; | |||
} | |||
} | |||
if ((*interface_ptr_ptr)->signals != NULL) | |||
{ | |||
signal_ptr = (*interface_ptr_ptr)->signals; | |||
while (signal_ptr->name != NULL) | |||
{ | |||
write_line_format(" <signal name=\"%s\">\n", signal_ptr->name); | |||
signal_argument_ptr = signal_ptr->arguments; | |||
while (signal_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" />\n", | |||
signal_argument_ptr->name, | |||
signal_argument_ptr->type); | |||
signal_argument_ptr++; | |||
} | |||
write_line(" </signal>"); | |||
signal_ptr++; | |||
} | |||
} | |||
write_line(" </interface>"); | |||
interface_ptr_ptr++; | |||
} | |||
write_line("</node>"); | |||
*g_buffer_ptr = 0; | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007-2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
static char g_xml_data[102400]; | |||
static | |||
void | |||
jack_controller_dbus_introspect( | |||
struct jack_dbus_method_call * call) | |||
{ | |||
jack_dbus_construct_method_return_single( | |||
call, | |||
DBUS_TYPE_STRING, | |||
(message_arg_t)(const char *)g_xml_data); | |||
} | |||
JACK_DBUS_METHOD_ARGUMENTS_BEGIN(Introspect) | |||
JACK_DBUS_METHOD_ARGUMENT("xml_data", "s", true) | |||
JACK_DBUS_METHOD_ARGUMENTS_END | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHOD_DESCRIBE(Introspect, jack_controller_dbus_introspect) | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_introspectable, "org.freedesktop.DBus.Introspectable") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
static char * g_buffer_ptr; | |||
static | |||
void | |||
write_line_format(const char * format, ...) | |||
{ | |||
va_list ap; | |||
va_start(ap, format); | |||
g_buffer_ptr += vsprintf(g_buffer_ptr, format, ap); | |||
va_end(ap); | |||
} | |||
static | |||
void | |||
write_line(const char * line) | |||
{ | |||
write_line_format("%s\n", line); | |||
} | |||
void jack_controller_introspect_init() __attribute__((constructor)); | |||
void | |||
jack_controller_introspect_init() | |||
{ | |||
struct jack_dbus_interface_descriptor ** interface_ptr_ptr; | |||
const struct jack_dbus_interface_method_descriptor * method_ptr; | |||
const struct jack_dbus_interface_method_argument_descriptor * method_argument_ptr; | |||
const struct jack_dbus_interface_signal_descriptor * signal_ptr; | |||
const struct jack_dbus_interface_signal_argument_descriptor * signal_argument_ptr; | |||
g_buffer_ptr = g_xml_data; | |||
write_line("<!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\""); | |||
write_line("\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">"); | |||
write_line("<node name=\"" JACK_CONTROLLER_OBJECT_PATH "\">"); | |||
interface_ptr_ptr = g_jackcontroller_interfaces; | |||
while (*interface_ptr_ptr != NULL) | |||
{ | |||
write_line_format(" <interface name=\"%s\">\n", (*interface_ptr_ptr)->name); | |||
if ((*interface_ptr_ptr)->methods != NULL) | |||
{ | |||
method_ptr = (*interface_ptr_ptr)->methods; | |||
while (method_ptr->name != NULL) | |||
{ | |||
write_line_format(" <method name=\"%s\">\n", method_ptr->name); | |||
method_argument_ptr = method_ptr->arguments; | |||
while (method_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" direction=\"%s\" />\n", | |||
method_argument_ptr->name, | |||
method_argument_ptr->type, | |||
method_argument_ptr->direction_out ? "out" : "in"); | |||
method_argument_ptr++; | |||
} | |||
write_line(" </method>"); | |||
method_ptr++; | |||
} | |||
} | |||
if ((*interface_ptr_ptr)->signals != NULL) | |||
{ | |||
signal_ptr = (*interface_ptr_ptr)->signals; | |||
while (signal_ptr->name != NULL) | |||
{ | |||
write_line_format(" <signal name=\"%s\">\n", signal_ptr->name); | |||
signal_argument_ptr = signal_ptr->arguments; | |||
while (signal_argument_ptr->name != NULL) | |||
{ | |||
write_line_format( | |||
" <arg name=\"%s\" type=\"%s\" />\n", | |||
signal_argument_ptr->name, | |||
signal_argument_ptr->type); | |||
signal_argument_ptr++; | |||
} | |||
write_line(" </signal>"); | |||
signal_ptr++; | |||
} | |||
} | |||
write_line(" </interface>"); | |||
interface_ptr_ptr++; | |||
} | |||
write_line("</node>"); | |||
*g_buffer_ptr = 0; | |||
} |
@@ -0,0 +1,136 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2008 Nedko Arnaudov | |||
Copyright (C) 2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_transport, "org.jackaudio.JackTransport") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2008 Nedko Arnaudov | |||
Copyright (C) 2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_transport, "org.jackaudio.JackTransport") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2008 Nedko Arnaudov | |||
Copyright (C) 2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_transport, "org.jackaudio.JackTransport") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2008 Nedko Arnaudov | |||
Copyright (C) 2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdint.h> | |||
#include <string.h> | |||
#include <stdio.h> | |||
#include <assert.h> | |||
#include <dbus/dbus.h> | |||
#include "jackdbus.h" | |||
JACK_DBUS_METHODS_BEGIN | |||
JACK_DBUS_METHODS_END | |||
JACK_DBUS_IFACE_BEGIN(g_jack_controller_iface_transport, "org.jackaudio.JackTransport") | |||
JACK_DBUS_IFACE_EXPOSE_METHODS | |||
JACK_DBUS_IFACE_END |
@@ -0,0 +1,724 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#define CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#include <stdbool.h> | |||
#include "jslist.h" | |||
#include "jack/control.h" | |||
#include "jack/jack.h" | |||
#include "jackdbus.h" | |||
struct jack_controller | |||
{ | |||
jackctl_server_t *server; | |||
void *patchbay_context; | |||
bool started; | |||
jack_client_t *client; | |||
unsigned int xruns; | |||
const char **driver_names; | |||
unsigned int drivers_count; | |||
/* current driver, NULL if not driver is selected */ | |||
jackctl_driver_t *driver; | |||
struct jack_dbus_object_descriptor dbus_descriptor; | |||
}; | |||
#define JACK_CONF_HEADER_TEXT \ | |||
"JACK settings, as persisted by D-Bus object.\n" \ | |||
"You probably don't want to edit this because\n" \ | |||
"it will be overwritten next time jackdbus saves.\n" | |||
jackctl_driver_t * | |||
jack_controller_find_driver( | |||
jackctl_server_t *server, | |||
const char *driver_name); | |||
jackctl_parameter_t * | |||
jack_controller_find_parameter( | |||
const JSList *parameters_list, | |||
const char *parameter_name); | |||
bool | |||
jack_controller_start_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_stop_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_select_driver( | |||
struct jack_controller *controller_ptr, | |||
const char * driver_name); | |||
void | |||
jack_controller_settings_set_driver_option( | |||
jackctl_driver_t *driver, | |||
const char *option_name, | |||
const char *option_value); | |||
void | |||
jack_controller_settings_set_engine_option( | |||
struct jack_controller *controller_ptr, | |||
const char *option_name, | |||
const char *option_value); | |||
bool | |||
jack_controller_settings_save_engine_options( | |||
void *context, | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_write_option( | |||
void *context, | |||
const char *name, | |||
const char *content, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_save_driver_options( | |||
void *context, | |||
jackctl_driver_t *driver, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_patchbay_init( | |||
struct jack_controller *controller_ptr); | |||
void | |||
jack_controller_patchbay_uninit( | |||
struct jack_controller *controller_ptr); | |||
void * | |||
jack_controller_patchbay_client_appeared_callback( | |||
void * server_context, | |||
uint64_t client_id, | |||
const char *client_name); | |||
void | |||
jack_controller_patchbay_client_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context); | |||
void * | |||
jack_controller_patchbay_port_appeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
const char *port_name, | |||
uint32_t port_flags, | |||
uint32_t port_type); | |||
void | |||
jack_controller_patchbay_port_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
void *port_context); | |||
void * | |||
jack_controller_patchbay_ports_connected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id); | |||
void | |||
jack_controller_patchbay_ports_disconnected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id, | |||
void *connection_context); | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_introspectable; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_control; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_configure; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_patchbay; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_transport; | |||
#endif /* #ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#define CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#include <stdbool.h> | |||
#include "jslist.h" | |||
#include "jack/control.h" | |||
#include "jack/jack.h" | |||
#include "jackdbus.h" | |||
struct jack_controller | |||
{ | |||
jackctl_server_t *server; | |||
void *patchbay_context; | |||
bool started; | |||
jack_client_t *client; | |||
unsigned int xruns; | |||
const char **driver_names; | |||
unsigned int drivers_count; | |||
/* current driver, NULL if not driver is selected */ | |||
jackctl_driver_t *driver; | |||
struct jack_dbus_object_descriptor dbus_descriptor; | |||
}; | |||
#define JACK_CONF_HEADER_TEXT \ | |||
"JACK settings, as persisted by D-Bus object.\n" \ | |||
"You probably don't want to edit this because\n" \ | |||
"it will be overwritten next time jackdbus saves.\n" | |||
jackctl_driver_t * | |||
jack_controller_find_driver( | |||
jackctl_server_t *server, | |||
const char *driver_name); | |||
jackctl_parameter_t * | |||
jack_controller_find_parameter( | |||
const JSList *parameters_list, | |||
const char *parameter_name); | |||
bool | |||
jack_controller_start_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_stop_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_select_driver( | |||
struct jack_controller *controller_ptr, | |||
const char * driver_name); | |||
void | |||
jack_controller_settings_set_driver_option( | |||
jackctl_driver_t *driver, | |||
const char *option_name, | |||
const char *option_value); | |||
void | |||
jack_controller_settings_set_engine_option( | |||
struct jack_controller *controller_ptr, | |||
const char *option_name, | |||
const char *option_value); | |||
bool | |||
jack_controller_settings_save_engine_options( | |||
void *context, | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_write_option( | |||
void *context, | |||
const char *name, | |||
const char *content, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_save_driver_options( | |||
void *context, | |||
jackctl_driver_t *driver, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_patchbay_init( | |||
struct jack_controller *controller_ptr); | |||
void | |||
jack_controller_patchbay_uninit( | |||
struct jack_controller *controller_ptr); | |||
void * | |||
jack_controller_patchbay_client_appeared_callback( | |||
void * server_context, | |||
uint64_t client_id, | |||
const char *client_name); | |||
void | |||
jack_controller_patchbay_client_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context); | |||
void * | |||
jack_controller_patchbay_port_appeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
const char *port_name, | |||
uint32_t port_flags, | |||
uint32_t port_type); | |||
void | |||
jack_controller_patchbay_port_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
void *port_context); | |||
void * | |||
jack_controller_patchbay_ports_connected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id); | |||
void | |||
jack_controller_patchbay_ports_disconnected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id, | |||
void *connection_context); | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_introspectable; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_control; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_configure; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_patchbay; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_transport; | |||
#endif /* #ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#define CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#include <stdbool.h> | |||
#include "jslist.h" | |||
#include "jack/control.h" | |||
#include "jack/jack.h" | |||
#include "jackdbus.h" | |||
struct jack_controller | |||
{ | |||
jackctl_server_t *server; | |||
void *patchbay_context; | |||
bool started; | |||
jack_client_t *client; | |||
unsigned int xruns; | |||
const char **driver_names; | |||
unsigned int drivers_count; | |||
/* current driver, NULL if not driver is selected */ | |||
jackctl_driver_t *driver; | |||
struct jack_dbus_object_descriptor dbus_descriptor; | |||
}; | |||
#define JACK_CONF_HEADER_TEXT \ | |||
"JACK settings, as persisted by D-Bus object.\n" \ | |||
"You probably don't want to edit this because\n" \ | |||
"it will be overwritten next time jackdbus saves.\n" | |||
jackctl_driver_t * | |||
jack_controller_find_driver( | |||
jackctl_server_t *server, | |||
const char *driver_name); | |||
jackctl_parameter_t * | |||
jack_controller_find_parameter( | |||
const JSList *parameters_list, | |||
const char *parameter_name); | |||
bool | |||
jack_controller_start_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_stop_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_select_driver( | |||
struct jack_controller *controller_ptr, | |||
const char * driver_name); | |||
void | |||
jack_controller_settings_set_driver_option( | |||
jackctl_driver_t *driver, | |||
const char *option_name, | |||
const char *option_value); | |||
void | |||
jack_controller_settings_set_engine_option( | |||
struct jack_controller *controller_ptr, | |||
const char *option_name, | |||
const char *option_value); | |||
bool | |||
jack_controller_settings_save_engine_options( | |||
void *context, | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_write_option( | |||
void *context, | |||
const char *name, | |||
const char *content, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_save_driver_options( | |||
void *context, | |||
jackctl_driver_t *driver, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_patchbay_init( | |||
struct jack_controller *controller_ptr); | |||
void | |||
jack_controller_patchbay_uninit( | |||
struct jack_controller *controller_ptr); | |||
void * | |||
jack_controller_patchbay_client_appeared_callback( | |||
void * server_context, | |||
uint64_t client_id, | |||
const char *client_name); | |||
void | |||
jack_controller_patchbay_client_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context); | |||
void * | |||
jack_controller_patchbay_port_appeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
const char *port_name, | |||
uint32_t port_flags, | |||
uint32_t port_type); | |||
void | |||
jack_controller_patchbay_port_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
void *port_context); | |||
void * | |||
jack_controller_patchbay_ports_connected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id); | |||
void | |||
jack_controller_patchbay_ports_disconnected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id, | |||
void *connection_context); | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_introspectable; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_control; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_configure; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_patchbay; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_transport; | |||
#endif /* #ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
Copyright (C) 2007-2008 Juuso Alasuutari | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#define CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED | |||
#include <stdbool.h> | |||
#include "jslist.h" | |||
#include "jack/control.h" | |||
#include "jack/jack.h" | |||
#include "jackdbus.h" | |||
struct jack_controller | |||
{ | |||
jackctl_server_t *server; | |||
void *patchbay_context; | |||
bool started; | |||
jack_client_t *client; | |||
unsigned int xruns; | |||
const char **driver_names; | |||
unsigned int drivers_count; | |||
/* current driver, NULL if not driver is selected */ | |||
jackctl_driver_t *driver; | |||
struct jack_dbus_object_descriptor dbus_descriptor; | |||
}; | |||
#define JACK_CONF_HEADER_TEXT \ | |||
"JACK settings, as persisted by D-Bus object.\n" \ | |||
"You probably don't want to edit this because\n" \ | |||
"it will be overwritten next time jackdbus saves.\n" | |||
jackctl_driver_t * | |||
jack_controller_find_driver( | |||
jackctl_server_t *server, | |||
const char *driver_name); | |||
jackctl_parameter_t * | |||
jack_controller_find_parameter( | |||
const JSList *parameters_list, | |||
const char *parameter_name); | |||
bool | |||
jack_controller_start_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_stop_server( | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_select_driver( | |||
struct jack_controller *controller_ptr, | |||
const char * driver_name); | |||
void | |||
jack_controller_settings_set_driver_option( | |||
jackctl_driver_t *driver, | |||
const char *option_name, | |||
const char *option_value); | |||
void | |||
jack_controller_settings_set_engine_option( | |||
struct jack_controller *controller_ptr, | |||
const char *option_name, | |||
const char *option_value); | |||
bool | |||
jack_controller_settings_save_engine_options( | |||
void *context, | |||
struct jack_controller *controller_ptr, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_write_option( | |||
void *context, | |||
const char *name, | |||
const char *content, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_settings_save_driver_options( | |||
void *context, | |||
jackctl_driver_t *driver, | |||
void *dbus_call_context_ptr); | |||
bool | |||
jack_controller_patchbay_init( | |||
struct jack_controller *controller_ptr); | |||
void | |||
jack_controller_patchbay_uninit( | |||
struct jack_controller *controller_ptr); | |||
void * | |||
jack_controller_patchbay_client_appeared_callback( | |||
void * server_context, | |||
uint64_t client_id, | |||
const char *client_name); | |||
void | |||
jack_controller_patchbay_client_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context); | |||
void * | |||
jack_controller_patchbay_port_appeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
const char *port_name, | |||
uint32_t port_flags, | |||
uint32_t port_type); | |||
void | |||
jack_controller_patchbay_port_disappeared_callback( | |||
void *server_context, | |||
uint64_t client_id, | |||
void *client_context, | |||
uint64_t port_id, | |||
void *port_context); | |||
void * | |||
jack_controller_patchbay_ports_connected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id); | |||
void | |||
jack_controller_patchbay_ports_disconnected_callback( | |||
void *server_context, | |||
uint64_t client1_id, | |||
void *client1_context, | |||
uint64_t port1_id, | |||
void *port1_context, | |||
uint64_t client2_id, | |||
void *client2_context, | |||
uint64_t port2_id, | |||
void *port2_context, | |||
uint64_t connection_id, | |||
void *connection_context); | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_introspectable; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_control; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_configure; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_patchbay; | |||
extern struct jack_dbus_interface_descriptor g_jack_controller_iface_transport; | |||
#endif /* #ifndef CONTROLLER_INTERNAL_H__04D54D51_3D79_49A2_A1DA_F8587E9E7F42__INCLUDED */ |
@@ -0,0 +1,12 @@ | |||
[D-BUS Service] | |||
Name=org.jackaudio.service | |||
Exec=${BINDIR}/jackdbus auto | |||
[D-BUS Service] | |||
Name=org.jackaudio.service | |||
Exec=${BINDIR}/jackdbus auto | |||
[D-BUS Service] | |||
Name=org.jackaudio.service | |||
Exec=${BINDIR}/jackdbus auto | |||
[D-BUS Service] | |||
Name=org.jackaudio.service | |||
Exec=${BINDIR}/jackdbus auto |
@@ -0,0 +1,144 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
#define XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr); | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr); | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr); | |||
#endif /* #ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
#define XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr); | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr); | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr); | |||
#endif /* #ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
#define XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr); | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr); | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr); | |||
#endif /* #ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED */ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
#define XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr); | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr); | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr); | |||
#endif /* #ifndef XML_H__4F102BD2_3354_41C9_B842_DC00E1557A0F__INCLUDED */ |
@@ -0,0 +1,232 @@ | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdbool.h> | |||
#include <dbus/dbus.h> | |||
#include <jack/driver.h> | |||
#include <jack/engine.h> | |||
#include "dbus.h" | |||
#include "controller_internal.h" | |||
bool | |||
jack_controller_settings_init() | |||
{ | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_uninit() | |||
{ | |||
} | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr) | |||
{ | |||
jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "jackdbus compiled without settings persistence"); | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdbool.h> | |||
#include <dbus/dbus.h> | |||
#include <jack/driver.h> | |||
#include <jack/engine.h> | |||
#include "dbus.h" | |||
#include "controller_internal.h" | |||
bool | |||
jack_controller_settings_init() | |||
{ | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_uninit() | |||
{ | |||
} | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr) | |||
{ | |||
jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "jackdbus compiled without settings persistence"); | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdbool.h> | |||
#include <dbus/dbus.h> | |||
#include <jack/driver.h> | |||
#include <jack/engine.h> | |||
#include "dbus.h" | |||
#include "controller_internal.h" | |||
bool | |||
jack_controller_settings_init() | |||
{ | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_uninit() | |||
{ | |||
} | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr) | |||
{ | |||
jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "jackdbus compiled without settings persistence"); | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
/* -*- Mode: C ; c-basic-offset: 4 -*- */ | |||
/* | |||
Copyright (C) 2007,2008 Nedko Arnaudov | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include <stdbool.h> | |||
#include <dbus/dbus.h> | |||
#include <jack/driver.h> | |||
#include <jack/engine.h> | |||
#include "dbus.h" | |||
#include "controller_internal.h" | |||
bool | |||
jack_controller_settings_init() | |||
{ | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_uninit() | |||
{ | |||
} | |||
bool | |||
jack_controller_settings_save( | |||
struct jack_controller * controller_ptr, | |||
void *dbus_call_context_ptr) | |||
{ | |||
jack_dbus_error(dbus_call_context_ptr, JACK_DBUS_ERROR_GENERIC, "jackdbus compiled without settings persistence"); | |||
return true; | |||
} | |||
void | |||
jack_controller_settings_load( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} | |||
void | |||
jack_controller_settings_save_auto( | |||
struct jack_controller * controller_ptr) | |||
{ | |||
} |
@@ -0,0 +1,82 @@ | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include "JackWinProcessSync.h" | |||
#include "JackError.h" | |||
namespace Jack | |||
{ | |||
bool JackWinProcessSync::TimedWait(long usec) | |||
{ | |||
DWORD res = WaitForSingleObject(fEvent, usec / 1000); | |||
return (res == WAIT_OBJECT_0); | |||
} | |||
void JackWinProcessSync::Wait() | |||
{ | |||
WaitForSingleObject(fEvent, INFINITE); | |||
} | |||
} // end of namespace | |||
/* | |||
Copyright (C) 2004-2006 Grame | |||
This program is free software; you can redistribute it and/or modify | |||
it under the terms of the GNU General Public License as published by | |||
the Free Software Foundation; either version 2 of the License, or | |||
(at your option) any later version. | |||
This program is distributed in the hope that it will be useful, | |||
but WITHOUT ANY WARRANTY; without even the implied warranty of | |||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |||
GNU General Public License for more details. | |||
You should have received a copy of the GNU General Public License | |||
along with this program; if not, write to the Free Software | |||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |||
*/ | |||
#include "JackWinProcessSync.h" | |||
#include "JackError.h" | |||
namespace Jack | |||
{ | |||
bool JackWinProcessSync::TimedWait(long usec) | |||
{ | |||
DWORD res = WaitForSingleObject(fEvent, usec / 1000); | |||
return (res == WAIT_OBJECT_0); | |||
} | |||
void JackWinProcessSync::Wait() | |||
{ | |||
WaitForSingleObject(fEvent, INFINITE); | |||
} | |||
} // end of namespace | |||