From a95e3458aaa5f11f78006632be7b3f87d83febcd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?IOhannes=20m=20zm=C3=B6lnig?=
 <zmoelnig@users.sourceforge.net>
Date: Thu, 30 Apr 2015 21:16:01 +0000
Subject: imported patch from Patrice Colet

svn path=/trunk/externals/tb/; revision=17460
---
 jack_transport/jack_transport.c | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/jack_transport/jack_transport.c b/jack_transport/jack_transport.c
index 84b269e..e9efd11 100644
--- a/jack_transport/jack_transport.c
+++ b/jack_transport/jack_transport.c
@@ -24,27 +24,36 @@
 
 static t_class *jack_transport_class;
 
+
+float time_beats_per_bar = 4.0;
+float time_beat_type = 1.0 / 4.0;
+double time_ticks_per_beat = 1920.0;
+double time_beats_per_minute = 120.0;
+
 typedef struct _jack_transport
 {
     t_object x_obj;
 	t_outlet * x_outlet;
+	t_outlet * x_outlet_bar;
+	t_outlet * x_outlet_beat;
+	t_outlet * x_outlet_beat_type;
+	t_outlet * x_outlet_beats_per_bar;
+	t_outlet * x_outlet_beats_per_minute;
 	jack_client_t* x_jack_client;
 	jack_position_t* x_pos;
 } jack_transport_t;
 
-
 /* connect to jack server */
 static int jack_transport_connect(jack_transport_t * x)
 {
 	char port_name[80] = "";
-
 	static int client = 0;
 	do 
 	{
 		sprintf(port_name,"pure_data_jack_transport_%d",client);
 		client++;
 	} 
-	while (((x->x_jack_client = jack_client_new (port_name)) == 0) &&
+	while (((x->x_jack_client = jack_client_open (port_name, (jack_options_t)0, NULL)) == 0) &&
 		   client < 100);
 	client = 0;
 
@@ -67,7 +76,13 @@ static jack_transport_t * jack_transport_new(void)
 	int status = 0;
 	jack_transport_t *x = (jack_transport_t*) pd_new(jack_transport_class);
 	
+
 	x->x_outlet = outlet_new(&x->x_obj, NULL);
+	x->x_outlet_bar = outlet_new(&x->x_obj, NULL);
+	x->x_outlet_beat = outlet_new(&x->x_obj, NULL);
+	x->x_outlet_beat_type = outlet_new(&x->x_obj, NULL);
+	x->x_outlet_beats_per_bar = outlet_new(&x->x_obj, NULL);
+	x->x_outlet_beats_per_minute = outlet_new(&x->x_obj, NULL);
 	x->x_pos = (jack_position_t*) getbytes(sizeof(jack_position_t));
 	
 	status = jack_transport_connect(x);
@@ -87,6 +102,17 @@ static void jack_transport_stoper(jack_transport_t * x)
 	return;
 }
 
+static void jack_transport_timebase(jack_transport_t * x)
+{
+	jack_position_t pos;
+	const int rolling = (jack_transport_query(x->x_jack_client, &pos) == JackTransportRolling);
+	outlet_float(x->x_outlet_bar, pos.bar);
+	outlet_float(x->x_outlet_beat, pos.beat);
+	outlet_float(x->x_outlet_beat_type, pos.beat_type);
+	outlet_float(x->x_outlet_beats_per_bar, pos.beats_per_bar);
+	outlet_float(x->x_outlet_beats_per_minute, pos.beats_per_minute);
+}
+
 static void jack_transport_bang(jack_transport_t * x)
 {
 	float f;
@@ -94,7 +120,7 @@ static void jack_transport_bang(jack_transport_t * x)
 		return;
 	
 	f = (float)jack_get_current_transport_frame(x->x_jack_client);
-	
+	jack_transport_timebase(x);
 	outlet_float(x->x_outlet, f);
 }
 
-- 
cgit v1.2.1