--- bea/main.c	2004-10-08 01:47:55.000000000 +0200
+++ bea-jack/main.c	2007-04-19 22:37:08.000000000 +0200
@@ -80,9 +80,13 @@
  *    2,048   92.88        4,096          8,192
  */
 
-#define BUFFER_SIZE_SAMPLES  128 // 256 // 2048
-#define BUFFER_SIZE_BYTES    256 // 512 // 4096
-#define STEREO_BUFR_BYTES    512 // 1028 // 8192
+//#define BUFFER_SIZE_SAMPLES  128 // 256 // 2048
+//#define BUFFER_SIZE_BYTES    256 // 512 // 4096
+//#define STEREO_BUFR_BYTES    512 // 1028 // 8192
+
+#define BUFFER_SIZE_SAMPLES  2048
+#define BUFFER_SIZE_BYTES    4096
+#define STEREO_BUFR_BYTES    8192
 
 struct _drawbarPreset {
   char * key;
@@ -120,6 +124,100 @@
   }
 }
 
+#define HAVE_JACK
+
+#ifdef HAVE_JACK
+#include <jack/jack.h>
+
+jack_client_t *j_client = NULL;
+jack_port_t **j_output_port; 
+jack_default_audio_sample_t **j_output_bufferptrs; // 
+
+
+/* when jack shuts down... */
+void jack_shutdown_callback(void *arg) {
+  fprintf(stderr,"jack server shut down.\n");
+}
+
+int jack_srate_callback(jack_nframes_t nframes, void *arg) {
+  audio_splrate= (int) nframes;
+  return(0); 
+}
+
+int jack_bufsiz_callback(jack_nframes_t nframes, void *arg) {
+  audio_fragsize= (int) nframes;
+  return(0); 
+}
+
+int jack_audio_callback (jack_nframes_t nframes, void *arg) {
+  jack_default_audio_sample_t **out = j_output_bufferptrs; 
+  int i,s;
+  jack_nframes_t my_tot_latency = 0;
+
+  for (i=0;i<audio_channels;i++) {
+  	jack_nframes_t my_latency = jack_port_get_total_latency(j_client,j_output_port[i]);
+  	if (my_latency > my_tot_latency) my_tot_latency = my_latency;
+  	//printf("DEBUG: c=%i pl=%i tl=%i\n",i,jack_port_get_latency(j_output_port[i]) ,jack_port_get_total_latency(j_client,j_output_port[i]));
+  	out[i] = jack_port_get_buffer (j_output_port[i], nframes);
+  	//memset(out[i],0, sizeof (jack_default_audio_sample_t) * nframes);
+  }
+
+  unsigned char * obuf;
+  oscGenerateFragment (bufA, nframes);
+  obuf = preamp (bufA, bufB, nframes);
+  obuf = reverb (obuf, bufB, nframes);
+  whirlProc (obuf, bufC, nframes);
+
+  for (s=0;s<nframes;s++)
+    for (i=0;i<audio_channels;i++) 
+    //out[i][s]= ((((signed short*)bufB)[s]))/65536.0;
+      out[i][s]= ((((signed short*)bufC)[audio_channels*s+i]))/65536.0;
+
+  return(nframes);
+}
+
+int open_jack(void) {
+  int i;
+  i = 0;
+  do {
+    char jackid[16];
+    snprintf(jackid,16,"beatrix-%i",i);
+    j_client = jack_client_new (jackid);
+  } while (j_client == 0 && i++<16);
+
+  if (!j_client) {
+    fprintf(stderr, "could not connect to jack.\n");
+    return(1);
+  }	
+  audio_channels=audio_channels_requested;
+  audio_format = audio_format_requested;
+
+  jack_on_shutdown (j_client, jack_shutdown_callback, NULL);
+  jack_set_process_callback(j_client,jack_audio_callback,NULL);
+  jack_set_sample_rate_callback (j_client, jack_srate_callback, NULL);
+  jack_set_buffer_size_callback (j_client, jack_bufsiz_callback, NULL);
+
+  j_output_port= calloc(audio_channels,sizeof(jack_port_t*));
+  j_output_bufferptrs = calloc(audio_channels,sizeof(jack_default_audio_sample_t*));
+
+  for (i=0;i<audio_channels;i++) {
+    char channelid[16];
+    snprintf(channelid,16,"output-%i",i);
+    j_output_port[i] = jack_port_register (j_client, channelid, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+    if (!j_output_port[i]) {
+      fprintf(stderr, "no more jack ports available.\n");
+      jack_client_close (j_client);
+      return(1);
+    }
+  }
+  jack_srate_callback(jack_get_sample_rate(j_client),NULL); // init j_srate
+  jack_bufsiz_callback(jack_get_buffer_size(j_client),NULL); // init j_bufsiz & alloc
+
+  jack_activate(j_client);
+  return(0);
+}
+#endif
+
 /*
  * This routine initializes the audio driver according to the current
  * configuration parameters.
@@ -127,6 +225,13 @@
 static void initAudio () {
   /* Open the audio hardware. */
 
+#ifdef HAVE_JACK
+  if (open_jack()) {
+    perror ("could not connect to JACK.");
+    exit(1);
+  }
+#else /* NO JACK - OSS */
+
   if ((audio_fd = open (audioDevice, O_WRONLY, 0)) == -1) {
     perror (audioDevice);
     exit (1);
@@ -209,6 +314,7 @@
   fprintf (stderr, "AUDIO FRAGMENT SIZE : %d\n", audio_fragsize);
 #endif /* COMMENT */
 
+#endif /* NO JACK = OSS */
 }
 
 /*
@@ -592,7 +698,9 @@
 #endif /* STATIC_CHORD */
 
     while (TRUE) {
-
+#ifdef HAVE_JACK
+      sleep (1); // jack callback is doing this:
+#else
       oscGenerateFragment (bufA, BUFFER_SIZE_SAMPLES);
 
       obuf = preamp (bufA, bufB, BUFFER_SIZE_SAMPLES);
@@ -627,6 +735,7 @@
 	perror ("write audio_fd bufC");
 	exit (1);
       }
+#endif
     }
   }
 
@@ -634,3 +743,5 @@
 
   return 0;
 }
+
+/* vi:set ts=8 sts=2 sw=2: */
--- bea/Makefile	2004-11-25 23:42:33.000000000 +0100
+++ bea-jack/Makefile	2007-04-19 21:07:21.000000000 +0200
@@ -45,7 +45,7 @@
 CFLAGS=	-O $(DEFINES)
 #CFLAGS=	-g -DOFFLINE $(DEFINES)
 
-LIBS=	-lm -lpthread
+LIBS=	-lm -lpthread -ljack
 
 beatrix:	$(OBJS)
 	cc -o $(@) $(OBJS) $(LIBS)
