diff options
-rw-r--r-- | drivers/alsa/alsa_driver.c | 32 | ||||
m--------- | jack | 0 | ||||
-rw-r--r-- | jackd/engine.c | 7 | ||||
-rw-r--r-- | libjack/client.c | 9 | ||||
m--------- | tools | 0 |
5 files changed, 41 insertions, 7 deletions
diff --git a/drivers/alsa/alsa_driver.c b/drivers/alsa/alsa_driver.c index da1f843..3751442 100644 --- a/drivers/alsa/alsa_driver.c +++ b/drivers/alsa/alsa_driver.c @@ -33,6 +33,7 @@ #include "internal.h" #include "engine.h" #include "messagebuffer.h" +#include "libjack/local.h" #include <sysdeps/time.h> @@ -1721,6 +1722,33 @@ alsa_driver_run_cycle (alsa_driver_t *driver) return engine->run_cycle (engine, nframes, delayed_usecs); } +static void +alsa_driver_latency_callback (jack_latency_callback_mode_t mode, void* arg) +{ + alsa_driver_t* driver = (alsa_driver_t*) arg; + jack_client_t* client = driver->client; + jack_latency_range_t range; + JSList* node; + + if (mode == JackPlaybackLatency) { + range.min = range.max = driver->frames_per_cycle + driver->playback_frame_latency; + } else { + range.min = range.max = driver->frames_per_cycle + driver->capture_frame_latency; + } + + for (node = client->ports; node; node = jack_slist_next (node)) { + jack_port_t *port = node->data; + + if ((jack_port_flags (port) & JackPortIsOutput) && (mode == JackPlaybackLatency)) { + jack_port_set_latency_range (port, JackPlaybackLatency, &range); + } + + if ((jack_port_flags (port) & JackPortIsInput) && (mode == JackCaptureLatency)) { + jack_port_set_latency_range (port, JackCaptureLatency, &range); + } + } +} + static int alsa_driver_attach (alsa_driver_t *driver) { @@ -2367,7 +2395,9 @@ alsa_driver_new (char *name, char *playback_alsa_device, driver->capture_and_playback_not_synced = TRUE; } } - + + jack_set_latency_callback (client, alsa_driver_latency_callback, driver); + driver->client = client; return (jack_driver_t *) driver; diff --git a/jack b/jack -Subproject 66b41b24b448053a73aebc383745b0f4549eb5b +Subproject 433a4ab01fa84ff04e7753e80f5bfce04ad3881 diff --git a/jackd/engine.c b/jackd/engine.c index 15d2016..abf962b 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -1385,7 +1385,10 @@ do_request (jack_engine_t *engine, jack_request_t *req, int *reply_fd) case SetBufferSize: req->status = jack_set_buffer_size_request (engine, - req->x.nframes); + req->x.nframes); + jack_lock_graph (engine); + jack_compute_new_latency (engine); + jack_unlock_graph (engine); break; case IntClientHandle: @@ -2959,7 +2962,7 @@ jack_deliver_event (jack_engine_t *engine, jack_client_internal_t *client, /* caller must hold the graph lock */ - DEBUG ("delivering event (type %d)", event->type); + DEBUG ("delivering event (type %s)", jack_event_type_name (event->type)); /* we are not RT-constrained here, so use kill(2) to beef up our check on a client's continued well-being diff --git a/libjack/client.c b/libjack/client.c index ae88862..8874c5c 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -589,13 +589,14 @@ jack_client_handle_latency_callback (jack_client_t *client, jack_event_t *event, } } - /* for a driver invocation, this is enough. + /* for a driver invocation without its own latency callback, this is enough. * input and output ports do not depend on each other. */ - if (is_driver) + if (is_driver && !client->control->latency_cbset) { return 0; - - if (! client->control->latency_cbset) { + } + + if (!client->control->latency_cbset) { /* * default action is to assume all ports depend on each other. * then always take the maximum latency. diff --git a/tools b/tools -Subproject c6b4b572f543ce25588eec4d471905dffe52d19 +Subproject 840bbbf8cfe33a59a5b1b4a33e72f2aa6221d0b |