JackDebugClient.cpp 17.5 KB
Newer Older
sletz's avatar
sletz committed
1
2
3
4
5
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
Copyright (C) 2004-2006 Grame

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.

*/

#include "JackDebugClient.h"
#include "JackError.h"
#include <iostream>
#include <iomanip>
#include <sstream>
#include <fstream>
#include <string>
#include <time.h>

using namespace std;

namespace Jack
{

JackDebugClient::JackDebugClient(JackClient * client)
{
    fTotalPortNumber = 1;	// The total number of port opened and maybe closed. Historical view.
    fOpenPortNumber = 0;	// The current number of opened port.
    fIsActivated = 0;
    fIsDeactivated = 0;
    fIsClosed = 0;
    fClient = client;
}

JackDebugClient::~JackDebugClient()
{
    fTotalPortNumber--; // fTotalPortNumber start at 1
    *fStream << endl << endl << "----------------------------------- JackDebugClient summary ------------------------------- " << endl << endl;
    *fStream << "Client flags ( 1:yes / 0:no ) :" << endl;
    *fStream << setw(5) << "- Client call activated : " << fIsActivated << endl;
    *fStream << setw(5) << "- Client call deactivated : " << fIsDeactivated << endl;
    *fStream << setw(5) << "- Client call closed : " << fIsClosed << endl;
    *fStream << setw(5) << "- Total number of instantiated port : " << fTotalPortNumber << endl;
    *fStream << setw(5) << "- Number of port remaining open when exiting client : " << fOpenPortNumber << endl;
    if (fOpenPortNumber != 0)
        *fStream << "!!! WARNING !!! Some ports have not been unregistrated ! Incorrect exiting !" << endl;
    if (fIsDeactivated != fIsActivated)
        *fStream << "!!! ERROR !!! Client seem do not perform symetric activation-deactivation ! (not the same number of activate and deactivate)" << endl;
    if (fIsClosed == 0)
        *fStream << "!!! ERROR !!! Client have not been closed with jack_client_close() !" << endl;

    *fStream << endl << endl << "---------------------------- JackDebugClient detailed port summary ------------------------ " << endl << endl;
    //for (int i = 0; i < fTotalPortNumber ; i++) {
    for (int i = 1; i <= fTotalPortNumber ; i++) {
        *fStream << endl << "Port index (internal debug test value) : " << i << endl;
        *fStream << setw(5) << "- Name : " << fPortList[i].name << endl;
        *fStream << setw(5) << "- idport : " << fPortList[i].idport << endl;
        *fStream << setw(5) << "- IsConnected : " << fPortList[i].IsConnected << endl;
        *fStream << setw(5) << "- IsUnregistrated : " << fPortList[i].IsUnregistrated << endl;
        if (fPortList[i].IsUnregistrated == 0)
            *fStream << "!!! WARNING !!! Port have not been unregistrated ! Incorrect exiting !" << endl;
    }
    *fStream << "delete object JackDebugClient : end of tracing" << endl;
    delete fStream;
    delete fClient;
}

77
int JackDebugClient::Open(const char* server_name, const char* name, jack_options_t options, jack_status_t* status)
sletz's avatar
sletz committed
78
{
79
    int res = fClient->Open(server_name, name, options, status);
sletz's avatar
sletz committed
80
81
82
83
84
85
86
87
88
89
90
91
    char provstr[256];
    char buffer[256];
    time_t curtime;
    struct tm *loctime;
    /* Get the current time. */
    curtime = time (NULL);
    /* Convert it to local time representation. */
    loctime = localtime (&curtime);
    strftime (buffer, 256, "%I-%M", loctime);
    sprintf(provstr, "JackClientDebug-%s-%s.log", name, buffer);
    fStream = new ofstream(provstr, ios_base::ate);
    if (fStream->is_open()) {
92
93
        if (res == -1) {
            *fStream << "Trying to open client with name '" << name << "' with bad result (client not opened)." << res << endl;
sletz's avatar
sletz committed
94
        } else {
95
            *fStream << "Open client with name '" << name << "'." << endl;
sletz's avatar
sletz committed
96
97
98
99
100
        }
    } else {
        JackLog("JackDebugClient::Open : cannot open log file\n");
    }
    strcpy(fClientName, name);
101
    return res;
sletz's avatar
sletz committed
102
103
104
105
106
}

int JackDebugClient::Close()
{
    fIsClosed++;
107
    *fStream << "Client '" << fClientName << "' was closed" << endl;
sletz's avatar
sletz committed
108
109
110
    return fClient->Close();
}

111
112
113
114
115
116
117
118
void JackDebugClient::CheckClient() const
{
    if (fIsClosed > 0)  {
		*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed !" << endl;
		*fStream << "This is likely to cause crash !'" << endl;
	}
}

sletz's avatar
sletz committed
119
120
pthread_t JackDebugClient::GetThreadID()
{
121
	CheckClient();
sletz's avatar
sletz committed
122
123
124
125
126
    return fClient->GetThreadID();
}

JackGraphManager* JackDebugClient::GetGraphManager() const
{
127
	CheckClient();
sletz's avatar
sletz committed
128
129
130
131
    return fClient->GetGraphManager();
}
JackEngineControl* JackDebugClient::GetEngineControl() const
{
132
	CheckClient();
sletz's avatar
sletz committed
133
134
135
136
137
138
139
140
    return fClient->GetEngineControl();
}
/*!
\brief Notification received from the server.
*/

int JackDebugClient::ClientNotify(int refnum, const char* name, int notify, int sync, int value)
{
141
	CheckClient();
sletz's avatar
sletz committed
142
143
144
145
146
    return fClient->ClientNotify( refnum, name, notify, sync, value);
}

int JackDebugClient::Activate()
{
147
	CheckClient();
sletz's avatar
Cleanup    
sletz committed
148
    int res = fClient->Activate();
sletz's avatar
sletz committed
149
150
151
152
    fIsActivated++;
    if (fIsDeactivated)
        *fStream << "Client '" << fClientName << "' call activate a new time (it already call 'activate' previously)." << endl;
    *fStream << "Client '" << fClientName << "' Activated" << endl;
153
154
155
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to activate but server return " << res << " ." << endl;
    return res;
sletz's avatar
sletz committed
156
157
158
159
}

int JackDebugClient::Deactivate()
{
160
	CheckClient();
sletz's avatar
Cleanup    
sletz committed
161
    int res = fClient->Deactivate();
sletz's avatar
sletz committed
162
163
164
165
    fIsDeactivated++;
    if (fIsActivated == 0)
        *fStream << "Client '" << fClientName << "' deactivate while it hasn't been previoulsy activated !" << endl;
    *fStream << "Client '" << fClientName << "' Deactivated" << endl;
166
167
168
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to deactivate but server return " << res << " ." << endl;
    return res;
sletz's avatar
sletz committed
169
170
171
172
173
174
175
176
}

//-----------------
// Port management
//-----------------

int JackDebugClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size)
{
177
	CheckClient();
sletz's avatar
Cleanup    
sletz committed
178
    int res = fClient->PortRegister(port_name, port_type, flags, buffer_size);
179
180
    if (res <= 0) {
        *fStream << "Client '" << fClientName << "' try port register ('" << port_name << "') and server return error  " << res << " ." << endl;
sletz's avatar
sletz committed
181
182
    } else {
        if (fTotalPortNumber < MAX_PORT_HISTORY) {
183
            fPortList[fTotalPortNumber].idport = res;
sletz's avatar
sletz committed
184
185
186
187
188
189
190
191
            strcpy(fPortList[fTotalPortNumber].name, port_name);
            fPortList[fTotalPortNumber].IsConnected = 0;
            fPortList[fTotalPortNumber].IsUnregistrated = 0;
        } else {
            *fStream << "!!! WARNING !!! History is full : no more port history will be recorded." << endl;
        }
        fTotalPortNumber++;
        fOpenPortNumber++;
192
        *fStream << "Client '" << fClientName << "' port register with portname '" << port_name << " port " << res << "' ." << endl;
sletz's avatar
sletz committed
193
    }
194
    return res;
sletz's avatar
sletz committed
195
196
197
198
}

