From 992d6663e9ac26bedd16966e3075bcde2c69b3a0 Mon Sep 17 00:00:00 2001 From: pbd Date: Sun, 29 Sep 2002 11:33:57 +0000 Subject: [PATCH] fix location of "tied" flag in port structure - needed to be in shared part git-svn-id: svn+ssh://jackaudio.org/trunk/jack@246 0c269be4-1314-0410-8aa9-9f06e86f4224 --- configure.in | 13 ++++++-- example-clients/metro.c | 67 ++++++++++++++++++++++++++++++----------- jack/port.h | 28 ++++++++--------- libjack/Makefile.am | 2 +- libjack/client.c | 14 ++++----- 5 files changed, 82 insertions(+), 42 deletions(-) diff --git a/configure.in b/configure.in index 858aa46..cb9eb11 100644 --- a/configure.in +++ b/configure.in @@ -5,15 +5,22 @@ AC_CONFIG_AUX_DIR(.) JACK_MAJOR_VERSION=0 JACK_MINOR_VERSION=38 -JACK_MICRO_VERSION=0 +JACK_MICRO_VERSION=1 -BETA= +JACK_API_CURRENT=0 +JACK_API_REVISION=4 +JACK_API_AGE=0 AC_SUBST(JACK_MAJOR_VERSION) AC_SUBST(JACK_MINOR_VERSION) AC_SUBST(JACK_MICRO_VERSION) -JACK_SO_VERSION=${JACK_MAJOR_VERSION}:${JACK_MINOR_VERSION}:${JACK_MICRO_VERSION}${BETA} +AC_SUBST(JACK_API_MAJOR_VERSION) +AC_SUBST(JACK_API_MINOR_VERSION) +AC_SUBST(JACK_API_MICRO_VERSION) + +JACK_SO_VERSION=${JACK_API_CURRENT}:${JACK_API_REVISION}:${JACK_API_AGE} + JACK_VERSION=$JACK_MAJOR_VERSION.$JACK_MINOR_VERSION.${JACK_MICRO_VERSION}${BETA} JACK_RELEASE=$JACK_MAJOR_VERSION-$JACK_MINOR_VERSION-${JACK_MICRO_VERSION}${BETA} diff --git a/example-clients/metro.c b/example-clients/metro.c index 31f5c2b..271c9b6 100644 --- a/example-clients/metro.c +++ b/example-clients/metro.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #include #include @@ -37,7 +38,9 @@ int freq = 880; int bpm; jack_nframes_t tone_length, wave_length; sample_t *wave; -long pos = 0; +long offset = 0; +int transport_aware = 0; +jack_transport_state_t transport_state; void usage () @@ -51,25 +54,55 @@ usage: jack_metro [ --attack OR -a attack (in percent of duration) ] [ --decay OR -d decay (in percent of duration) ] [ --name OR -n jack name for metronome client ] + [ --transport OR -t transport aware ] --bpm OR -b beats per minute "); } -int -process (jack_nframes_t nframes, void *arg) +void +process_silence (jack_nframes_t nframes) +{ + sample_t *buffer = (sample_t *) jack_port_get_buffer (output_port, nframes); + memset (buffer, 0, sizeof (jack_default_audio_sample_t) * nframes); +} + +void +process_audio (jack_nframes_t nframes) { - sample_t *buffer = (sample_t *) jack_port_get_buffer(output_port, nframes); + + sample_t *buffer = (sample_t *) jack_port_get_buffer (output_port, nframes); jack_nframes_t frames_left = nframes; - - while (wave_length - pos < frames_left) { - memcpy (buffer + (nframes - frames_left), wave + pos, sizeof (sample_t) * (wave_length - pos)); - frames_left -= wave_length - pos; - pos = 0; + + while (wave_length - offset < frames_left) { + memcpy (buffer + (nframes - frames_left), wave + offset, sizeof (sample_t) * (wave_length - offset)); + frames_left -= wave_length - offset; + offset = 0; } if (frames_left > 0) { - memcpy (buffer + (nframes - frames_left), wave + pos, sizeof (sample_t) * frames_left); - pos += frames_left; + memcpy (buffer + (nframes - frames_left), wave + offset, sizeof (sample_t) * frames_left); + offset += frames_left; } +} + +int +process (jack_nframes_t nframes, void *arg) +{ + jack_transport_info_t ti; + + if (transport_aware) { + ti.valid = JackTransportPosition | JackTransportState; + jack_get_transport_info (client, &ti); + + // not rolling, bail out + if (ti.state == JackTransportStopped) { + process_silence (nframes); + return 0; + } + offset = ti.position % wave_length; + } + + process_audio (nframes); + return 0; } @@ -101,7 +134,7 @@ main (int argc, char *argv[]) char *bpm_string = "bpm"; int verbose = 0; - const char *options = "f:A:D:a:d:b:n:hv"; + const char *options = "f:A:D:a:d:b:n:thv"; struct option long_options[] = { {"frequency", 1, 0, 'f'}, @@ -111,6 +144,7 @@ main (int argc, char *argv[]) {"decay", 1, 0, 'd'}, {"bpm", 1, 0, 'b'}, {"name", 1, 0, 'n'}, + {"transport", 0, 0, 't'}, {"help", 0, 0, 'h'}, {"verbose", 0, 0, 'v'}, {0, 0, 0, 0} @@ -132,7 +166,7 @@ main (int argc, char *argv[]) break; case 'D': dur_arg = atoi (optarg); - fprintf (stderr, "durarg = %lu\n", dur_arg); + fprintf (stderr, "durarg = %u\n", dur_arg); break; case 'a': if (((attack_percent = atoi (optarg)) < 0) || (attack_percent > 100)) { @@ -155,7 +189,6 @@ main (int argc, char *argv[]) bpm_string = (char *) malloc ((strlen (optarg) + 4) * sizeof (char)); strcpy (bpm_string, optarg); strcat (bpm_string, "_bpm"); - fprintf (stderr, "bpm = %lu\n", bpm); break; case 'n': client_name = (char *) malloc (strlen (optarg) * sizeof (char)); @@ -164,6 +197,9 @@ main (int argc, char *argv[]) case 'v': verbose = 1; break; + case 't': + transport_aware = 1; + break; default: fprintf (stderr, "unknown option %c\n", opt); case 'h': @@ -232,9 +268,6 @@ main (int argc, char *argv[]) return 1; } - if (verbose) { - } - while (1) { sleep(1); }; diff --git a/jack/port.h b/jack/port.h index ca857ba..a70d123 100644 --- a/jack/port.h +++ b/jack/port.h @@ -59,22 +59,23 @@ typedef struct _jack_port_type_info { */ typedef struct _jack_port_shared { - int shm_key; - size_t offset; + int shm_key; + size_t offset; - unsigned long flags; - unsigned long buffer_size; - jack_port_id_t id; - char name[JACK_CLIENT_NAME_SIZE+JACK_PORT_NAME_SIZE+2]; - jack_port_type_info_t type_info; - jack_client_id_t client_id; + unsigned long flags; + unsigned long buffer_size; + jack_port_id_t id; + char name[JACK_CLIENT_NAME_SIZE+JACK_PORT_NAME_SIZE+2]; + jack_port_type_info_t type_info; + jack_client_id_t client_id; - volatile jack_nframes_t latency; - volatile jack_nframes_t total_latency; - volatile unsigned char monitor_requests; + volatile jack_nframes_t latency; + volatile jack_nframes_t total_latency; + volatile unsigned char monitor_requests; - char in_use : 1; - char locked : 1; + char in_use : 1; + char locked : 1; + struct _jack_port *tied; } jack_port_shared_t; @@ -88,7 +89,6 @@ struct _jack_port { struct _jack_port_shared *shared; pthread_mutex_t connection_lock; GSList *connections; - struct _jack_port *tied; }; /* inline would be cleaner, but it needs to be fast even in non-optimized diff --git a/libjack/Makefile.am b/libjack/Makefile.am index 4985e47..181ef3f 100644 --- a/libjack/Makefile.am +++ b/libjack/Makefile.am @@ -7,5 +7,5 @@ lib_LTLIBRARIES = libjack.la libjack_la_SOURCES = client.c pool.c driver.c libjack_la_LIBADD = $(GLIB_LIBS) -lm -lpthread -libjack_la_LDFLAGS = -export-dynamic -release @VERSION@ -version-info 0:0:0 +libjack_la_LDFLAGS = -export-dynamic -version-info @JACK_SO_VERSION@ diff --git a/libjack/client.c b/libjack/client.c index 3b1f3cb..7668f86 100644 --- a/libjack/client.c +++ b/libjack/client.c @@ -1120,7 +1120,7 @@ jack_port_new (jack_client_t *client, jack_port_id_t port_id, jack_control_t *co port->shared = shared; pthread_mutex_init (&port->connection_lock, NULL); port->connections = 0; - port->tied = NULL; + port->shared->tied = NULL; si = NULL; @@ -1374,8 +1374,8 @@ jack_port_get_buffer (jack_port_t *port, jack_nframes_t nframes) */ if (port->shared->flags & JackPortIsOutput) { - if (port->tied) { - return jack_port_get_buffer (port->tied, nframes); + if (port->shared->tied) { + return jack_port_get_buffer (port->shared->tied, nframes); } return jack_port_buffer (port); } @@ -1402,7 +1402,7 @@ jack_port_get_buffer (jack_port_t *port, jack_nframes_t nframes) the buffer of the connected (output) port. */ - return jack_port_buffer (((jack_port_t *) node->data)); + return jack_port_get_buffer (((jack_port_t *) node->data), nframes); } /* multiple connections. use a local buffer and mixdown @@ -1441,7 +1441,7 @@ jack_port_tie (jack_port_t *src, jack_port_t *dst) return -1; } - dst->tied = src; + dst->shared->tied = src; return 0; } @@ -1449,11 +1449,11 @@ int jack_port_untie (jack_port_t *port) { - if (port->tied == NULL) { + if (port->shared->tied == NULL) { jack_error ("port \"%s\" is not tied", port->shared->name); return -1; } - port->tied = NULL; + port->shared->tied = NULL; return 0; }