Rename interpretor to interpreter.
[Faustine.git] / interpreter / preprocessor / faust-0.9.47mr3 / architecture / audio / jack-dsp.h
diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/audio/jack-dsp.h b/interpreter/preprocessor/faust-0.9.47mr3/architecture/audio/jack-dsp.h
new file mode 100644 (file)
index 0000000..01ae0f2
--- /dev/null
@@ -0,0 +1,156 @@
+
+#ifndef __jack_dsp__
+#define __jack_dsp__
+
+#include <stdio.h>
+#include <jack/jack.h>
+#include "audio.h"
+#include "dsp.h"
+
+static int             _srate(jack_nframes_t nframes, void *);
+static void            _jack_shutdown(void *);
+static int             _process (jack_nframes_t nframes, void *client);
+#ifdef _OPENMP
+static void*   _jackthread(void* arg);
+#endif
+
+/******************************************************************************
+*******************************************************************************
+
+                                                       JACK AUDIO INTERFACE
+
+*******************************************************************************
+*******************************************************************************/
+
+class jackaudio : public audio {
+       dsp*                    fDsp;
+       jack_client_t*  fClient;
+       int                             fNumInChans;                    //      number of input channels
+       int                             fNumOutChans;                   //      number of output channels
+       jack_port_t *   fInput_ports[256];              // Jack input ports
+       jack_port_t *   fOutput_ports[256];             // Jack output ports
+       float*                  fInChannel[256];                // tables of noninterleaved input channels for FAUST
+       float*                  fOutChannel[256];               // tables of noninterleaved output channels for FAUST
+
+ public:
+                        jackaudio() : fClient(0), fNumInChans(0), fNumOutChans(0) {}
+       virtual ~jackaudio() { stop(); }
+
+       virtual bool init(const char*name, dsp* DSP) {
+               fDsp = DSP;
+               if ((fClient = jack_client_open(name, JackNullOption, NULL)) == 0) {
+                       fprintf(stderr, "jack server not running?\n");
+                       return false;
+               }
+       #ifdef _OPENMP
+               jack_set_process_thread(fClient, _jackthread, this);
+       #else
+               jack_set_process_callback(fClient, _process, this);
+       #endif
+
+               jack_set_sample_rate_callback(fClient, _srate, 0);
+               jack_on_shutdown(fClient, _jack_shutdown, 0);
+
+               fNumInChans  = fDsp->getNumInputs();
+               fNumOutChans = fDsp->getNumOutputs();
+
+               for (int i = 0; i < fNumInChans; i++) {
+                       char buf[256];
+                       snprintf(buf, 256, "in_%d", i);
+                       fInput_ports[i] = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
+               }
+               for (int i = 0; i < fNumOutChans; i++) {
+                       char buf[256];
+                       snprintf(buf, 256, "out_%d", i);
+                       fOutput_ports[i] = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
+               }
+               fDsp->init(jack_get_sample_rate(fClient));
+               return true;
+       }
+
+       virtual bool start() {
+               if (jack_activate(fClient)) {
+                       fprintf(stderr, "cannot activate client");
+                       return false;
+               }
+
+               char** physicalInPorts = (char **)jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical|JackPortIsInput);
+               char** physicalOutPorts = (char **)jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical|JackPortIsOutput);
+               if (physicalOutPorts != NULL) {
+                       for (int i = 0; i < fNumInChans && physicalOutPorts[i]; i++)
+                               jack_connect(fClient, physicalOutPorts[i], jack_port_name(fInput_ports[i]));
+               }
+               if (physicalInPorts != NULL) {
+                       for (int i = 0; i < fNumOutChans && physicalInPorts[i]; i++)
+                               jack_connect(fClient, jack_port_name(fOutput_ports[i]), physicalInPorts[i]);
+               }
+               return true;
+       }
+
+       virtual void stop() {
+               if (fClient) {
+                       jack_deactivate(fClient);
+                       for (int i = 0; i < fNumInChans; i++)
+                               jack_port_unregister(fClient, fInput_ports[i]);
+                       for (int i = 0; i < fNumOutChans; i++)
+                               jack_port_unregister(fClient, fOutput_ports[i]);
+                       jack_client_close(fClient);
+                       fClient = 0;
+               }
+       }
+
+       // jack callbacks
+       int     process (jack_nframes_t nframes) {
+               AVOIDDENORMALS;
+               for (int i = 0; i < fNumInChans; i++)
+                       fInChannel[i] = (float *)jack_port_get_buffer(fInput_ports[i], nframes);
+               for (int i = 0; i < fNumOutChans; i++)
+                       fOutChannel[i] = (float *)jack_port_get_buffer(fOutput_ports[i], nframes);
+               fDsp->compute(nframes, fInChannel, fOutChannel);
+               return 0;
+       }
+
+#ifdef _OPENMP
+       void process_thread () {
+               jack_nframes_t nframes;
+               while (1) {
+                       nframes = jack_cycle_wait(fClient);
+                       process (nframes);
+                       jack_cycle_signal(fClient, 0);
+               }
+       }
+#endif
+};
+
+//----------------------------------------------------------------------------
+// Jack Callbacks
+//----------------------------------------------------------------------------
+static int _srate(jack_nframes_t nframes, void *)
+{
+       printf("the sample rate is now %u/sec\n", nframes);
+       return 0;
+}
+
+static void _jack_shutdown(void *)
+{
+       exit(1);
+}
+
+static int _process(jack_nframes_t nframes, void *client)
+{
+       jackaudio* jackclient = (jackaudio*)client;
+       return jackclient->process (nframes);
+}
+
+#ifdef _OPENMP
+static void* _jackthread(void* arg)
+{
+       jackaudio* jackclient = (jackaudio*)arg;
+       jackclient->process_thread();
+       return 0;
+}
+#endif
+
+
+
+#endif