20 #include "JackDebugClient.h"
21 #include "JackEngineControl.h"
22 #include "JackException.h"
23 #include "JackError.h"
37 JackDebugClient::JackDebugClient(JackClient * client)
38 : JackClient(client->fSynchroTable)
49 JackDebugClient::~JackDebugClient()
52 *fStream << endl << endl <<
"----------------------------------- JackDebugClient summary ------------------------------- " << endl << endl;
53 *fStream <<
"Client flags ( 1:yes / 0:no ) :" << endl;
54 *fStream << setw(5) <<
"- Client call activated : " << fIsActivated << endl;
55 *fStream << setw(5) <<
"- Client call deactivated : " << fIsDeactivated << endl;
56 *fStream << setw(5) <<
"- Client call closed : " << fIsClosed << endl;
57 *fStream << setw(5) <<
"- Total number of instantiated port : " << fTotalPortNumber << endl;
58 *fStream << setw(5) <<
"- Number of port remaining open when exiting client : " << fOpenPortNumber << endl;
59 if (fOpenPortNumber != 0)
60 *fStream <<
"!!! WARNING !!! Some ports have not been unregistered ! Incorrect exiting !" << endl;
61 if (fIsDeactivated != fIsActivated)
62 *fStream <<
"!!! ERROR !!! Client seem to not perform symmetric activation-deactivation ! (not the same number of activate and deactivate)" << endl;
64 *fStream <<
"!!! ERROR !!! Client have not been closed with jack_client_close() !" << endl;
66 *fStream << endl << endl <<
"---------------------------- JackDebugClient detailed port summary ------------------------ " << endl << endl;
68 for (
int i = 1; i <= fTotalPortNumber ; i++) {
69 *fStream << endl <<
"Port index (internal debug test value) : " << i << endl;
70 *fStream << setw(5) <<
"- Name : " << fPortList[i].name << endl;
71 *fStream << setw(5) <<
"- idport : " << fPortList[i].idport << endl;
72 *fStream << setw(5) <<
"- IsConnected : " << fPortList[i].IsConnected << endl;
73 *fStream << setw(5) <<
"- IsUnregistered : " << fPortList[i].IsUnregistered << endl;
74 if (fPortList[i].IsUnregistered == 0)
75 *fStream <<
"!!! WARNING !!! Port have not been unregistered ! Incorrect exiting !" << endl;
77 *fStream <<
"delete object JackDebugClient : end of tracing" << endl;
82 int JackDebugClient::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
84 int res = fClient->Open(server_name, name, uuid, options, status);
90 curtime = time (NULL);
92 loctime = localtime (&curtime);
93 strftime (buffer, 256,
"%I-%M", loctime);
94 snprintf(provstr,
sizeof(provstr),
"JackClientDebug-%s-%s.log", name, buffer);
95 fStream =
new ofstream(provstr, ios_base::ate);
96 if (fStream->is_open()) {
98 *fStream <<
"Trying to open client with name '" << name <<
"' with bad result (client not opened)." << res << endl;
100 *fStream <<
"Open client with name '" << name <<
"'." << endl;
103 jack_log(
"JackDebugClient::Open : cannot open log file");
105 strcpy(fClientName, name);
109 int JackDebugClient::Close()
111 *fStream <<
"Client '" << fClientName <<
"' was closed" << endl;
112 int res = fClient->Close();
117 void JackDebugClient::CheckClient(
const char* function_name)
const
120 *fStream <<
"CheckClient : " << function_name <<
", calling thread : " << GetCurrentThread() << endl;
122 *fStream <<
"CheckClient : " << function_name <<
", calling thread : " << pthread_self() << endl;
126 *fStream <<
"!!! ERROR !!! : Accessing a client '" << fClientName <<
"' already closed " <<
"from " << function_name << endl;
127 *fStream <<
"This is likely to cause crash !'" << endl;
134 jack_native_thread_t JackDebugClient::GetThreadID()
136 CheckClient(
"GetThreadID");
137 return fClient->GetThreadID();
140 JackGraphManager* JackDebugClient::GetGraphManager()
const
142 CheckClient(
"GetGraphManager");
143 return fClient->GetGraphManager();
145 JackEngineControl* JackDebugClient::GetEngineControl()
const
147 CheckClient(
"GetEngineControl");
148 return fClient->GetEngineControl();
156 CheckClient(
"ClientNotify");
157 return fClient->ClientNotify( refnum, name, notify, sync, message, value1, value2);
162 CheckClient(
"Activate");
166 *fStream <<
"Client '" << fClientName <<
"' call activate a new time (it already call 'activate' previously)." << endl;
167 *fStream <<
"Client '" << fClientName <<
"' Activated" << endl;
169 *fStream <<
"Client '" << fClientName <<
"' try to activate but server return " << res <<
" ." << endl;
175 CheckClient(
"Deactivate");
178 if (fIsActivated == 0)
179 *fStream <<
"Client '" << fClientName <<
"' deactivate while it hasn't been previoulsy activated !" << endl;
180 *fStream <<
"Client '" << fClientName <<
"' Deactivated" << endl;
182 *fStream <<
"Client '" << fClientName <<
"' try to deactivate but server return " << res <<
" ." << endl;
190 int JackDebugClient::PortRegister(
const char* port_name,
const char* port_type,
unsigned long flags,
unsigned long buffer_size)
192 CheckClient(
"PortRegister");
193 int res = fClient->PortRegister(port_name, port_type, flags, buffer_size);
195 *fStream <<
"Client '" << fClientName <<
"' try port register ('" << port_name <<
"') and server return error " << res <<
" ." << endl;
197 if (fTotalPortNumber < MAX_PORT_HISTORY) {
198 fPortList[fTotalPortNumber].idport = res;
199 strcpy(fPortList[fTotalPortNumber].name, port_name);
200 fPortList[fTotalPortNumber].IsConnected = 0;
201 fPortList[fTotalPortNumber].IsUnregistered = 0;
203 *fStream <<
"!!! WARNING !!! History is full : no more port history will be recorded." << endl;
207 *fStream <<
"Client '" << fClientName <<
"' port register with portname '" << port_name <<
" port " << res <<
"' ." << endl;
212 int JackDebugClient::PortUnRegister(jack_port_id_t port_index)
214 CheckClient(
"PortUnRegister");
215 int res = fClient->PortUnRegister(port_index);
218 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
219 if (fPortList[i].idport == port_index) {
220 if (fPortList[i].IsUnregistered != 0)
221 *fStream <<
"!!! ERROR !!! : '" << fClientName <<
"' id deregistering port '" << fPortList[i].name <<
"' that have already been unregistered !" << endl;
222 fPortList[i].IsUnregistered++;
227 *fStream <<
"JackClientDebug : PortUnregister : port " << port_index <<
" was not previously registered !" << endl;
229 *fStream <<
"Client '" << fClientName <<
"' try to do PortUnregister and server return " << res << endl;
230 *fStream <<
"Client '" << fClientName <<
"' unregister port '" << port_index <<
"'." << endl;
234 int JackDebugClient::PortConnect(
const char* src,
const char* dst)
236 CheckClient(
"PortConnect");
238 *fStream <<
"!!! ERROR !!! Trying to connect a port ( " << src <<
" to " << dst <<
") while the client has not been activated !" << endl;
240 int res = fClient->PortConnect( src, dst);
241 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
242 if (strcmp(fPortList[i].name, src) == 0) {
243 if (fPortList[i].IsUnregistered != 0)
244 *fStream <<
"!!! ERROR !!! Connecting port " << src <<
" previoulsy unregistered !" << endl;
245 fPortList[i].IsConnected++;
246 *fStream <<
"Connecting port " << src <<
" to " << dst <<
". ";
248 }
else if (strcmp(fPortList[i].name, dst) == 0 ) {
249 if (fPortList[i].IsUnregistered != 0)
250 *fStream <<
"!!! ERROR !!! Connecting port " << dst <<
" previoulsy unregistered !" << endl;
251 fPortList[i].IsConnected++;
252 *fStream <<
"Connecting port " << src <<
" to " << dst <<
". ";
257 *fStream <<
"JackClientDebug : PortConnect : port was not found in debug database !" << endl;
259 *fStream <<
"Client '" << fClientName <<
"' try to do PortConnect but server return " << res <<
" ." << endl;
264 int JackDebugClient::PortDisconnect(
const char* src,
const char* dst)
266 CheckClient(
"PortDisconnect");
268 *fStream <<
"!!! ERROR !!! Trying to disconnect a port ( " << src <<
" to " << dst <<
") while the client has not been activated !" << endl;
269 int res = fClient->PortDisconnect( src, dst);
271 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
272 if (strcmp(fPortList[i].name, src) == 0) {
273 if (fPortList[i].IsUnregistered != 0)
274 *fStream <<
"!!! ERROR !!! : Disconnecting port " << src <<
" previoulsy unregistered !" << endl;
275 fPortList[i].IsConnected--;
276 *fStream <<
"disconnecting port " << src <<
". ";
278 }
else if (strcmp(fPortList[i].name, dst) == 0 ) {
279 if (fPortList[i].IsUnregistered != 0)
280 *fStream <<
"!!! ERROR !!! : Disonnecting port " << dst <<
" previoulsy unregistered !" << endl;
281 fPortList[i].IsConnected--;
282 *fStream <<
"disconnecting port " << dst <<
". ";
287 *fStream <<
"JackClientDebug : PortDisConnect : port was not found in debug database !" << endl;
289 *fStream <<
"Client '" << fClientName <<
"' try to do PortDisconnect but server return " << res <<
" ." << endl;
294 int JackDebugClient::PortDisconnect(jack_port_id_t src)
296 CheckClient(
"PortDisconnect");
298 *fStream <<
"!!! ERROR !!! : Trying to disconnect port " << src <<
" while that client has not been activated !" << endl;
299 int res = fClient->PortDisconnect(src);
301 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
302 if (fPortList[i].idport == src) {
303 if (fPortList[i].IsUnregistered != 0)
304 *fStream <<
"!!! ERROR !!! : Disconnecting port " << src <<
" previoulsy unregistered !" << endl;
305 fPortList[i].IsConnected--;
306 *fStream <<
"Disconnecting port " << src <<
". " << endl;
311 *fStream <<
"JackClientDebug : PortDisconnect : port was not found in debug database !" << endl;
313 *fStream <<
"Client '" << fClientName <<
"' try to do PortDisconnect but server return " << res <<
" ." << endl;
318 int JackDebugClient::PortIsMine(jack_port_id_t port_index)
320 CheckClient(
"PortIsMine");
321 *fStream <<
"JackClientDebug : PortIsMine port_index " << port_index << endl;
322 return fClient->PortIsMine(port_index);
325 int JackDebugClient::PortRename(jack_port_id_t port_index,
const char* name)
327 CheckClient(
"PortRename");
328 *fStream <<
"JackClientDebug : PortRename port_index " << port_index <<
"name" << name << endl;
329 return fClient->PortRename(port_index, name);
336 int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size)
338 CheckClient(
"SetBufferSize");
339 *fStream <<
"JackClientDebug : SetBufferSize buffer_size " << buffer_size << endl;
340 return fClient->SetBufferSize(buffer_size);
343 int JackDebugClient::SetFreeWheel(
int onoff)
345 CheckClient(
"SetFreeWheel");
346 if (onoff && fFreewheel)
347 *fStream <<
"!!! ERROR !!! : Freewheel setup seems incorrect : set = ON while FW is already ON " << endl;
348 if (!onoff && !fFreewheel)
349 *fStream <<
"!!! ERROR !!! : Freewheel setup seems incorrect : set = OFF while FW is already OFF " << endl;
350 fFreewheel = onoff ? true :
false;
351 return fClient->SetFreeWheel(onoff);
354 int JackDebugClient::ComputeTotalLatencies()
356 CheckClient(
"ComputeTotalLatencies");
357 return fClient->ComputeTotalLatencies();
367 void JackDebugClient::ShutDown(jack_status_t code,
const char* message)
369 CheckClient(
"ShutDown");
370 fClient->ShutDown(code, message);
377 int JackDebugClient::ReleaseTimebase()
379 CheckClient(
"ReleaseTimebase");
380 return fClient->ReleaseTimebase();
383 int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback,
void* arg)
385 CheckClient(
"SetSyncCallback");
386 return fClient->SetSyncCallback(sync_callback, arg);
389 int JackDebugClient::SetSyncTimeout(jack_time_t timeout)
391 CheckClient(
"SetSyncTimeout");
392 *fStream <<
"JackClientDebug : SetSyncTimeout timeout " << timeout << endl;
393 return fClient->SetSyncTimeout(timeout);
396 int JackDebugClient::SetTimebaseCallback(
int conditional, JackTimebaseCallback timebase_callback,
void* arg)
398 CheckClient(
"SetTimebaseCallback");
399 return fClient->SetTimebaseCallback( conditional, timebase_callback, arg);
402 void JackDebugClient::TransportLocate(jack_nframes_t frame)
404 CheckClient(
"TransportLocate");
405 *fStream <<
"JackClientDebug : TransportLocate frame " << frame << endl;
406 fClient->TransportLocate(frame);
409 jack_transport_state_t JackDebugClient::TransportQuery(
jack_position_t* pos)
411 CheckClient(
"TransportQuery");
412 return fClient->TransportQuery(pos);
415 jack_nframes_t JackDebugClient::GetCurrentTransportFrame()
417 CheckClient(
"GetCurrentTransportFrame");
418 return fClient->GetCurrentTransportFrame();
423 CheckClient(
"TransportReposition");
424 return fClient->TransportReposition(pos);
427 void JackDebugClient::TransportStart()
429 CheckClient(
"TransportStart");
430 fClient->TransportStart();
433 void JackDebugClient::TransportStop()
435 CheckClient(
"TransportStop");
436 fClient->TransportStop();
443 void JackDebugClient::OnShutdown(JackShutdownCallback callback,
void *arg)
445 CheckClient(
"OnShutdown");
446 fClient->OnShutdown(callback, arg);
449 void JackDebugClient::OnInfoShutdown(JackInfoShutdownCallback callback,
void *arg)
451 CheckClient(
"OnInfoShutdown");
452 fClient->OnInfoShutdown(callback, arg);
455 int JackDebugClient::TimeCallback(jack_nframes_t nframes,
void *arg)
457 JackDebugClient* client = (JackDebugClient*)arg;
458 jack_time_t t1 = GetMicroSeconds();
459 int res = client->fProcessTimeCallback(nframes, client->fProcessTimeCallbackArg);
461 jack_time_t t2 = GetMicroSeconds();
462 long delta = long((t2 - t1) - client->GetEngineControl()->fPeriodUsecs);
463 if (delta > 0 && !client->fFreewheel) {
464 *client->fStream <<
"!!! ERROR !!! : Process overload of " << delta <<
" us" << endl;
470 int JackDebugClient::SetProcessCallback(JackProcessCallback callback,
void *arg)
472 CheckClient(
"SetProcessCallback");
474 fProcessTimeCallback = callback;
475 fProcessTimeCallbackArg = arg;
477 if (callback == NULL) {
479 return fClient->SetProcessCallback(callback, arg);
482 return fClient->SetProcessCallback(TimeCallback,
this);
486 int JackDebugClient::SetXRunCallback(JackXRunCallback callback,
void *arg)
488 CheckClient(
"SetXRunCallback");
489 return fClient->SetXRunCallback(callback, arg);
492 int JackDebugClient::SetInitCallback(JackThreadInitCallback callback,
void *arg)
494 CheckClient(
"SetInitCallback");
495 return fClient->SetInitCallback(callback, arg);
498 int JackDebugClient::SetGraphOrderCallback(JackGraphOrderCallback callback,
void *arg)
500 CheckClient(
"SetGraphOrderCallback");
501 return fClient->SetGraphOrderCallback(callback, arg);
504 int JackDebugClient::SetBufferSizeCallback(JackBufferSizeCallback callback,
void *arg)
506 CheckClient(
"SetBufferSizeCallback");
507 return fClient->SetBufferSizeCallback(callback, arg);
510 int JackDebugClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback,
void* arg)
512 CheckClient(
"SetClientRegistrationCallback");
513 return fClient->SetClientRegistrationCallback(callback, arg);
516 int JackDebugClient::SetFreewheelCallback(JackFreewheelCallback callback,
void *arg)
518 CheckClient(
"SetFreewheelCallback");
519 return fClient->SetFreewheelCallback(callback, arg);
522 int JackDebugClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback,
void *arg)
524 CheckClient(
"SetPortRegistrationCallback");
525 return fClient->SetPortRegistrationCallback(callback, arg);
528 int JackDebugClient::SetPortConnectCallback(JackPortConnectCallback callback,
void *arg)
530 CheckClient(
"SetPortConnectCallback");
531 return fClient->SetPortConnectCallback(callback, arg);
534 int JackDebugClient::SetPortRenameCallback(JackPortRenameCallback callback,
void *arg)
536 CheckClient(
"SetPortRenameCallback");
537 return fClient->SetPortRenameCallback(callback, arg);
542 CheckClient(
"SetSessionCallback");
543 return fClient->SetSessionCallback(callback, arg);
546 int JackDebugClient::SetLatencyCallback(JackLatencyCallback callback,
void *arg)
548 CheckClient(
"SetLatencyCallback");
549 return fClient->SetLatencyCallback(callback, arg);
552 int JackDebugClient::SetProcessThread(JackThreadCallback fun,
void *arg)
554 CheckClient(
"SetProcessThread");
555 return fClient->SetProcessThread(fun, arg);
558 jack_session_command_t* JackDebugClient::SessionNotify(
const char* target, jack_session_event_type_t type,
const char* path)
560 CheckClient(
"SessionNotify");
561 *fStream <<
"JackClientDebug : SessionNotify target " << target <<
"type " << type <<
"path " << path << endl;
562 return fClient->SessionNotify(target, type, path);
567 CheckClient(
"SessionReply");
568 return fClient->SessionReply(ev);
571 char* JackDebugClient::GetUUIDForClientName(
const char* client_name)
573 CheckClient(
"GetUUIDForClientName");
574 *fStream <<
"JackClientDebug : GetUUIDForClientName client_name " << client_name << endl;
575 return fClient->GetUUIDForClientName(client_name);
578 char* JackDebugClient::GetClientNameByUUID(
const char* uuid)
580 CheckClient(
"GetClientNameByUUID");
581 *fStream <<
"JackClientDebug : GetClientNameByUUID uuid " << uuid << endl;
582 return fClient->GetClientNameByUUID(uuid);
585 int JackDebugClient::ReserveClientName(
const char* client_name,
const char* uuid)
587 CheckClient(
"ReserveClientName");
588 *fStream <<
"JackClientDebug : ReserveClientName client_name " << client_name <<
"uuid " << uuid << endl;
589 return fClient->ReserveClientName(client_name, uuid);
592 int JackDebugClient::ClientHasSessionCallback(
const char* client_name)
594 CheckClient(
"ClientHasSessionCallback");
595 *fStream <<
"JackClientDebug : ClientHasSessionCallback client_name " << client_name << endl;
596 return fClient->ClientHasSessionCallback(client_name);
599 JackClientControl* JackDebugClient::GetClientControl()
const
601 CheckClient(
"GetClientControl");
602 return fClient->GetClientControl();
606 char* JackDebugClient::GetInternalClientName(
int ref)
608 CheckClient(
"GetInternalClientName");
609 return fClient->GetInternalClientName(ref);
612 int JackDebugClient::InternalClientHandle(
const char* client_name, jack_status_t* status)
614 CheckClient(
"InternalClientHandle");
615 return fClient->InternalClientHandle(client_name, status);
618 int JackDebugClient::InternalClientLoad(
const char* client_name, jack_options_t options, jack_status_t* status,
jack_varargs_t* va)
620 CheckClient(
"InternalClientLoad");
621 return fClient->InternalClientLoad(client_name, options, status, va);
624 void JackDebugClient::InternalClientUnload(
int ref, jack_status_t* status)
626 CheckClient(
"InternalClientUnload");
627 fClient->InternalClientUnload(ref, status);