int JackDebugClient::PortUnRegister(jack_port_id_t port_index)
{
199
	CheckClient();
sletz's avatar
Cleanup    
sletz committed
200
    int res = fClient->PortUnRegister(port_index);
sletz's avatar
sletz committed
201
202
203
204
205
206
207
208
209
210
211
212
    fOpenPortNumber--;
    int i;
    for (i = (fTotalPortNumber - 1); i >= 0; i--) {	// We search the record into the history
        if (fPortList[i].idport == port_index) {		// We found the last record
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : '" << fClientName << "' id deregistering port '" << fPortList[i].name << "' that have already been unregistered !" << endl;
            fPortList[i].IsUnregistrated++;
            break;
        }
    }
    if (i == 0) // Port is not found
        *fStream << "JackClientDebug : PortUnregister : port " << port_index << " was not previously registered !" << endl;
213
214
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to do PortUnregister and server return " << res << " )." << endl;
sletz's avatar
sletz committed
215
    *fStream << "Client '" << fClientName << "' unregister port '" << port_index << "'." << endl;
216
    return res;
sletz's avatar
sletz committed
217
218
219
220
}

int JackDebugClient::PortConnect(const char* src, const char* dst)
{
221
222
	CheckClient();
    if (!fIsActivated)
sletz's avatar
sletz committed
223
224
        *fStream << "!!! ERROR !!! Trying to connect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl;
    int i;
sletz's avatar
Cleanup    
sletz committed
225
    int res = fClient->PortConnect( src, dst);
sletz's avatar
sletz committed
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
    for (i = (fTotalPortNumber - 1); i >= 0; i--) {	// We search the record into the history
        if (strcmp(fPortList[i].name, src) == 0) {	// We found the last record in sources
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! Connecting port " << src << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected++;
            *fStream << "Connecting port " << src << " to " << dst << ". ";
            break;
        } else if (strcmp(fPortList[i].name, dst) == 0 ) { // We found the record in dest
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! Connecting port  " << dst << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected++;
            *fStream << "Connecting port " << src << " to " << dst << ". ";
            break;
        }
    }
    if (i == 0) // Port is not found
        *fStream << "JackClientDebug : PortConnect : port was not found in debug database !" << endl;
243
244
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to do PortConnect but server return " << res << " ." << endl;
sletz's avatar
sletz committed
245
    //*fStream << "Client Port Connect done with names" << endl;
246
    return res;
sletz's avatar
sletz committed
247
248
249
250
}

