00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "JackConstants.h"
00021 #include "JackMidiPort.h"
00022 #include "JackTools.h"
00023 #include "JackPlatformPlug.h"
00024 #include "types.h"
00025 #include "transport.h"
00026 #ifndef WIN32
00027 #include <netinet/in.h>
00028 #endif
00029 #include <cmath>
00030
00031 using namespace std;
00032
00033 namespace Jack
00034 {
00035 typedef struct _session_params session_params_t;
00036 typedef struct _packet_header packet_header_t;
00037 typedef struct _net_transport_data net_transport_data_t;
00038 typedef struct sockaddr socket_address_t;
00039 typedef struct in_addr address_t;
00040 typedef jack_default_audio_sample_t sample_t;
00041
00042
00043
00061 #define MASTER_PROTOCOL 1
00062 #define SLAVE_PROTOCOL 1
00063
00064 struct _session_params
00065 {
00066 char fPacketType[7];
00067 char fProtocolVersion;
00068 uint32_t fPacketID;
00069 char fName[JACK_CLIENT_NAME_SIZE];
00070 char fMasterNetName[256];
00071 char fSlaveNetName[256];
00072 uint32_t fMtu;
00073 uint32_t fID;
00074 uint32_t fTransportSync;
00075 uint32_t fSendAudioChannels;
00076 uint32_t fReturnAudioChannels;
00077 uint32_t fSendMidiChannels;
00078 uint32_t fReturnMidiChannels;
00079 uint32_t fSampleRate;
00080 uint32_t fPeriodSize;
00081 uint32_t fFramesPerPacket;
00082 uint32_t fBitdepth;
00083 uint32_t fSlaveSyncMode;
00084 char fNetworkMode;
00085 };
00086
00087
00088
00093 enum _net_status
00094 {
00095 NET_SOCKET_ERROR = 0,
00096 NET_CONNECT_ERROR,
00097 NET_ERROR,
00098 NET_SEND_ERROR,
00099 NET_RECV_ERROR,
00100 NET_CONNECTED,
00101 NET_ROLLING
00102 };
00103
00104 typedef enum _net_status net_status_t;
00105
00106
00107
00112 enum _sync_packet_type
00113 {
00114 INVALID = 0,
00115 SLAVE_AVAILABLE,
00116 SLAVE_SETUP,
00117 START_MASTER,
00118 START_SLAVE,
00119 KILL_MASTER
00120 };
00121
00122 typedef enum _sync_packet_type sync_packet_type_t;
00123
00124
00125
00126
00146 struct _packet_header
00147 {
00148 char fPacketType[7];
00149 char fDataType;
00150 char fDataStream;
00151 uint32_t fID;
00152 uint32_t fBitdepth;
00153 uint32_t fMidiDataSize;
00154 uint32_t fNMidiPckt;
00155 uint32_t fPacketSize;
00156 uint32_t fCycle;
00157 uint32_t fSubCycle;
00158 uint32_t fIsLastPckt;
00159 char fASyncWrongCycle;
00160 char fFree[26];
00161 };
00162
00163
00164
00169 enum _net_timebase_master
00170 {
00171 NO_CHANGE = 0,
00172 RELEASE_TIMEBASEMASTER = 1,
00173 TIMEBASEMASTER = 2,
00174 CONDITIONAL_TIMEBASEMASTER = 3
00175 };
00176
00177 typedef enum _net_timebase_master net_timebase_master_t;
00178
00179
00180
00181
00186 struct _net_transport_data
00187 {
00188 uint32_t fNewState;
00189 uint32_t fTimebaseMaster;
00190 int32_t fState;
00191 jack_position_t fPosition;
00192 };
00193
00194
00195
00211 class SERVER_EXPORT NetMidiBuffer
00212 {
00213 private:
00214 int fNPorts;
00215 size_t fMaxBufsize;
00216 int fMaxPcktSize;
00217 char* fBuffer;
00218 char* fNetBuffer;
00219 JackMidiBuffer** fPortBuffer;
00220
00221 public:
00222 NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
00223 ~NetMidiBuffer();
00224
00225 void Reset();
00226 size_t GetSize();
00227
00228 void DisplayEvents();
00229
00230 int RenderFromJackPorts();
00231 int RenderToJackPorts();
00232
00233 int RenderFromNetwork ( int subcycle, size_t copy_size );
00234 int RenderToNetwork ( int subcycle, size_t total_size );
00235
00236 void SetBuffer ( int index, JackMidiBuffer* buffer );
00237 JackMidiBuffer* GetBuffer ( int index );
00238 };
00239
00240
00241
00252 class SERVER_EXPORT NetAudioBuffer
00253 {
00254 private:
00255 int fNPorts;
00256 jack_nframes_t fPeriodSize;
00257 jack_nframes_t fSubPeriodSize;
00258 size_t fSubPeriodBytesSize;
00259 char* fNetBuffer;
00260 sample_t** fPortBuffer;
00261 public:
00262 NetAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
00263 ~NetAudioBuffer();
00264
00265 size_t GetSize();
00266
00267 void RenderFromJackPorts ( int subcycle );
00268 void RenderToJackPorts ( int subcycle );
00269
00270 void SetBuffer ( int index, sample_t* buffer );
00271 sample_t* GetBuffer ( int index );
00272 };
00273
00274
00275
00276
00277 SERVER_EXPORT int SocketAPIInit();
00278 SERVER_EXPORT int SocketAPIEnd();
00279
00280 SERVER_EXPORT void SessionParamsHToN ( session_params_t* src_params, session_params_t* dst_params );
00281 SERVER_EXPORT void SessionParamsNToH ( session_params_t* src_params, session_params_t* dst_params );
00282 SERVER_EXPORT void PacketHeaderHToN ( packet_header_t* src_header, packet_header_t* dst_header );
00283 SERVER_EXPORT void PacketHeaderNToH ( packet_header_t* src_header, packet_header_t* dst_header );
00284 SERVER_EXPORT void MidiBufferHToN ( JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer );
00285 SERVER_EXPORT void MidiBufferNToH ( JackMidiBuffer* src_buffer, JackMidiBuffer* dst_buffer );
00286
00287 SERVER_EXPORT void SessionParamsDisplay ( session_params_t* params );
00288
00289 SERVER_EXPORT void PacketHeaderDisplay ( packet_header_t* header );
00290
00291 SERVER_EXPORT sync_packet_type_t GetPacketType ( session_params_t* params );
00292
00293 SERVER_EXPORT int SetPacketType ( session_params_t* params, sync_packet_type_t packet_type );
00294
00295 SERVER_EXPORT const char* GetTransportState ( int transport_state );
00296 }