diff --git a/jack/engine.h b/jack/engine.h index 1884690..6bac8cf 100644 --- a/jack/engine.h +++ b/jack/engine.h @@ -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__ */ diff --git a/jackd/engine.c b/jackd/engine.c index b8d3824..8ea3107 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -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 */