int JackDebugClient::PortDisconnect(const char* src, const char* dst)
{
251
252
	CheckClient();
    if (!fIsActivated)
sletz's avatar
sletz committed
253
        *fStream << "!!! ERROR !!! Trying to disconnect a port ( " << src << " to " << dst << ") while the client has not been activated !" << endl;
sletz's avatar
Cleanup    
sletz committed
254
    int res = fClient->PortDisconnect( src, dst);
sletz's avatar
sletz committed
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
    int i;
    for (i = (fTotalPortNumber - 1); i >= 0; i--) { // We search the record into the history
        if (strcmp(fPortList[i].name, src) == 0) { // We found the record in sources
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : Disconnecting port " << src << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected--;
            *fStream << "disconnecting port " << src << ". ";
            break;
        } else if (strcmp(fPortList[i].name, dst) == 0 ) { // We found the record in dest
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : Disonnecting port  " << dst << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected--;
            *fStream << "disconnecting port " << dst << ". ";
            break;
        }
    }
    if (i == 0) // Port is not found
        *fStream << "JackClientDebug : PortDisConnect : port was not found in debug database !" << endl;
273
274
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << res << " ." << endl;
sletz's avatar
sletz committed
275
    //*fStream << "Client Port Disconnect done." << endl;
276
    return res;
sletz's avatar
sletz committed
277
278
279
}

