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);
virtual int Deactivate()
Need to stop thread after deactivating in the server.
virtual int Activate()
We need to start thread before activating in the server, otherwise the FW driver connected to the cli...
int Deactivate()
Need to stop thread after deactivating in the server.
int Activate()
We need to start thread before activating in the server, otherwise the FW driver connected to the cli...
int ClientNotify(int refnum, const char *name, int notify, int sync, const char *message, int value1, int value2)
Notification received from the server.
SERVER_EXPORT void jack_log(const char *fmt,...)
void(* JackSessionCallback)(jack_session_event_t *event, void *arg)