JackNetTool.h 5.45 KB
Newer Older
sletz's avatar
sletz committed
1
2
3
4

#include "types.h"
#include "JackConstants.h"
#include "JackMidiPort.h"
sletz's avatar
sletz committed
5
#include "JackExports.h"
sletz's avatar
sletz committed
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

#include <string>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <cstdio>
#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <errno.h>

namespace Jack
{
	typedef struct _session_params session_params_t;
	typedef struct _packet_header packet_header_t;
	typedef struct _midi_portbuf_desc midi_portbuf_desc_t;
	typedef struct sockaddr socket_address_t;
	typedef struct in_addr address_t;
	typedef jack_default_audio_sample_t sample_t;


//session params ******************************************************************************

	struct _session_params
	{
		char fPacketType[7];			//packet type ('param')
		char fProtocolVersion;			//version
moret's avatar
cleanup    
moret committed
37
		uint32_t fPacketID;			//indicates the packet type
sletz's avatar
sletz committed
38
39
		char fMasterNetName[256];		//master hostname (network)
		char fSlaveNetName[256];		//slave hostname (network)
moret's avatar
moret committed
40
41
		uint32_t fMtu;				//connection mtu
		uint32_t fID;				//slave's ID
moret's avatar
cleanup    
moret committed
42
43
44
45
		uint32_t fSendAudioChannels;		//number of master->slave channels
		uint32_t fReturnAudioChannels;		//number of slave->master channels
		uint32_t fSendMidiChannels;		//number of master->slave midi channels
		uint32_t fReturnMidiChannels;		//number of slave->master midi channels
moret's avatar
moret committed
46
47
48
49
		uint32_t fSampleRate;			//session sample rate
		uint32_t fPeriodSize;			//period size
		uint32_t fFramesPerPacket;		//complete frames per packet
		uint32_t fBitdepth;			//samples bitdepth (unused)
sletz's avatar
sletz committed
50
51
52
53
54
55
56
57
58
59
		char fName[JACK_CLIENT_NAME_SIZE];	//slave's name
	};


//net status **********************************************************************************

	enum  _net_status
	{
		SOCKET_ERROR,
		CONNECT_ERROR,
moret's avatar
moret committed
60
61
		NET_ERROR,
		SEND_ERROR,
sletz's avatar
sletz committed
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
		RECV_ERROR,
		CONNECTED,
		ROLLING
	};

	typedef enum _net_status net_status_t;


//sync packet type ****************************************************************************

	enum _sync_packet_type
	{
		INVALID,		//...
		SLAVE_AVAILABLE,	//a slave is available
		SLAVE_SETUP,		//slave configuration
		START_MASTER,		//slave is ready, start master
		START_SLAVE,		//master is ready, activate slave
		KILL_MASTER		//master must stop
	};

	typedef enum _sync_packet_type sync_packet_type_t;


//packet header *******************************************************************************

