some indentation fixes.
[gjacktransport.git] / src / gjack.c
blobb7a9026aaccf481a6e6f5c91fc16beff058387e4
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <math.h>
5 #include "gjack.h"
6 #include <jack/jack.h>
7 #include <jack/transport.h>
8 #include "framerate.h"
11 /* status bar */
13 #include <gtk/gtk.h>
14 #include "support.h"
15 extern GtkWidget *window1;
16 void dothejack (gboolean onoff);
18 void status_msg (char *msg) {
19 gchar buf[PATH_MAX];
20 guint context = 1;
21 GtkWidget *statusbar1;
22 statusbar1=lookup_widget(window1,"statusbar1");
24 snprintf(buf, PATH_MAX, "%s", msg);
25 gtk_statusbar_pop(GTK_STATUSBAR(statusbar1), context);
26 gtk_statusbar_push(GTK_STATUSBAR(statusbar1), context, buf);
30 void status_printf (const char *format, ...) {
31 va_list arglist;
32 char text[PATH_MAX];
34 va_start(arglist, format);
35 vsnprintf(text, PATH_MAX, format, arglist);
36 va_end(arglist);
37 text[PATH_MAX -1] =0;
39 status_msg(text);
42 /* end status bar */
46 jack_client_t *jack_client = NULL;
47 jack_nframes_t j_srate = 48000;
48 char jackid[16];
49 int j_have_vfps = 0;
51 extern FrameRate *uffr;
52 extern FrameRate *jffr;
54 /* when jack shuts down... */
55 void jack_shutdown(void *arg)
57 jack_client=NULL;
58 status_printf ("jack server shutdown");
59 dothejack(0); //< toggle connected button...
62 extern gdouble unit_table[UNIT_LAST];
63 /* when jack changes its samplerate ... */
64 int jack_srate_callback(jack_nframes_t nframes, void *arg)
66 status_printf("jack sample rate: %i samples per second.",nframes);
67 j_srate = nframes;
68 // NOTE: this overrides the factor in the table.
69 // we'll be in trouble... ( oldunit == newunit)
70 // if it changes while the spinbutton's value is displayed in Audioframe units.
71 // but it will most probably never change anyway..
72 unit_table[UNIT_AUDIOFRAMES] = (gdouble) 1.0/j_srate;
73 return(0);
77 int jack_connected(void)
79 if (jack_client) return (1);
80 return (0);
83 void open_jack(void )
85 if (jack_client) {
86 status_printf ("already connected to jack..");
87 return;
90 int i = 0;
91 do {
92 snprintf(jackid,16,"gjtctl-%i",i);
93 jack_client = jack_client_open (jackid, JackUseExactName, NULL);
94 } while (jack_client == 0 && i++<16);
96 if (!jack_client) {
97 status_printf("could not connect to jack server.");
98 } else {
99 jack_on_shutdown (jack_client, jack_shutdown, 0);
100 jack_set_sample_rate_callback (jack_client, jack_srate_callback, NULL);
101 status_printf("connected as jack client '%s'",jackid);
102 jack_srate_callback(jack_get_sample_rate(jack_client),NULL); // init j_srate
103 jack_activate (jack_client);
107 void close_jack(void)
109 if (jack_client) {
110 jack_deactivate (jack_client);
111 jack_client_close (jack_client);
112 status_printf("disconnected from jack.");
114 jack_client=NULL;
117 double jack_poll_time (void)
119 jack_position_t jack_position;
120 double jack_time;
122 if (!jack_client) {
123 j_have_vfps=0;
124 return (-1);
127 /* Calculate frame. */
128 jack_transport_query(jack_client, &jack_position);
129 jack_time = jack_position.frame / (double) jack_position.frame_rate;
130 FR_setsamplerate(jffr,j_srate);
132 if (jack_position.valid&JackAudioVideoRatio) {
133 double jfps= jack_position.frame_rate / (double) jack_position.audio_frames_per_video_frame;
134 FR_setdbl(jffr,jfps,1);
135 j_have_vfps=1;
136 } else {
137 j_have_vfps=0;
140 return(jack_time);
144 void jack_reposition(double sec)
146 jack_nframes_t frame= rint(j_srate * sec);
147 if (jack_client)
148 jack_transport_locate (jack_client, frame);
151 void jack_stop(void)
153 if (jack_client) {
154 jack_transport_stop (jack_client);
155 status_printf("paused jack transport.");
159 void jack_play(void)
161 if (jack_client) {
162 jack_transport_start (jack_client);
163 status_printf("jack transport rolling.");
167 int jack_poll_transport_state (void) {
168 if (jack_client)
169 switch (jack_transport_query(jack_client, NULL)) {
170 case JackTransportRolling:
171 return 1|4;
172 case JackTransportStopped:
173 return 2|4;
174 default:
175 return 3|4;
177 return 0;