JackNetTool.h 6.71 KB
Newer Older
1
/*
sletz's avatar
sletz committed
2
Copyright (C) 2008 Romain Moret at Grame
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

This program 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 2 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, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/
sletz's avatar
sletz committed
19
20
21

#include "JackConstants.h"
#include "JackMidiPort.h"
sletz's avatar
sletz committed
22
#include "JackExports.h"
23
#include "JackError.h"
24
#include "JackTools.h"
sletz's avatar
sletz committed
25
#include "JackPlatformNetSocket.h"
sletz's avatar
sletz committed
26
27
28
29
30
31
32

#include <string>
#include <algorithm>
#include <cmath>

namespace Jack
{
33
34
35
36
37
    typedef struct _session_params session_params_t;
    typedef struct _packet_header packet_header_t;
    typedef struct sockaddr socket_address_t;
    typedef struct in_addr address_t;
    typedef jack_default_audio_sample_t sample_t;
sletz's avatar
sletz committed
38
39
40

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

41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
    struct _session_params
    {
        char fPacketType[7];			//packet type ('param')
        char fProtocolVersion;			//version
        uint32_t fPacketID;			//indicates the packet type
        char fMasterNetName[256];		//master hostname (network)
        char fSlaveNetName[256];		//slave hostname (network)
        uint32_t fMtu;				//connection mtu
        uint32_t fID;				//slave's ID
        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
        uint32_t fSampleRate;			//session sample rate
        uint32_t fPeriodSize;			//period size
        uint32_t fFramesPerPacket;		//complete frames per packet
        uint32_t fBitdepth;			//samples bitdepth (unused)
        char fName[JACK_CLIENT_NAME_SIZE];	//slave's name
    };
sletz's avatar
sletz committed
60
61
62
63


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

64
65
66
67
68
69
70
71
72
73
    enum  _net_status
    {
        NET_SOCKET_ERROR = 0,
        NET_CONNECT_ERROR,
        NET_ERROR,
        NET_SEND_ERROR,
        NET_RECV_ERROR,
        NET_CONNECTED,
        NET_ROLLING
    };
sletz's avatar
sletz committed
74

75
    typedef enum _net_status net_status_t;
sletz's avatar
sletz committed
76
77
78

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

79
80
81
82
83
84
85
86
87
    enum _sync_packet_type
    {
        INVALID = 0,	    //...
        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
    };
sletz's avatar
sletz committed
88

89
    typedef enum _sync_packet_type sync_packet_type_t;
sletz's avatar
sletz committed
90
91
92
93


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

94
95
96
97
98
99
100
101
102
103
104
105
106
107
    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
        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
        char fIsLastPckt;		//is it the last packet of a given cycle ('y' or 'n')
        char fFree[13];             	//unused
    };
sletz's avatar
sletz committed
108
109
110

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

111
112
113
114
115
116
117
118
119
    class EXPORT NetMidiBuffer
    {
    private:
        int fNPorts;
        size_t fMaxBufsize;
        int fMaxPcktSize;
        //data
        char* fBuffer;
        char* fNetBuffer;
sletz's avatar
Cleanup    
sletz committed
120
        JackMidiBuffer** fPortBuffer;
121

122
123
124
125
126
127
128
129
130
131
132
133
134
135
    public:
        NetMidiBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
        ~NetMidiBuffer();

        void Reset();
        size_t GetSize();
        //utility
        void DisplayEvents();
        //jack<->buffer
        int RenderFromJackPorts();
        int RenderToJackPorts();
        //network<->buffer
        int RenderFromNetwork ( int subcycle, size_t copy_size );
        int RenderToNetwork ( int subcycle, size_t total_size );
136

sletz's avatar
Cleanup    
sletz committed
137
         void SetBuffer(int index, JackMidiBuffer* buffer);
138
    };
sletz's avatar
sletz committed
139
140
141

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

142
143
144
145
146
147
148
149
    class EXPORT NetAudioBuffer
    {
    private:
        int fNPorts;
        jack_nframes_t fPeriodSize;
        jack_nframes_t fSubPeriodSize;
        size_t fSubPeriodBytesSize;
        char* fNetBuffer;
sletz's avatar
Cleanup    
sletz committed
150
        sample_t** fPortBuffer;
151
152
153
154
155
156
157
158
    public:
        NetAudioBuffer ( session_params_t* params, uint32_t nports, char* net_buffer );
        ~NetAudioBuffer();

        size_t GetSize();
        //jack<->buffer
        void RenderFromJackPorts ( int subcycle );
        void RenderToJackPorts ( int subcycle );
159

sletz's avatar
Cleanup    
sletz committed
160
        void SetBuffer(int index, sample_t* buffer);
161
    };
sletz's avatar
sletz committed
162
163

//utility *************************************************************************************
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188

    //socket API management
    EXPORT int SocketAPIInit();
    EXPORT int SocketAPIEnd();
    //n<-->h functions
    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 );
    //display session parameters
    EXPORT void SessionParamsDisplay ( session_params_t* params );
    //display packet header
    EXPORT void PacketHeaderDisplay ( packet_header_t* header );
    //get the packet type from a sesion parameters
    EXPORT sync_packet_type_t GetPacketType ( session_params_t* params );
    //set the packet type in a session parameters
    EXPORT int SetPacketType ( session_params_t* params, sync_packet_type_t packet_type );
    //step of network initialization
    EXPORT jack_nframes_t SetFramesPerPacket ( session_params_t* params );
    //get the midi packet number for a given cycle
    EXPORT int GetNMidiPckt ( session_params_t* params, size_t data_size );
    //set the recv timeout on a socket
    EXPORT int SetRxTimeout ( JackNetSocket* socket, session_params_t* params );
    //check if 'next' packet is really the next after 'previous'
    EXPORT bool IsNextPacket ( packet_header_t* previous, packet_header_t* next, uint subcycles );
sletz's avatar
sletz committed
189
}