int JackDebugClient::PortConnect(jack_port_id_t src, jack_port_id_t dst)
280
281
282
{	
	CheckClient();
    if (!fIsActivated)
sletz's avatar
sletz committed
283
        *fStream << "!!! ERROR !!! : Trying to connect port  " << src << " to  " << dst << " while the client has not been activated !" << endl;
sletz's avatar
Cleanup    
sletz committed
284
    int res = fClient->PortConnect(src, dst);
sletz's avatar
sletz committed
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
    int i;
    for (i = (fTotalPortNumber - 1); i >= 0; i--) {	// We search the record into the history
        if (fPortList[i].idport == src) {		// We found the record in sources
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : Connecting port  " << src << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected++;
            *fStream << "Connecting port " << src << ". ";
            break;
        } else if (fPortList[i].idport == dst) { // We found the record in dest
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : Connecting port  " << dst << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected++;
            *fStream << "Connecting port " << dst << ". ";
            break;
        }
    }
    if (i == 0) // Port is not found
        *fStream << "JackClientDebug : PortConnect : port was not found in debug database !" << endl;
303
304
    if (res == -1)
        *fStream << "Client '" << fClientName << "' try to do Portconnect but server return " << res << " ." << endl;
sletz's avatar
sletz committed
305
    //*fStream << "Client Port Connect with ID done." << endl;
306
    return res;
sletz's avatar
sletz committed
307
308
309
310
}

int JackDebugClient::PortDisconnect(jack_port_id_t src)
{
311
312
	CheckClient();
    if (!fIsActivated)
sletz's avatar
sletz committed
313
        *fStream << "!!! ERROR !!! : Trying to disconnect port  " << src << " while that client has not been activated !" << endl;
sletz's avatar
Cleanup    
sletz committed
314
    int res = fClient->PortDisconnect(src);
sletz's avatar
sletz committed
315
316
317
318
319
320
321
322
323
324
325
326
    int i;
    for (i = (fTotalPortNumber - 1); i >= 0; i--) {		// We search the record into the history
        if (fPortList[i].idport == src) {				// We found the record in sources
            if (fPortList[i].IsUnregistrated != 0)
                *fStream << "!!! ERROR !!! : Disconnecting port  " << src << " previoulsy unregistered !" << endl;
            fPortList[i].IsConnected--;
            *fStream << "Disconnecting port " << src << ". " << endl;
            break;
        }
    }
    if (i == 0) // Port is not found
        *fStream << "JackClientDebug : PortDisconnect : port was not found in debug database !" << endl;
327
328
    if (res != 0)
        *fStream << "Client '" << fClientName << "' try to do PortDisconnect but server return " << res << " ." << endl;
sletz's avatar
sletz committed
329
    //*fStream << "Client Port Disconnect with ID done." << endl;
330
    return res;
sletz's avatar
sletz committed
331
332
333
334
}

int JackDebugClient::PortIsMine(jack_port_id_t port_index)
{
335
	CheckClient();
sletz's avatar
sletz committed
336
337
338
339
340
341
342
    return fClient->PortIsMine(port_index);
}

//--------------------
// Context management
//--------------------

343
int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size)
sletz's avatar
sletz committed
344
{
345
	CheckClient();
346
    return fClient->SetBufferSize(buffer_size);
sletz's avatar
sletz committed
347
348
349
350
}

int JackDebugClient::SetFreeWheel(int onoff)
{
351
	CheckClient();
sletz's avatar
sletz committed
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
    return fClient->SetFreeWheel(onoff);
}

/*
ShutDown is called:
- from the RT thread when Execute method fails
- possibly from a "closed" notification channel
(Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown))
*/

void JackDebugClient::ShutDown()
{
    fClient->ShutDown();
}

//---------------------
// Transport management
//---------------------

int JackDebugClient::ReleaseTimebase()
{
373
	CheckClient();
sletz's avatar
sletz committed
374
375
376
377
378
    return fClient->ReleaseTimebase();
}

int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback, void* arg)
{
379
	CheckClient();
sletz's avatar
sletz committed
380
381
382
383
384
    return fClient->SetSyncCallback(sync_callback, arg);
}

