00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackMidiPort.h"
00021 #include "JackTools.h"
00022 #include "JackPlatformPlug.h"
00023 #include "types.h"
00024 #include "transport.h"
00025 #ifndef WIN32
00026 #include <netinet/in.h>
00027 #endif
00028 #include <cmath>
00029
00030 using namespace std;
00031
00032 #ifndef htonll
00033 #ifdef __BIG_ENDIAN__
00034 #define htonll(x) (x)
00035 #define ntohll(x) (x)
00036 #else
00037 #define htonll(x) ((((uint64_t)htonl(x)) << 32) + htonl(x >> 32))
00038 #define ntohll(x) ((((uint64_t)ntohl(x)) << 32) + ntohl(x >> 32))
00039 #endif
00040 #endif
00041
00042 namespace Jack
00043 {
00044 typedef struct _session_params session_params_t;
00045 typedef struct _packet_header packet_header_t;
00046 typedef struct _net_transport_data net_transport_data_t;
00047 typedef struct sockaddr socket_address_t;
00048 typedef struct in_addr address_t;
00049 typedef jack_default_audio_sample_t sample_t;
00050
00051
00052
00070 #define MASTER_PROTOCOL 1
00071 #define SLAVE_PROTOCOL 1
00072
00073 struct _session_params
00074 {
00075 char fPacketType[7];
00076 char fProtocolVersion;
00077 uint32_t fPacketID;
00078 char fName[JACK_CLIENT_NAME_SIZE];
00079 char fMasterNetName[256];
00080 char fSlaveNetName[256];
00081 uint32_t fMtu;
00082 uint32_t fID;
00083 uint32_t fTransportSync;
00084 uint32_t fSendAudioChannels;
00085 uint32_t fReturnAudioChannels;
00086 uint32_t fSendMidiChannels;
00087 uint32_t fReturnMidiChannels;
00088 uint32_t fSampleRate;
00089 uint32_t fPeriodSize;
00090 uint32_t fFramesPerPacket;
00091 uint32_t fBitdepth;
00092 uint32_t fSlaveSyncMode;
00093 char fNetworkMode;
00094 };
00095
00096
00097
00102 enum _net_status
00103 {
00104 NET_SOCKET_ERROR = 0,
00105 NET_CONNECT_ERROR,
00106 NET_ERROR,
00107 NET_SEND_ERROR,
00108 NET_RECV_ERROR,
00109 NET_CONNECTED,
00110 NET_ROLLING
00111 };
00112
00113 typedef enum _net_status net_status_t;
00114
00115
00116
00121 enum _sync_packet_type
00122 {
00123 INVALID = 0,
00124 SLAVE_AVAILABLE,
00125 SLAVE_SETUP,
00126 START_MASTER,
00127 START_SLAVE,
00128 KILL_MASTER
00129 };
00130
00131 typedef enum _sync_packet_type sync_packet_type_t;
00132
00133
00134
00135
00155 struct _packet_header
00156 {
00157 char fPacketType[7];
00158 char fDataType;
00159 char fDataStream;
00160 uint32_t fID;
00161 uint32_t fBitdepth;
00162 uint32_t fMidiDataSize;
00163 uint32_t fNMidiPckt;
00164 uint32_t fPacketSize;
00165 uint32_t fCycle;
00166 uint32_t fSubCycle;
00167 uint32_t fIsLastPckt;
00168 char fASyncWrongCycle;
00169 char fFree[26];
00170 };
00171
00172
00173
00178 enum _net_timebase_master
00179 {
00180 NO_CHANGE = 0,
00181 RELEASE_TIMEBASEMASTER = 1,
00182 TIMEBASEMASTER = 2,
00183 CONDITIONAL_TIMEBASEMASTER = 3
00184 };
00185
00186 typedef enum _net_timebase_master net_timebase_master_t;
00187
00188
00189
00190
00195 struct _net_transport_data
00196 {
00197 uint32_t fNewState;
00198 uint32_t fTimebaseMaster;
00199 int32_t fState;
00200 jack_position_t fPosition;
00201 };
00202
00203
00204
00220 class SERVER_EXPORT NetMidiBuffer
00221 {
00222 private:
00223 int fNPorts;
00224 size_t fMaxBufsize;
00225 int fMaxPcktSize;
00226 char* fBuffer;
00227 char* fNetBuffer;
00228 JackMidiBuffer** fPortBuffer;
00229
00230 public:
00231 NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
00232 ~NetMidiBuffer();
00233
00234 void Reset();
00235 size_t GetSize();
00236
00237 void DisplayEvents();
00238
00239 int RenderFromJackPorts();
00240 int RenderToJackPorts();
00241
00242 int RenderFromNetwork ( int subcycle, size_t copy_size );
00243 int RenderToNetwork ( int subcycle, size_t total_size );
00244
00245 void SetBuffer ( int index, JackMidiBuffer* buffer );
00246 JackMidiBuffer* GetBuffer ( int index );
00247 };
00248
00249
00250
00261 class SERVER_EXPORT NetAudioBuffer
00262 {
00263 private:
00264 int fNPorts;
00265 jack_nframes_t fPeriodSize;
00266 jack_nframes_t fSubPeriodSize;
00267 size_t fSubPeriodBytesSize;
00268 char* fNetBuffer;
00269 sample_t** fPortBuffer;
00270 public:
00271 NetAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
00272 ~NetAudioBuffer();
00273
00274 size_t GetSize();
00275
00276 void RenderFromJackPorts ( int subcycle );
00277 void RenderToJackPorts ( int subcycle );
00278
00279 void SetBuffer ( int index, sample_t* buffer );
00280 sample_t* GetBuffer ( int index );
00281 };
00282
00283
00284
00285
00286 SERVER_EXPORT int SocketAPIInit();
00287 SERVER_EXPORT int SocketAPIEnd();
00288
00289 SERVER_EXPORT void SessionParamsHToN ( session_params_t* src_params, session_params_t* dst_params );
00290 SERVER_EXPORT void SessionParamsNToH ( session_params_t* src_params, session_params_t* dst_params );
00291 SERVER_EXPORT void PacketHeaderHToN ( packet_header_t* src_header, packet_header_t* dst_header );
00292 SERVER_EXPORT void PacketHeaderNToH ( packet_header_t* src_header, packet_header_t* dst_header );
00293 SERVER_EXPORT void MidiBufferHToN ( JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer );
00294 SERVER_EXPORT void MidiBufferNToH ( JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer );
00295 SERVER_EXPORT void TransportDataHToN ( net_transport_data_t* src_params, net_transport_data_t* dst_params );
00296 SERVER_EXPORT void TransportDataNToH ( net_transport_data_t* src_params, net_transport_data_t* dst_params );
00297
00298 SERVER_EXPORT void SessionParamsDisplay ( session_params_t* params );
00299
00300 SERVER_EXPORT void PacketHeaderDisplay ( packet_header_t* header );
00301
00302 SERVER_EXPORT sync_packet_type_t GetPacketType ( session_params_t* params );
00303
00304 SERVER_EXPORT int SetPacketType ( session_params_t* params, sync_packet_type_t packet_type );
00305
00306 SERVER_EXPORT const char* GetTransportState ( int transport_state );
00307 SERVER_EXPORT void NetTransportDataDisplay ( net_transport_data_t* data );
00308 }