--- /dev/null
+/************************************************************************
+
+ 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)****************/
+