	struct _packet_header
	{
		char fPacketType[7];		//packet type ( 'headr' )
		char fDataType;			//a for audio, m for midi
		char fDataStream;		//s for send, r for return
moret's avatar
moret committed
92
93
94
95
96
97
		uint32_t fID;			//to identify the slave
		uint32_t fBitdepth;		//bitdepth of the data samples
		uint32_t fMidiDataSize;		//size of midi data (if packet is 'midi typed') in bytes
		uint32_t fNMidiPckt;		//number of midi packets of the cycle
		uint32_t fCycle;		//process cycle counter
		uint32_t fSubCycle;		//midi/audio subcycle counter
sletz's avatar
sletz committed
98
99
100
101
102
103
		char fIsLastPckt;		//is it the last packet of a given cycle ('y' or 'n')
		char fFree[13];             	//unused
	};

//midi data ***********************************************************************************

sletz's avatar
sletz committed
104
	class EXPORT NetMidiBuffer
sletz's avatar
sletz committed
105
106
107
	{
		private:
			int fNPorts;
moret's avatar
moret committed
108
			size_t fMaxBufsize;
sletz's avatar
sletz committed
109
110
111
112
113
			int fMaxPcktSize;
			//data
			char* fBuffer;
			char* fNetBuffer;
		public:
114
			NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
sletz's avatar
sletz committed
115
116
117
118
119
			~NetMidiBuffer();

			JackMidiBuffer** fPortBuffer;

			void Reset();
moret's avatar
moret committed
120
			size_t GetSize();
sletz's avatar
sletz committed
121
122
123
124
125
126
			//utility
			void DisplayEvents();
			//jack<->buffer
			int RenderFromJackPorts();
			int RenderToJackPorts();
			//network<->buffer
moret's avatar
cleanup    
moret committed
127
128
			int RenderFromNetwork ( int subcycle, size_t copy_size );
			int RenderToNetwork ( int subcycle, size_t total_size );
sletz's avatar
sletz committed
129
130
131
132
	};

// audio data *********************************************************************************

sletz's avatar
sletz committed
133
	class EXPORT NetAudioBuffer
sletz's avatar
sletz committed
134
135
136
137
138
	{
		private:
			int fNPorts;
			jack_nframes_t fPeriodSize;
			jack_nframes_t fSubPeriodSize;
moret's avatar
moret committed
139
			size_t fSubPeriodBytesSize;
sletz's avatar
sletz committed
140
141
			char* fNetBuffer;
		public:
142
			NetAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
sletz's avatar
sletz committed
143
144
145
146
			~NetAudioBuffer();

			sample_t** fPortBuffer;	

moret's avatar
moret committed
147
			size_t GetSize();
sletz's avatar
sletz committed
148
			//jack<->buffer
moret's avatar
cleanup    
moret committed
149
150
			void RenderFromJackPorts ( int subcycle );
			void RenderToJackPorts ( int subcycle );
sletz's avatar
sletz committed
151
152
153
154
155
	};

//utility *************************************************************************************

	//n<-->h functions
sletz's avatar
sletz committed
156
157
158
159
	EXPORT void SessionParamsHToN ( session_params_t* params );
	EXPORT void SessionParamsNToH ( session_params_t* params );
	EXPORT void PacketHeaderHToN ( packet_header_t* header );
	EXPORT void PacketHeaderNToH ( packet_header_t* header );
sletz's avatar
sletz committed
160
	//display session parameters
sletz's avatar
sletz committed
161
	EXPORT void SessionParamsDisplay ( session_params_t* params );
sletz's avatar
sletz committed
162
	//display packet header
sletz's avatar
sletz committed
163
	EXPORT void PacketHeaderDisplay ( packet_header_t* header );
sletz's avatar
sletz committed
164
	//get the packet type from a sesion parameters
sletz's avatar
sletz committed
165
	EXPORT sync_packet_type_t GetPacketType ( session_params_t* params );
sletz's avatar
sletz committed
166
	//set the packet type in a session parameters
sletz's avatar
sletz committed
167
	EXPORT int SetPacketType ( session_params_t* params, sync_packet_type_t packet_type );
sletz's avatar
sletz committed
168
	//step of network initialization
moret's avatar
cleanup    
moret committed
169
	EXPORT jack_nframes_t SetFramesPerPacket ( session_params_t* params );
sletz's avatar
sletz committed
170
	//get the midi packet number for a given cycle
moret's avatar
cleanup    
moret committed
171
	EXPORT int GetNMidiPckt ( session_params_t* params, size_t data_size );
sletz's avatar
sletz committed
172
	//set the recv timeout on a socket
sletz's avatar
sletz committed
173
	EXPORT int SetRxTimeout ( int* sockfd, session_params_t* params );
sletz's avatar
sletz committed
174
	//check if 'next' packet is really the next after 'previous'
175
	EXPORT bool IsNextPacket ( packet_header_t* previous, packet_header_t* next, uint subcycles );
sletz's avatar
sletz committed
176
}