int JackDebugClient::SetSyncTimeout(jack_time_t timeout)
{
385
	CheckClient();
sletz's avatar
sletz committed
386
387
388
389
390
    return fClient->SetSyncTimeout(timeout);
}

int JackDebugClient::SetTimebaseCallback(int conditional, JackTimebaseCallback timebase_callback, void* arg)
{
391
	CheckClient();
sletz's avatar
sletz committed
392
393
394
395
396
    return fClient->SetTimebaseCallback( conditional, timebase_callback, arg);
}

int JackDebugClient::TransportLocate(jack_nframes_t frame)
{
397
	CheckClient();
sletz's avatar
sletz committed
398
399
400
401
402
    return fClient->TransportLocate(frame);
}

jack_transport_state_t JackDebugClient::TransportQuery(jack_position_t* pos)
{
403
	CheckClient();
sletz's avatar
sletz committed
404
405
406
407
408
    return fClient->TransportQuery(pos);
}

jack_nframes_t JackDebugClient::GetCurrentTransportFrame()
{
409
	CheckClient();
sletz's avatar
sletz committed
410
411
412
413
414
    return fClient->GetCurrentTransportFrame();
}

int JackDebugClient::TransportReposition(jack_position_t* pos)
{
415
	CheckClient();
sletz's avatar
sletz committed
416
417
418
419
420
    return fClient->TransportReposition(pos);
}

void JackDebugClient::TransportStart()
{
421
	CheckClient();
sletz's avatar
sletz committed
422
423
424
425
426
    fClient->TransportStart();
}

void JackDebugClient::TransportStop()
{
427
	CheckClient();
sletz's avatar
sletz committed
428
429
430
431
432
433
434
435
436
    fClient->TransportStop();
}

//---------------------
// Callback management
//---------------------

void JackDebugClient::OnShutdown(JackShutdownCallback callback, void *arg)
{
437
	CheckClient();
sletz's avatar
sletz committed
438
439
440
441
442
    fClient->OnShutdown(callback, arg);
}

int JackDebugClient::SetProcessCallback(JackProcessCallback callback, void *arg)
{
443
	CheckClient();
444
    return fClient->SetProcessCallback(callback, arg);
sletz's avatar
sletz committed
445
446
447
448
}

int JackDebugClient::SetXRunCallback(JackXRunCallback callback, void *arg)
{
449
	CheckClient();
sletz's avatar
sletz committed
450
451
452
453
454
    return fClient->SetXRunCallback(callback, arg);
}

int JackDebugClient::SetInitCallback(JackThreadInitCallback callback, void *arg)
{
455
	CheckClient();
sletz's avatar
sletz committed
456
457
458
459
460
    return fClient->SetInitCallback(callback, arg);
}

int JackDebugClient::SetGraphOrderCallback(JackGraphOrderCallback callback, void *arg)
{
461
	CheckClient();
sletz's avatar
sletz committed
462
463
464
465
466
    return fClient->SetGraphOrderCallback(callback, arg);
}

int JackDebugClient::SetBufferSizeCallback(JackBufferSizeCallback callback, void *arg)
{
467
	CheckClient();
sletz's avatar
sletz committed
468
469
470
    return fClient->SetBufferSizeCallback(callback, arg);
}

sletz's avatar
Cleanup    
sletz committed
471
472
473
474
475
476
int JackDebugClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback, void* arg)
{
	CheckClient();
    return fClient->SetClientRegistrationCallback(callback, arg);
}

sletz's avatar
sletz committed
477
478
int JackDebugClient::SetFreewheelCallback(JackFreewheelCallback callback, void *arg)
{
479
	CheckClient();
sletz's avatar
sletz committed
480
481
482
483
484
    return fClient->SetFreewheelCallback(callback, arg);
}

int JackDebugClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback, void *arg)
{
485
	CheckClient();
sletz's avatar
sletz committed
486
487
488
489
490
    return fClient->SetPortRegistrationCallback(callback, arg);
}

JackClientControl* JackDebugClient::GetClientControl() const
{
491
	CheckClient();
sletz's avatar
sletz committed
492
493
494
495
496
    return fClient->GetClientControl();
}

} // end of namespace