Browse Source

[core] add basic support for slave drivers to engine

git-svn-id: svn+ssh://jackaudio.org/trunk/jack@4398 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/0.121.0
torben 14 years ago
parent
commit
d3a0ec4cad
2 changed files with 137 additions and 4 deletions
  1. +9
    -0
      jack/engine.h
  2. +128
    -4
      jackd/engine.c

+ 9
- 0
jack/engine.h View File

@@ -68,6 +68,8 @@ struct _jack_engine {
jack_driver_desc_t *driver_desc;
JSList *driver_params;

JSList *slave_drivers;

/* these are "callbacks" made by the driver backend */
int (*set_buffer_size) (struct _jack_engine *, jack_nframes_t frames);
int (*set_sample_rate) (struct _jack_engine *, jack_nframes_t frames);
@@ -188,6 +190,9 @@ int jack_wait (jack_engine_t *engine);
int jack_engine_load_driver (jack_engine_t *engine,
jack_driver_desc_t * driver_desc,
JSList * driver_params);
int jack_engine_load_slave_driver (jack_engine_t *engine,
jack_driver_desc_t * driver_desc,
JSList * driver_params);
void jack_dump_configuration(jack_engine_t *engine, int take_lock);

/* private engine functions */
@@ -252,4 +257,8 @@ jack_client_by_name (jack_engine_t *engine, const char *name);
int jack_deliver_event (jack_engine_t *, jack_client_internal_t *, jack_event_t *);
void
jack_engine_signal_problems (jack_engine_t* engine);

int
jack_drivers_start (jack_engine_t *engine);

#endif /* __jack_engine_h__ */

+ 128
- 4
jackd/engine.c View File

@@ -1118,6 +1118,46 @@ jack_engine_load_driver (jack_engine_t *engine,
return 0;
}

int
jack_engine_load_slave_driver (jack_engine_t *engine,
jack_driver_desc_t * driver_desc,
JSList * driver_params)
{
jack_client_internal_t *client;
jack_driver_t *driver;
jack_driver_info_t *info;

if ((info = jack_load_driver (engine, driver_desc)) == NULL) {
return -1;
}

if ((client = jack_create_driver_client (engine, info->client_name)
) == NULL) {
return -1;
}

if ((driver = info->initialize (client->private_client,
driver_params)) == NULL) {
free (info);
return -1;
}

driver->handle = info->handle;
driver->finish = info->finish;
driver->internal_client = client;
free (info);

if (jack_add_slave_driver (engine, driver) < 0) {
jack_client_delete (engine, client);
return -1;
}

//engine->driver_desc = driver_desc;
//engine->driver_params = driver_params;

return 0;
}

#ifdef USE_CAPABILITIES

static int check_capabilities (jack_engine_t *engine)
@@ -1766,6 +1806,8 @@ jack_engine_new (int realtime, int rtpriority, int do_mlock, int do_unlock,
engine->driver_desc = NULL;
engine->driver_params = NULL;

engine->slave_drivers = NULL;

engine->set_sample_rate = jack_set_sample_rate;
engine->set_buffer_size = jack_driver_buffer_size;
engine->run_cycle = jack_run_cycle;
@@ -2078,6 +2120,75 @@ jack_engine_freewheel (void *arg)
return 0;
}

int
jack_drivers_start (jack_engine_t *engine)
{
JSList *node;
/* first start the slave drivers */
for (node=engine->slave_drivers; node; node=jack_slist_next(node))
{
jack_driver_t *sdriver = node->data;
sdriver->start( sdriver );

//XXX: need to remove driver which fail to start
}

/* now the master driver is started */
return engine->driver->start(engine->driver);
}

static int
jack_drivers_stop (jack_engine_t *engine)
{
JSList *node;
/* first stop the master driver */
int retval = engine->driver->stop(engine->driver);

/* now the slave drivers are stopped */
for (node=engine->slave_drivers; node; node=jack_slist_next(node))
{
jack_driver_t *sdriver = node->data;
sdriver->stop( sdriver );

//XXX: need to remove driver which fail to start
}

return retval;
}

static int
jack_drivers_read (jack_engine_t *engine, jack_nframes_t nframes)
{
JSList *node;
/* first start the slave drivers */
for (node=engine->slave_drivers; node; node=jack_slist_next(node))
{
jack_driver_t *sdriver = node->data;
sdriver->read (sdriver, nframes);

//XXX: need to remove driver which fail to start
}

/* now the master driver is started */
return engine->driver->read(engine->driver, nframes);
}

static int
jack_drivers_write (jack_engine_t *engine, jack_nframes_t nframes)
{
JSList *node;
/* first start the slave drivers */
for (node=engine->slave_drivers; node; node=jack_slist_next(node))
{
jack_driver_t *sdriver = node->data;
sdriver->write (sdriver, nframes);

//XXX: need to remove driver which fail to start
}

/* now the master driver is started */
return engine->driver->write(engine->driver, nframes);
}
static int
jack_start_freewheeling (jack_engine_t* engine, jack_client_id_t client_id)
{
@@ -2097,7 +2208,7 @@ jack_start_freewheeling (jack_engine_t* engine, jack_client_id_t client_id)
there are no more process() calls being handled.
*/

if (engine->driver->stop (engine->driver)) {
if (jack_drivers_stop (engine)) {
jack_error ("could not stop driver for freewheeling");
return -1;
}
@@ -2164,7 +2275,7 @@ jack_stop_freewheeling (jack_engine_t* engine, int engine_exiting)
/* restart the driver */
if (engine->driver->start (engine->driver)) {
if (jack_drivers_start (engine)) {
jack_error ("could not restart driver after freewheeling");
return -1;
}
@@ -2287,7 +2398,7 @@ jack_run_one_cycle (jack_engine_t *engine, jack_nframes_t nframes,
if (!engine->freewheeling) {
DEBUG("waiting for driver read\n");
if (driver->read (driver, nframes)) {
if (jack_drivers_read (engine, nframes)) {
goto unlock;
}
}
@@ -2300,7 +2411,7 @@ jack_run_one_cycle (jack_engine_t *engine, jack_nframes_t nframes,
}
if (!engine->freewheeling) {
if (driver->write (driver, nframes)) {
if (jack_drivers_write (engine, nframes)) {
goto unlock;
}
}
@@ -4051,6 +4162,19 @@ jack_use_driver (jack_engine_t *engine, jack_driver_t *driver)
return 0;
}

int
jack_add_slave_driver (jack_engine_t *engine, jack_driver_t *driver)
{
if (driver) {
if (driver->attach (driver, engine)) {
return -1;
}

engine->slave_drivers = jack_slist_append (engine->slave_drivers, driver);
}

return 0;
}

/* PORT RELATED FUNCTIONS */



Loading…
Cancel
Save