20 #include "JackDebugClient.h"
21 #include "JackEngineControl.h"
22 #include "JackException.h"
23 #include "JackError.h"
37 JackDebugClient::JackDebugClient(JackClient * client)
48 JackDebugClient::~JackDebugClient()
51 *fStream << endl << endl <<
"----------------------------------- JackDebugClient summary ------------------------------- " << endl << endl;
52 *fStream <<
"Client flags ( 1:yes / 0:no ) :" << endl;
53 *fStream << setw(5) <<
"- Client call activated : " << fIsActivated << endl;
54 *fStream << setw(5) <<
"- Client call deactivated : " << fIsDeactivated << endl;
55 *fStream << setw(5) <<
"- Client call closed : " << fIsClosed << endl;
56 *fStream << setw(5) <<
"- Total number of instantiated port : " << fTotalPortNumber << endl;
57 *fStream << setw(5) <<
"- Number of port remaining open when exiting client : " << fOpenPortNumber << endl;
58 if (fOpenPortNumber != 0)
59 *fStream <<
"!!! WARNING !!! Some ports have not been unregistered ! Incorrect exiting !" << endl;
60 if (fIsDeactivated != fIsActivated)
61 *fStream <<
"!!! ERROR !!! Client seem to not perform symetric activation-deactivation ! (not the same number of activate and deactivate)" << endl;
63 *fStream <<
"!!! ERROR !!! Client have not been closed with jack_client_close() !" << endl;
65 *fStream << endl << endl <<
"---------------------------- JackDebugClient detailed port summary ------------------------ " << endl << endl;
67 for (
int i = 1; i <= fTotalPortNumber ; i++) {
68 *fStream << endl <<
"Port index (internal debug test value) : " << i << endl;
69 *fStream << setw(5) <<
"- Name : " << fPortList[i].name << endl;
70 *fStream << setw(5) <<
"- idport : " << fPortList[i].idport << endl;
71 *fStream << setw(5) <<
"- IsConnected : " << fPortList[i].IsConnected << endl;
72 *fStream << setw(5) <<
"- IsUnregistered : " << fPortList[i].IsUnregistered << endl;
73 if (fPortList[i].IsUnregistered == 0)
74 *fStream <<
"!!! WARNING !!! Port have not been unregistered ! Incorrect exiting !" << endl;
76 *fStream <<
"delete object JackDebugClient : end of tracing" << endl;
81 int JackDebugClient::Open(
const char* server_name,
const char* name,
int uuid, jack_options_t options, jack_status_t* status)
83 int res = fClient->Open(server_name, name, uuid, options, status);
89 curtime = time (NULL);
91 loctime = localtime (&curtime);
92 strftime (buffer, 256,
"%I-%M", loctime);
93 snprintf(provstr,
sizeof(provstr),
"JackClientDebug-%s-%s.log", name, buffer);
94 fStream =
new ofstream(provstr, ios_base::ate);
95 if (fStream->is_open()) {
97 *fStream <<
"Trying to open client with name '" << name <<
"' with bad result (client not opened)." << res << endl;
99 *fStream <<
"Open client with name '" << name <<
"'." << endl;
102 jack_log(
"JackDebugClient::Open : cannot open log file");
104 strcpy(fClientName, name);
108 int JackDebugClient::Close()
110 *fStream <<
"Client '" << fClientName <<
"' was closed" << endl;
111 int res = fClient->Close();
116 void JackDebugClient::CheckClient(
const char* function_name)
const
118 *fStream <<
"CheckClient : " << function_name <<
", calling thread : " << pthread_self() << endl;
121 *fStream <<
"!!! ERROR !!! : Accessing a client '" << fClientName <<
"' already closed " <<
"from " << function_name << endl;
122 *fStream <<
"This is likely to cause crash !'" << endl;
129 jack_native_thread_t JackDebugClient::GetThreadID()
131 CheckClient(
"GetThreadID");
132 return fClient->GetThreadID();
135 JackGraphManager* JackDebugClient::GetGraphManager()
const
137 CheckClient(
"GetGraphManager");
138 return fClient->GetGraphManager();
140 JackEngineControl* JackDebugClient::GetEngineControl()
const
142 CheckClient(
"GetEngineControl");
143 return fClient->GetEngineControl();
149 int JackDebugClient::ClientNotify(
int refnum,
const char* name,
int notify,
int sync,
const char* message,
int value1,
int value2)
151 CheckClient(
"ClientNotify");
152 return fClient->ClientNotify( refnum, name, notify, sync, message, value1, value2);
155 int JackDebugClient::Activate()
157 CheckClient(
"Activate");
158 int res = fClient->Activate();
161 *fStream <<
"Client '" << fClientName <<
"' call activate a new time (it already call 'activate' previously)." << endl;
162 *fStream <<
"Client '" << fClientName <<
"' Activated" << endl;
164 *fStream <<
"Client '" << fClientName <<
"' try to activate but server return " << res <<
" ." << endl;
168 int JackDebugClient::Deactivate()
170 CheckClient(
"Deactivate");
171 int res = fClient->Deactivate();
173 if (fIsActivated == 0)
174 *fStream <<
"Client '" << fClientName <<
"' deactivate while it hasn't been previoulsy activated !" << endl;
175 *fStream <<
"Client '" << fClientName <<
"' Deactivated" << endl;
177 *fStream <<
"Client '" << fClientName <<
"' try to deactivate but server return " << res <<
" ." << endl;
185 int JackDebugClient::PortRegister(
const char* port_name,
const char* port_type,
unsigned long flags,
unsigned long buffer_size)
187 CheckClient(
"PortRegister");
188 int res = fClient->PortRegister(port_name, port_type, flags, buffer_size);
190 *fStream <<
"Client '" << fClientName <<
"' try port register ('" << port_name <<
"') and server return error " << res <<
" ." << endl;
192 if (fTotalPortNumber < MAX_PORT_HISTORY) {
193 fPortList[fTotalPortNumber].idport = res;
194 strcpy(fPortList[fTotalPortNumber].name, port_name);
195 fPortList[fTotalPortNumber].IsConnected = 0;
196 fPortList[fTotalPortNumber].IsUnregistered = 0;
198 *fStream <<
"!!! WARNING !!! History is full : no more port history will be recorded." << endl;
202 *fStream <<
"Client '" << fClientName <<
"' port register with portname '" << port_name <<
" port " << res <<
"' ." << endl;
207 int JackDebugClient::PortUnRegister(jack_port_id_t port_index)
209 CheckClient(
"PortUnRegister");
210 int res = fClient->PortUnRegister(port_index);
213 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
214 if (fPortList[i].idport == port_index) {
215 if (fPortList[i].IsUnregistered != 0)
216 *fStream <<
"!!! ERROR !!! : '" << fClientName <<
"' id deregistering port '" << fPortList[i].name <<
"' that have already been unregistered !" << endl;
217 fPortList[i].IsUnregistered++;
222 *fStream <<
"JackClientDebug : PortUnregister : port " << port_index <<
" was not previously registered !" << endl;
224 *fStream <<
"Client '" << fClientName <<
"' try to do PortUnregister and server return " << res << endl;
225 *fStream <<
"Client '" << fClientName <<
"' unregister port '" << port_index <<
"'." << endl;
229 int JackDebugClient::PortConnect(
const char* src,
const char* dst)
231 CheckClient(
"PortConnect");
233 *fStream <<
"!!! ERROR !!! Trying to connect a port ( " << src <<
" to " << dst <<
") while the client has not been activated !" << endl;
235 int res = fClient->PortConnect( src, dst);
236 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
237 if (strcmp(fPortList[i].name, src) == 0) {
238 if (fPortList[i].IsUnregistered != 0)
239 *fStream <<
"!!! ERROR !!! Connecting port " << src <<
" previoulsy unregistered !" << endl;
240 fPortList[i].IsConnected++;
241 *fStream <<
"Connecting port " << src <<
" to " << dst <<
". ";
243 }
else if (strcmp(fPortList[i].name, dst) == 0 ) {
244 if (fPortList[i].IsUnregistered != 0)
245 *fStream <<
"!!! ERROR !!! Connecting port " << dst <<
" previoulsy unregistered !" << endl;
246 fPortList[i].IsConnected++;
247 *fStream <<
"Connecting port " << src <<
" to " << dst <<
". ";
252 *fStream <<
"JackClientDebug : PortConnect : port was not found in debug database !" << endl;
254 *fStream <<
"Client '" << fClientName <<
"' try to do PortConnect but server return " << res <<
" ." << endl;
259 int JackDebugClient::PortDisconnect(
const char* src,
const char* dst)
261 CheckClient(
"PortDisconnect");
263 *fStream <<
"!!! ERROR !!! Trying to disconnect a port ( " << src <<
" to " << dst <<
") while the client has not been activated !" << endl;
264 int res = fClient->PortDisconnect( src, dst);
266 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
267 if (strcmp(fPortList[i].name, src) == 0) {
268 if (fPortList[i].IsUnregistered != 0)
269 *fStream <<
"!!! ERROR !!! : Disconnecting port " << src <<
" previoulsy unregistered !" << endl;
270 fPortList[i].IsConnected--;
271 *fStream <<
"disconnecting port " << src <<
". ";
273 }
else if (strcmp(fPortList[i].name, dst) == 0 ) {
274 if (fPortList[i].IsUnregistered != 0)
275 *fStream <<
"!!! ERROR !!! : Disonnecting port " << dst <<
" previoulsy unregistered !" << endl;
276 fPortList[i].IsConnected--;
277 *fStream <<
"disconnecting port " << dst <<
". ";
282 *fStream <<
"JackClientDebug : PortDisConnect : port was not found in debug database !" << endl;
284 *fStream <<
"Client '" << fClientName <<
"' try to do PortDisconnect but server return " << res <<
" ." << endl;
289 int JackDebugClient::PortDisconnect(jack_port_id_t src)
291 CheckClient(
"PortDisconnect");
293 *fStream <<
"!!! ERROR !!! : Trying to disconnect port " << src <<
" while that client has not been activated !" << endl;
294 int res = fClient->PortDisconnect(src);
296 for (i = (fTotalPortNumber - 1); i >= 0; i--) {
297 if (fPortList[i].idport == src) {
298 if (fPortList[i].IsUnregistered != 0)
299 *fStream <<
"!!! ERROR !!! : Disconnecting port " << src <<
" previoulsy unregistered !" << endl;
300 fPortList[i].IsConnected--;
301 *fStream <<
"Disconnecting port " << src <<
". " << endl;
306 *fStream <<
"JackClientDebug : PortDisconnect : port was not found in debug database !" << endl;
308 *fStream <<
"Client '" << fClientName <<
"' try to do PortDisconnect but server return " << res <<
" ." << endl;
313 int JackDebugClient::PortIsMine(jack_port_id_t port_index)
315 CheckClient(
"PortIsMine");
316 return fClient->PortIsMine(port_index);
323 int JackDebugClient::SetBufferSize(jack_nframes_t buffer_size)
325 CheckClient(
"SetBufferSize");
326 return fClient->SetBufferSize(buffer_size);
329 int JackDebugClient::SetFreeWheel(
int onoff)
331 CheckClient(
"SetFreeWheel");
332 if (onoff && fFreewheel)
333 *fStream <<
"!!! ERROR !!! : Freewheel setup seems incorrect : set = ON while FW is already ON " << endl;
334 if (!onoff && !fFreewheel)
335 *fStream <<
"!!! ERROR !!! : Freewheel setup seems incorrect : set = OFF while FW is already OFF " << endl;
336 fFreewheel = onoff ?
true :
false;
337 return fClient->SetFreeWheel(onoff);
347 void JackDebugClient::ShutDown()
356 int JackDebugClient::ReleaseTimebase()
358 CheckClient(
"ReleaseTimebase");
359 return fClient->ReleaseTimebase();
362 int JackDebugClient::SetSyncCallback(JackSyncCallback sync_callback,
void* arg)
364 CheckClient(
"SetSyncCallback");
365 return fClient->SetSyncCallback(sync_callback, arg);
368 int JackDebugClient::SetSyncTimeout(jack_time_t timeout)
370 CheckClient(
"SetSyncTimeout");
371 return fClient->SetSyncTimeout(timeout);
374 int JackDebugClient::SetTimebaseCallback(
int conditional, JackTimebaseCallback timebase_callback,
void* arg)
376 CheckClient(
"SetTimebaseCallback");
377 return fClient->SetTimebaseCallback( conditional, timebase_callback, arg);
380 void JackDebugClient::TransportLocate(jack_nframes_t frame)
382 CheckClient(
"TransportLocate");
383 fClient->TransportLocate(frame);
386 jack_transport_state_t JackDebugClient::TransportQuery(
jack_position_t* pos)
388 CheckClient(
"TransportQuery");
389 return fClient->TransportQuery(pos);
392 jack_nframes_t JackDebugClient::GetCurrentTransportFrame()
394 CheckClient(
"GetCurrentTransportFrame");
395 return fClient->GetCurrentTransportFrame();
400 CheckClient(
"TransportReposition");
401 return fClient->TransportReposition(pos);
404 void JackDebugClient::TransportStart()
406 CheckClient(
"TransportStart");
407 fClient->TransportStart();
410 void JackDebugClient::TransportStop()
412 CheckClient(
"TransportStop");
413 fClient->TransportStop();
420 void JackDebugClient::OnShutdown(JackShutdownCallback callback,
void *arg)
422 CheckClient(
"OnShutdown");
423 fClient->OnShutdown(callback, arg);
426 void JackDebugClient::OnInfoShutdown(JackInfoShutdownCallback callback,
void *arg)
428 CheckClient(
"OnInfoShutdown");
429 fClient->OnInfoShutdown(callback, arg);
432 int JackDebugClient::TimeCallback(jack_nframes_t nframes,
void *arg)
434 JackDebugClient* client = (JackDebugClient*)arg;
435 jack_time_t t1 = GetMicroSeconds();
436 int res = client->fProcessTimeCallback(nframes, client->fProcessTimeCallbackArg);
438 jack_time_t t2 = GetMicroSeconds();
439 long delta = long((t2 - t1) - client->GetEngineControl()->fPeriodUsecs);
440 if (delta > 0 && !client->fFreewheel)
441 *client->fStream <<
"!!! ERROR !!! : Process overload of " << delta <<
" us" << endl;
446 int JackDebugClient::SetProcessCallback(JackProcessCallback callback,
void *arg)
448 CheckClient(
"SetProcessCallback");
449 fProcessTimeCallback = callback;
450 fProcessTimeCallbackArg = arg;
451 return fClient->SetProcessCallback(TimeCallback,
this);
454 int JackDebugClient::SetXRunCallback(JackXRunCallback callback,
void *arg)
456 CheckClient(
"SetXRunCallback");
457 return fClient->SetXRunCallback(callback, arg);
460 int JackDebugClient::SetInitCallback(JackThreadInitCallback callback,
void *arg)
462 CheckClient(
"SetInitCallback");
463 return fClient->SetInitCallback(callback, arg);
466 int JackDebugClient::SetGraphOrderCallback(JackGraphOrderCallback callback,
void *arg)
468 CheckClient(
"SetGraphOrderCallback");
469 return fClient->SetGraphOrderCallback(callback, arg);
472 int JackDebugClient::SetBufferSizeCallback(JackBufferSizeCallback callback,
void *arg)
474 CheckClient(
"SetBufferSizeCallback");
475 return fClient->SetBufferSizeCallback(callback, arg);
478 int JackDebugClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback,
void* arg)
480 CheckClient(
"SetClientRegistrationCallback");
481 return fClient->SetClientRegistrationCallback(callback, arg);
484 int JackDebugClient::SetFreewheelCallback(JackFreewheelCallback callback,
void *arg)
486 CheckClient(
"SetFreewheelCallback");
487 return fClient->SetFreewheelCallback(callback, arg);
490 int JackDebugClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback,
void *arg)
492 CheckClient(
"SetPortRegistrationCallback");
493 return fClient->SetPortRegistrationCallback(callback, arg);
496 int JackDebugClient::SetPortConnectCallback(JackPortConnectCallback callback,
void *arg)
498 CheckClient(
"SetPortConnectCallback");
499 return fClient->SetPortConnectCallback(callback, arg);
502 int JackDebugClient::SetPortRenameCallback(JackPortRenameCallback callback,
void *arg)
504 CheckClient(
"SetPortRenameCallback");
505 return fClient->SetPortRenameCallback(callback, arg);
510 CheckClient(
"SetSessionCallback");
511 return fClient->SetSessionCallback(callback, arg);
514 int JackDebugClient::SetLatencyCallback(JackLatencyCallback callback,
void *arg)
516 CheckClient(
"SetLatencyCallback");
517 return fClient->SetLatencyCallback(callback, arg);
520 jack_session_command_t* JackDebugClient::SessionNotify(
const char* target, jack_session_event_type_t type,
const char* path)
522 CheckClient(
"SessionNotify");
523 return fClient->SessionNotify(target, type, path);
528 CheckClient(
"SessionReply");
529 return fClient->SessionReply(ev);
532 char* JackDebugClient::GetUUIDForClientName(
const char* client_name)
534 CheckClient(
"GetUUIDForClientName");
535 return fClient->GetUUIDForClientName(client_name);
538 char* JackDebugClient::GetClientNameByUUID(
const char* uuid)
540 CheckClient(
"GetClientNameByUUID");
541 return fClient->GetClientNameByUUID(uuid);
544 int JackDebugClient::ReserveClientName(
const char* client_name,
const char* uuid)
546 CheckClient(
"ReserveClientName");
547 return fClient->ReserveClientName(client_name, uuid);
550 int JackDebugClient::ClientHasSessionCallback(
const char* client_name)
552 CheckClient(
"ClientHasSessionCallback");
553 return fClient->ClientHasSessionCallback(client_name);
556 JackClientControl* JackDebugClient::GetClientControl()
const
558 CheckClient(
"GetClientControl");
559 return fClient->GetClientControl();
563 char* JackDebugClient::GetInternalClientName(
int ref)
565 CheckClient(
"GetInternalClientName");
566 return fClient->GetInternalClientName(ref);
569 int JackDebugClient::InternalClientHandle(
const char* client_name, jack_status_t* status)
571 CheckClient(
"InternalClientHandle");
572 return fClient->InternalClientHandle(client_name, status);
575 int JackDebugClient::InternalClientLoad(
const char* client_name, jack_options_t options, jack_status_t* status,
jack_varargs_t* va)
577 CheckClient(
"InternalClientLoad");
578 return fClient->InternalClientLoad(client_name, options, status, va);
581 void JackDebugClient::InternalClientUnload(
int ref, jack_status_t* status)
583 CheckClient(
"InternalClientUnload");
584 fClient->InternalClientUnload(ref, status);