From 020cf581b2c9a66299f015c8cbc7a3d949e966a8 Mon Sep 17 00:00:00 2001 From: pbd Date: Fri, 21 Mar 2003 16:21:05 +0000 Subject: [PATCH] expanded transport/time information git-svn-id: svn+ssh://jackaudio.org/trunk/jack@355 0c269be4-1314-0410-8aa9-9f06e86f4224 --- configure.in | 4 +-- drivers/alsa/hdsp.c | 13 ++++++++-- example-clients/metro.c | 8 +++--- example-clients/showtime.c | 7 ++++- jack/internal.h | 30 ++-------------------- jack/transport.h | 52 ++++++++++++++++++++++++++------------ jackd/engine.c | 37 ++++++++++++++++++++++++--- libjack/client.c | 40 ++++------------------------- 8 files changed, 99 insertions(+), 92 deletions(-) diff --git a/configure.in b/configure.in index 62b33cd..9f42fcb 100644 --- a/configure.in +++ b/configure.in @@ -13,7 +13,7 @@ dnl micro version = incremented when implementation-only dnl changes are made dnl --- JACK_MAJOR_VERSION=0 -JACK_MINOR_VERSION=64 +JACK_MINOR_VERSION=65 JACK_MICRO_VERSION=0 dnl --- @@ -41,7 +41,7 @@ dnl slacker than this, and closer to those for the JACK version dnl number. dnl --- JACK_API_CURRENT=0 -JACK_API_REVISION=12 +JACK_API_REVISION=13 JACK_API_AGE=0 AC_SUBST(JACK_MAJOR_VERSION) diff --git a/drivers/alsa/hdsp.c b/drivers/alsa/hdsp.c index 3101544..1d6d7aa 100644 --- a/drivers/alsa/hdsp.c +++ b/drivers/alsa/hdsp.c @@ -74,7 +74,7 @@ set_control_id (snd_ctl_elem_id_t *ctl, const char *name) { snd_ctl_elem_id_set_name (ctl, name); snd_ctl_elem_id_set_numid (ctl, 0); - snd_ctl_elem_id_set_interface (ctl, SND_CTL_ELEM_IFACE_PCM); + snd_ctl_elem_id_set_interface (ctl, SND_CTL_ELEM_IFACE_HWDEP); snd_ctl_elem_id_set_device (ctl, 0); snd_ctl_elem_id_set_subdevice (ctl, 0); snd_ctl_elem_id_set_index (ctl, 0); @@ -86,7 +86,8 @@ set_control_id (snd_ctl_elem_id_t *ctl, const char *name) /* input_channel to output_channel (see hdsp_physical_input_index */ /* etc. above. */ /* gain is an int from 0 to 65535, with 0 being -inf gain, and */ -/* 65535 being about 2dB. */ +/* 65535 being about +2dB. */ + static int hdsp_set_mixer_gain(jack_hardware_t *hw, int input_channel, int output_channel, int gain) { @@ -133,11 +134,14 @@ static int hdsp_set_input_monitor_mask (jack_hardware_t *hw, unsigned long mask) /* Monitoring requested for this channel? */ if(mask & (1<control->pending_time.usecs = engine->control->current_time.usecs; + engine->control->pending_time.frame_rate = engine->control->current_time.frame_rate; engine->control->current_time = engine->control->pending_time; - + /* find any clients that need removal due to timeouts, etc. */ for (node = engine->clients; node; node = jack_slist_next (node) ) { @@ -1276,6 +1281,8 @@ jack_client_deactivate (jack_engine_t *engine, jack_client_id_t id) engine->control->pending_time.frame = 0; engine->control->current_time.transport_state = JackTransportStopped; engine->control->pending_time.transport_state = JackTransportStopped; + engine->control->current_time.valid = JackTransportState|JackTransportPosition; + engine->control->pending_time.valid = JackTransportState|JackTransportPosition; } for (portnode = client->ports; portnode; portnode = jack_slist_next (portnode)) { @@ -2150,6 +2157,8 @@ jack_zombify_client (jack_engine_t *engine, jack_client_internal_t *client) engine->control->pending_time.frame = 0; engine->control->current_time.transport_state = JackTransportStopped; engine->control->pending_time.transport_state = JackTransportStopped; + engine->control->current_time.valid = JackTransportState|JackTransportPosition; + engine->control->pending_time.valid = JackTransportState|JackTransportPosition; } jack_client_disconnect (engine, client); @@ -2819,6 +2828,7 @@ jack_port_do_connect (jack_engine_t *engine, jack_connection_internal_t *connection; jack_port_internal_t *srcport, *dstport; jack_port_id_t src_id, dst_id; + jack_client_internal_t *client; if ((srcport = jack_get_port_by_name (engine, source_port)) == NULL) { jack_error ("unknown source port in attempted connection [%s]", source_port); @@ -2852,12 +2862,31 @@ jack_port_do_connect (jack_engine_t *engine, return -1; } - if (strcmp (srcport->shared->type_info.type_name, - dstport->shared->type_info.type_name) != 0) { + if (strcmp (srcport->shared->type_info.type_name, dstport->shared->type_info.type_name) != 0) { jack_error ("ports used in attemped connection are not of the same data type"); return -1; } + if ((client = jack_client_internal_by_id (engine, srcport->shared->client_id)) == 0) { + jack_error ("unknown client set as owner of port - cannot connect"); + return -1; + } + + if (!client->control->active) { + jack_error ("cannot connect ports owned by inactive clients; \"%s\" is not active", client->control->name); + return -1; + } + + if ((client = jack_client_internal_by_id (engine, dstport->shared->client_id)) == 0) { + jack_error ("unknown client set as owner of port - cannot connect"); + return -1; + } + + if (!client->control->active) { + jack_error ("cannot connect ports owned by inactive clients; \"%s\" is not active", client->control->name); + return -1; + } + connection = (jack_connection_internal_t *) malloc (sizeof (jack_connection_internal_t)); connection->source = srcport; diff --git a/libjack/client.c b/libjack/client.c index 799f078..b4bdedd 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -529,7 +529,7 @@ jack_client_new (const char *client_name) fail: if (client->engine) { - munmap ((char *) client->engine, sizeof (jack_control_t)); + munmap ((char *) client->engine, res.control_size); } if (client->control) { munmap ((char *) client->control, sizeof (jack_client_control_t)); @@ -1411,48 +1411,18 @@ jack_frame_time (const jack_client_t *client) /* TRANSPORT CONTROL */ -int +void jack_get_transport_info (jack_client_t *client, jack_transport_info_t *info) { - jack_time_info_t *time_info = &client->engine->current_time; - - if (info->valid & JackTransportState) { - info->state = time_info->transport_state; - } - - if (info->valid & JackTransportPosition) { - info->position = time_info->frame; - } - - if (info->valid & JackTransportLoop) { - info->loop_start = time_info->loop_start; - info->loop_end = time_info->loop_end; - } - - return 0; + *info = client->engine->current_time; } -int +void jack_set_transport_info (jack_client_t *client, jack_transport_info_t *info) { - jack_time_info_t *time_info = &client->engine->pending_time; - - if (info->valid & JackTransportState) { - time_info->transport_state = info->state; - } - - if (info->valid & JackTransportPosition) { - time_info->frame = info->position; - } - - if (info->valid & JackTransportLoop) { - time_info->loop_start = info->loop_start; - time_info->loop_end = info->loop_end; - } - - return 0; + client->engine->pending_time = *info; } float