Rename interpretor to interpreter.
[Faustine.git] / interpreter / preprocessor / faust-0.9.47mr3 / architecture / audio / netjack-dsp.h
diff --git a/interpreter/preprocessor/faust-0.9.47mr3/architecture/audio/netjack-dsp.h b/interpreter/preprocessor/faust-0.9.47mr3/architecture/audio/netjack-dsp.h
new file mode 100644 (file)
index 0000000..83f5a81
--- /dev/null
@@ -0,0 +1,130 @@
+/************************************************************************
+
+       IMPORTANT NOTE : this file contains two clearly delimited sections :
+       the ARCHITECTURE section (in two parts) and the USER section. Each section
+       is governed by its own copyright and license. Please check individually
+       each section for license and copyright information.
+*************************************************************************/
+
+/*******************BEGIN ARCHITECTURE SECTION (part 1/2)****************/
+
+/************************************************************************
+    FAUST Architecture File
+       Copyright (C) 2003-2011 GRAME, Centre National de Creation Musicale
+    ---------------------------------------------------------------------
+    This Architecture section is free software; you can redistribute it
+    and/or modify it under the terms of the GNU General Public License
+       as published by the Free Software Foundation; either version 3 of
+       the License, or (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+       along with this program; If not, see <http://www.gnu.org/licenses/>.
+
+       EXCEPTION : As a special exception, you may create a larger work
+       that contains this FAUST architecture section and distribute
+       that work under terms of your choice, so long as this FAUST
+       architecture section is not modified.
+
+
+ ************************************************************************
+ ************************************************************************/
+
+#ifndef __netjack_dsp__
+#define __netjack_dsp__
+
+#include "audio.h"
+#include "dsp.h"
+#include <string>
+#include <jack/net.h>
+
+class netjackaudio : public audio {
+
+        dsp* fDsp;
+        jack_net_slave_t* fNet;
+        int fCelt;
+        std::string fMasterIP;
+        int fMasterPort;
+
+        static void net_shutdown(void *)
+        {
+            printf("Network failure, restart...\n");
+        }
+
+        static int net_process(jack_nframes_t buffer_size,
+                                int,
+                                float** audio_input_buffer,
+                                int,
+                                void**,
+                                int,
+                                float** audio_output_buffer,
+                                int,
+                                void**,
+                                void* arg)
+        {
+            AVOIDDENORMALS;
+            netjackaudio* obj = (netjackaudio*)arg;
+            obj->fDsp->compute(buffer_size, audio_input_buffer, audio_output_buffer);
+            return 0;
+        }
+
+    public:
+
+        netjackaudio(int celt, const std::string master_ip, int master_port)
+            :fCelt(celt), fMasterIP(master_ip), fMasterPort(master_port)
+        {}
+
+        bool init(const char* name, dsp* DSP)
+        {
+            fDsp = DSP;
+            jack_slave_t request = {
+                DSP->getNumInputs(),
+                DSP->getNumOutputs(),
+                0, 0,
+                DEFAULT_MTU,
+                -1,
+                (fCelt > 0) ? JackCeltEncoder: JackFloatEncoder,
+                (fCelt > 0) ? fCelt : 0,
+                2
+            };
+
+            jack_master_t result;
+            if ((fNet = jack_net_slave_open(fMasterIP.c_str(), fMasterPort, name, &request, &result)) == 0) {
+                printf("jack remote server not running ?\n");
+                return false;
+            }
+
+            jack_set_net_slave_process_callback(fNet, net_process, this);
+            jack_set_net_slave_shutdown_callback(fNet, net_shutdown, 0);
+
+            fDsp->init(result.sample_rate);
+            return true;
+        }
+
+        bool start()
+        {
+            if (jack_net_slave_activate(fNet)) {
+                printf("cannot activate net");
+                return false;
+            }
+            return true;
+        }
+
+        void stop()
+        {
+            jack_net_slave_deactivate(fNet);
+            jack_net_slave_close(fNet);
+        }
+
+};
+
+
+#endif
+
+
+/********************END ARCHITECTURE SECTION (part 2/2)****************/
+