From eeb327aae2ebebb520e3c7af961978a203f03586 Mon Sep 17 00:00:00 2001 From: torben Date: Thu, 28 Jan 2010 17:49:20 +0000 Subject: [PATCH] allocate mix_buffer upon connection, not on demand in RT thread. git-svn-id: svn+ssh://jackaudio.org/trunk/jack@3890 0c269be4-1314-0410-8aa9-9f06e86f4224 --- jack/internal.h | 2 +- jackd/engine.c | 2 +- libjack/client.c | 25 ++++++++++++++++++++++--- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/jack/internal.h b/jack/internal.h index b51ef44..ebcfcb7 100644 --- a/jack/internal.h +++ b/jack/internal.h @@ -494,7 +494,7 @@ extern jack_port_functions_t jack_builtin_audio_functions; extern jack_port_type_info_t jack_builtin_port_types[]; -extern void jack_client_invalidate_port_buffers (jack_client_t *client); +extern void jack_client_fix_port_buffers (jack_client_t *client); extern void jack_transport_copy_position (jack_position_t *from, jack_position_t *to); diff --git a/jackd/engine.c b/jackd/engine.c index 677d993..6ae9c42 100644 --- a/jackd/engine.c +++ b/jackd/engine.c @@ -2551,7 +2551,7 @@ jack_deliver_event (jack_engine_t *engine, jack_client_internal_t *client, break; case BufferSizeChange: - jack_client_invalidate_port_buffers + jack_client_fix_port_buffers (client->private_client); if (client->control->bufsize_cbset) { diff --git a/libjack/client.c b/libjack/client.c index e4b40ec..bbed595 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -396,7 +396,7 @@ jack_client_free (jack_client_t *client) } void -jack_client_invalidate_port_buffers (jack_client_t *client) +jack_client_fix_port_buffers (jack_client_t *client) { JSList *node; jack_port_t *port; @@ -412,8 +412,14 @@ jack_client_invalidate_port_buffers (jack_client_t *client) if (port->shared->flags & JackPortIsInput) { if (port->mix_buffer) { + size_t buffer_size = + jack_port_type_buffer_size( port->type_info, + client->engine->buffer_size ); jack_pool_release (port->mix_buffer); - port->mix_buffer = NULL; + port->mix_buffer = jack_pool_alloc (buffer_size); + port->fptr.buffer_init (port->mix_buffer, + buffer_size, + client->engine->buffer_size); } } } @@ -442,6 +448,19 @@ jack_client_handle_port_connection (jack_client_t *client, jack_event_t *event) control_port = jack_port_by_id_int (client, event->x.self_id, &need_free); pthread_mutex_lock (&control_port->connection_lock); + + if ((control_port->shared->flags & JackPortIsInput) + && (control_port->connections != NULL) + && (control_port->mix_buffer == NULL) ) { + size_t buffer_size = + jack_port_type_buffer_size( control_port->type_info, + client->engine->buffer_size ); + control_port->mix_buffer = jack_pool_alloc (buffer_size); + control_port->fptr.buffer_init (control_port->mix_buffer, + buffer_size, + client->engine->buffer_size); + } + control_port->connections = jack_slist_prepend (control_port->connections, (void *) other); @@ -1415,7 +1434,7 @@ jack_client_process_events (jack_client_t* client) break; case BufferSizeChange: - jack_client_invalidate_port_buffers (client); + jack_client_fix_port_buffers (client); if (control->bufsize_cbset) { status = client->bufsize (control->nframes,