Jack2  1.9.10
net.h
00001 /*
00002   Copyright (C) 2009-2010 Grame
00003 
00004   This program is free software; you can redistribute it and/or modify
00005   it under the terms of the GNU Lesser General Public License as published by
00006   the Free Software Foundation; either version 2.1 of the License, or
00007   (at your option) any later version.
00008 
00009   This program is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012   GNU Lesser General Public License for more details.
00013 
00014   You should have received a copy of the GNU Lesser General Public License
00015   along with this program; if not, write to the Free Software
00016   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00017 
00018 */
00019 
00020 #ifndef __net_h__
00021 #define __net_h__
00022 
00023 #ifdef __cplusplus
00024 extern "C"
00025 {
00026 #endif
00027 
00028 #include <jack/systemdeps.h>
00029 #include <jack/types.h>
00030 #include <jack/weakmacros.h>
00031 
00032 #define DEFAULT_MULTICAST_IP    "225.3.19.154"
00033 #define DEFAULT_PORT            19000
00034 #define DEFAULT_MTU             1500
00035 #define MASTER_NAME_SIZE        256
00036 
00037 // Possible error codes
00038 
00039 #define NO_ERROR             0
00040 #define SOCKET_ERROR        -1
00041 #define SYNC_PACKET_ERROR   -2
00042 #define DATA_PACKET_ERROR   -3
00043 
00044 #define RESTART_CB_API 1
00045 
00046 enum JackNetEncoder {
00047 
00048     JackFloatEncoder = 0,   // samples are transmitted as float
00049     JackIntEncoder = 1,     // samples are transmitted as 16 bits integer
00050     JackCeltEncoder = 2,    // samples are transmitted using CELT codec (http://www.celt-codec.org/)
00051     JackOpusEncoder = 3,    // samples are transmitted using OPUS codec (http://www.opus-codec.org/)
00052 };
00053 
00054 typedef struct {
00055 
00056     int audio_input;    // from master or to slave (-1 to take master audio physical inputs)
00057     int audio_output;   // to master or from slave (-1 to take master audio physical outputs)
00058     int midi_input;     // from master or to slave (-1 to take master MIDI physical inputs)
00059     int midi_output;    // to master or from slave (-1 to take master MIDI physical outputs)
00060     int mtu;            // network Maximum Transmission Unit
00061     int time_out;       // in second, -1 means infinite
00062     int encoder;        // encoder type (one of JackNetEncoder)
00063     int kbps;           // KB per second for CELT encoder
00064     int latency;        // network latency
00065 
00066 } jack_slave_t;
00067 
00068 typedef struct {
00069 
00070     int audio_input;                    // master audio physical outputs (-1 to take slave wanted audio inputs)
00071     int audio_output;                   // master audio physical inputs (-1 to take slave wanted audio outputs)
00072     int midi_input;                     // master MIDI physical outputs (-1 to take slave wanted MIDI inputs)
00073     int midi_output;                    // master MIDI physical inputs (-1 to take slave wanted MIDI outputs)
00074     jack_nframes_t buffer_size;         // master buffer size
00075     jack_nframes_t sample_rate;         // master sample rate
00076     char master_name[MASTER_NAME_SIZE]; // master machine name
00077     int time_out;                       // in second, -1 means infinite
00078     int partial_cycle;                  // if 'true', partial cycle will be used 
00079 
00080 } jack_master_t;
00081 
00086 typedef struct _jack_net_slave jack_net_slave_t;
00087 
00097 jack_net_slave_t* jack_net_slave_open(const char* ip, int port, const char* name, jack_slave_t* request, jack_master_t* result);
00098 
00105 int jack_net_slave_close(jack_net_slave_t* net);
00106 
00122 typedef int (* JackNetSlaveProcessCallback) (jack_nframes_t buffer_size,
00123                                             int audio_input,
00124                                             float** audio_input_buffer,
00125                                             int midi_input,
00126                                             void** midi_input_buffer,
00127                                             int audio_output,
00128                                             float** audio_output_buffer,
00129                                             int midi_output,
00130                                             void** midi_output_buffer,
00131                                             void* data);
00132 
00141 int jack_set_net_slave_process_callback(jack_net_slave_t * net, JackNetSlaveProcessCallback net_callback, void *arg);
00142 
00149 int jack_net_slave_activate(jack_net_slave_t* net);
00150 
00157 int jack_net_slave_deactivate(jack_net_slave_t* net);
00158 
00165 int jack_net_slave_is_active(jack_net_slave_t* net);
00166 
00174 typedef int (*JackNetSlaveBufferSizeCallback)(jack_nframes_t nframes, void *arg);
00175 
00184 int jack_set_net_slave_buffer_size_callback(jack_net_slave_t *net, JackNetSlaveBufferSizeCallback bufsize_callback, void *arg);
00185 
00193 typedef int (*JackNetSlaveSampleRateCallback)(jack_nframes_t nframes, void *arg);
00194 
00203 int jack_set_net_slave_sample_rate_callback(jack_net_slave_t *net, JackNetSlaveSampleRateCallback samplerate_callback, void *arg);
00204 
00209 typedef void (*JackNetSlaveShutdownCallback)(void* arg);
00210 
00219 int jack_set_net_slave_shutdown_callback(jack_net_slave_t *net, JackNetSlaveShutdownCallback shutdown_callback, void *arg) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
00220 
00231 typedef int (*JackNetSlaveRestartCallback)(void* arg);
00232 
00241 int jack_set_net_slave_restart_callback(jack_net_slave_t *net, JackNetSlaveRestartCallback restart_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
00242 
00248 typedef void (*JackNetSlaveErrorCallback) (int error_code, void* arg);
00249 
00258 int jack_set_net_slave_error_callback(jack_net_slave_t *net, JackNetSlaveErrorCallback error_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
00259 
00263 typedef struct _jack_net_master jack_net_master_t;
00264 
00274 jack_net_master_t* jack_net_master_open(const char* ip, int port, const char* name, jack_master_t* request, jack_slave_t* result);
00275 
00282 int jack_net_master_close(jack_net_master_t* net);
00283 
00294 int jack_net_master_recv(jack_net_master_t* net, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer);
00295 
00307 int jack_net_master_recv_slice(jack_net_master_t* net, int audio_input, float** audio_input_buffer, int midi_input, void** midi_input_buffer, int frames);
00308 
00319 int jack_net_master_send(jack_net_master_t* net, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer);
00320 
00332 int jack_net_master_send_slice(jack_net_master_t* net, int audio_output, float** audio_output_buffer, int midi_output, void** midi_output_buffer, int frames);
00333 
00334 // Experimental Adapter API
00335 
00339 typedef struct _jack_adapter jack_adapter_t;
00340 
00352 jack_adapter_t* jack_create_adapter(int input, int output,
00353                                     jack_nframes_t host_buffer_size,
00354                                     jack_nframes_t host_sample_rate,
00355                                     jack_nframes_t adapted_buffer_size,
00356                                     jack_nframes_t adapted_sample_rate);
00357 
00364 int jack_destroy_adapter(jack_adapter_t* adapter);
00365 
00372 void jack_flush_adapter(jack_adapter_t* adapter);
00373 
00383 int jack_adapter_push_and_pull(jack_adapter_t* adapter, float** input, float** output, unsigned int frames);
00384 
00394 int jack_adapter_pull_and_push(jack_adapter_t* adapter, float** input, float** output, unsigned int frames);
00395 
00396 #ifdef __cplusplus
00397 }
00398 #endif
00399 
00400 #endif /* __net_h__ */