21 #include "JackSystemDeps.h"
22 #include "JackGraphManager.h"
23 #include "JackClientControl.h"
24 #include "JackEngineControl.h"
25 #include "JackGlobals.h"
26 #include "JackChannel.h"
27 #include "JackTransportEngine.h"
28 #include "driver_interface.h"
29 #include "JackLibGlobals.h"
41 #define IsRealTime() ((fProcess != NULL) | (fThreadFun != NULL) | (fSync != NULL) | (fTimebase != NULL))
43 JackClient::JackClient():fThread(this)
46 JackClient::JackClient(JackSynchro* table):fThread(this)
48 fSynchroTable = table;
56 fClientRegistration = NULL;
58 fPortRegistration = NULL;
68 fGraphOrderArg = NULL;
71 fInfoShutdownArg = NULL;
73 fBufferSizeArg = NULL;
75 fClientRegistrationArg = NULL;
76 fPortRegistrationArg = NULL;
77 fPortConnectArg = NULL;
78 fPortRenameArg = NULL;
85 fSessionReply = kPendingSessionReply;
88 JackClient::~JackClient()
91 int JackClient::Close()
93 jack_log(
"JackClient::Close ref = %ld", GetClientControl()->fRefNum);
100 if (JackGlobals::fServerRunning) {
101 fChannel->ClientClose(GetClientControl()->fRefNum, &result);
103 jack_log(
"JackClient::Close server is shutdown");
107 fSynchroTable[GetClientControl()->fRefNum].Disconnect();
108 JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL;
112 bool JackClient::IsActive()
114 return (GetClientControl()) ? GetClientControl()->fActive :
false;
117 jack_native_thread_t JackClient::GetThreadID()
119 return fThread.GetThreadID();
129 if (!freewheel && !GetEngineControl()->fSyncMode) {
130 jack_log(
"JackClient::SetupDriverSync driver sem in flush mode");
131 for (
int i = 0; i < GetEngineControl()->fDriverNum; i++) {
132 fSynchroTable[i].SetFlush(
true);
135 jack_log(
"JackClient::SetupDriverSync driver sem in normal mode");
136 for (
int i = 0; i < GetEngineControl()->fDriverNum; i++)
137 fSynchroTable[i].SetFlush(
false);
150 int JackClient::ClientNotify(
int refnum,
const char* name,
int notify,
int sync,
const char* message,
int value1,
int value2)
154 jack_log(
"JackClient::ClientNotify ref = %ld name = %s notify = %ld", refnum, name, notify);
160 res = ClientNotifyImp(refnum, name, notify, sync, message, value1, value2);
164 res = ClientNotifyImp(refnum, name, notify, sync, message, value1, value2);
167 case kActivateClient:
168 jack_log(
"JackClient::kActivateClient name = %s ref = %ld ", name, refnum);
182 jack_log(
"JackClient::kAddClient fName = %s name = %s", GetClientControl()->fName, name);
183 if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) {
184 fClientRegistration(name, 1, fClientRegistrationArg);
189 jack_log(
"JackClient::kRemoveClient fName = %s name = %s", GetClientControl()->fName, name);
190 if (fClientRegistration && strcmp(GetClientControl()->fName, name) != 0) {
191 fClientRegistration(name, 0, fClientRegistrationArg);
195 case kBufferSizeCallback:
196 jack_log(
"JackClient::kBufferSizeCallback buffer_size = %ld", value1);
198 res = fBufferSize(value1, fBufferSizeArg);
202 case kSampleRateCallback:
203 jack_log(
"JackClient::kSampleRateCallback sample_rate = %ld", value1);
205 res = fSampleRate(value1, fSampleRateArg);
209 case kGraphOrderCallback:
210 jack_log(
"JackClient::kGraphOrderCallback");
212 res = fGraphOrder(fGraphOrderArg);
216 case kStartFreewheelCallback:
217 jack_log(
"JackClient::kStartFreewheel");
218 SetupDriverSync(
true);
219 fThread.DropRealTime();
221 fFreewheel(1, fFreewheelArg);
225 case kStopFreewheelCallback:
226 jack_log(
"JackClient::kStopFreewheel");
227 SetupDriverSync(
false);
229 fFreewheel(0, fFreewheelArg);
231 if (GetEngineControl()->fRealTime) {
232 if (fThread.AcquireRealTime() < 0) {
233 jack_error(
"JackClient::AcquireRealTime error");
238 case kPortRegistrationOnCallback:
239 jack_log(
"JackClient::kPortRegistrationOn port_index = %ld", value1);
240 if (fPortRegistration) {
241 fPortRegistration(value1, 1, fPortRegistrationArg);
245 case kPortRegistrationOffCallback:
246 jack_log(
"JackClient::kPortRegistrationOff port_index = %ld ", value1);
247 if (fPortRegistration) {
248 fPortRegistration(value1, 0, fPortRegistrationArg);
252 case kPortConnectCallback:
253 jack_log(
"JackClient::kPortConnectCallback src = %ld dst = %ld", value1, value2);
255 fPortConnect(value1, value2, 1, fPortConnectArg);
259 case kPortDisconnectCallback:
260 jack_log(
"JackClient::kPortDisconnectCallback src = %ld dst = %ld", value1, value2);
262 fPortConnect(value1, value2, 0, fPortConnectArg);
266 case kPortRenameCallback:
267 jack_log(
"JackClient::kPortRenameCallback port = %ld", value1);
269 fPortRename(value1, message, GetGraphManager()->GetPort(value1)->GetName(), fPortRenameArg);
274 jack_log(
"JackClient::kXRunCallback");
276 res = fXrun(fXrunArg);
280 case kShutDownCallback:
281 jack_log(
"JackClient::kShutDownCallback");
283 fInfoShutdown((jack_status_t)value1, message, fInfoShutdownArg);
284 fInfoShutdown = NULL;
288 case kSessionCallback:
289 jack_log(
"JackClient::kSessionCallback");
292 char uuid_buf[JACK_UUID_SIZE];
293 event->
type = (jack_session_event_type_t)value1;
294 event->session_dir = strdup(message);
295 event->command_line = NULL;
297 snprintf(uuid_buf,
sizeof(uuid_buf),
"%d", GetClientControl()->fSessionID);
298 event->client_uuid = strdup(uuid_buf);
299 fSessionReply = kPendingSessionReply;
301 fSession(event, fSessionArg);
306 case kLatencyCallback:
307 res = HandleLatencyCallback(value1);
315 int JackClient::HandleLatencyCallback(
int status)
317 jack_latency_callback_mode_t mode = (status == 0) ? JackCaptureLatency : JackPlaybackLatency;
323 list<jack_port_id_t>::iterator it;
325 for (it = fPortList.begin(); it != fPortList.end(); it++) {
326 JackPort* port = GetGraphManager()->GetPort(*it);
327 if ((port->GetFlags() & JackPortIsOutput) && (mode == JackPlaybackLatency)) {
328 GetGraphManager()->RecalculateLatency(*it, mode);
330 if ((port->GetFlags() & JackPortIsInput) && (mode == JackCaptureLatency)) {
331 GetGraphManager()->RecalculateLatency(*it, mode);
341 if (mode == JackPlaybackLatency) {
344 for (it = fPortList.begin(); it != fPortList.end(); it++) {
345 JackPort* port = GetGraphManager()->GetPort(*it);
346 if (port->GetFlags() & JackPortIsOutput) {
348 port->GetLatencyRange(mode, &other_latency);
349 if (other_latency.
max > latency.
max)
350 latency.
max = other_latency.
max;
351 if (other_latency.
min < latency.
min)
352 latency.
min = other_latency.
min;
356 if (latency.
min == UINT32_MAX)
361 for (it = fPortList.begin(); it != fPortList.end(); it++) {
362 JackPort* port = GetGraphManager()->GetPort(*it);
363 if (port->GetFlags() & JackPortIsInput) {
364 port->SetLatencyRange(mode, &latency);
368 if (mode == JackCaptureLatency) {
371 for (it = fPortList.begin(); it != fPortList.end(); it++) {
372 JackPort* port = GetGraphManager()->GetPort(*it);
373 if (port->GetFlags() & JackPortIsInput) {
375 port->GetLatencyRange(mode, &other_latency);
376 if (other_latency.
max > latency.
max)
377 latency.
max = other_latency.
max;
378 if (other_latency.
min < latency.
min)
379 latency.
min = other_latency.
min;
383 if (latency.
min == UINT32_MAX)
388 for (it = fPortList.begin(); it != fPortList.end(); it++) {
389 JackPort* port = GetGraphManager()->GetPort(*it);
390 if (port->GetFlags() & JackPortIsOutput) {
391 port->SetLatencyRange(mode, &latency);
401 fLatency(mode, fLatencyArg);
417 if (StartThread() < 0)
425 GetClientControl()->fActive =
true;
428 GetClientControl()->fTransportSync =
true;
429 GetClientControl()->fTransportTimebase =
true;
432 GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime();
433 fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result);
446 GetClientControl()->fActive =
false;
449 GetClientControl()->fTransportSync =
false;
450 GetClientControl()->fTransportTimebase =
false;
454 fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result);
455 jack_log(
"JackClient::Deactivate res = %ld", result);
467 void JackClient::InitAux()
470 jack_log(
"JackClient::Init calling client thread init callback");
487 jack_log(
"JackClient::kBufferSizeCallback buffer_size = %ld", GetEngineControl()->fBufferSize);
489 fBufferSize(GetEngineControl()->fBufferSize, fBufferSizeArg);
496 if (!jack_tls_set(JackGlobals::fRealTime,
this))
497 jack_error(
"failed to set thread realtime key");
499 if (GetEngineControl()->fRealTime)
500 set_threaded_log_function();
503 if (GetEngineControl()->fRealTime) {
504 if (fThread.AcquireSelfRealTime(GetEngineControl()->fClientPriority) < 0) {
505 jack_error(
"JackClient::AcquireSelfRealTime error");
512 int JackClient::StartThread()
514 jack_log(
"JackClient::StartThread : period = %ld computation = %ld constraint = %ld",
515 long(int64_t(GetEngineControl()->fPeriod) / 1000.0f),
516 long(int64_t(GetEngineControl()->fComputation) / 1000.0f),
517 long(int64_t(GetEngineControl()->fConstraint) / 1000.0f));
520 fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
522 if (fThread.StartSync() < 0) {
540 fThreadFun(fThreadFunArg);
547 void JackClient::DummyCycle()
553 inline void JackClient::ExecuteThread()
557 CycleSignalAux(CallProcessCallback());
561 inline jack_nframes_t JackClient::CycleWaitAux()
565 CallSyncCallbackAux();
566 return GetEngineControl()->fBufferSize;
569 inline void JackClient::CycleSignalAux(
int status)
572 CallTimebaseCallbackAux();
578 jack_nframes_t JackClient::CycleWait()
580 return CycleWaitAux();
583 void JackClient::CycleSignal(
int status)
585 CycleSignalAux(status);
588 inline int JackClient::CallProcessCallback()
590 return (fProcess != NULL) ? fProcess(GetEngineControl()->fBufferSize, fProcessArg) : 0;
593 inline bool JackClient::WaitSync()
596 if (GetGraphManager()->SuspendRefNum(GetClientControl(), fSynchroTable, 0x7FFFFFFF) < 0) {
604 inline void JackClient::SignalSync()
607 if (GetGraphManager()->ResumeRefNum(GetClientControl(), fSynchroTable) < 0) {
612 inline void JackClient::End()
614 jack_log(
"JackClient::Execute end name = %s", GetClientControl()->fName);
617 fThread.DropSelfRealTime();
618 GetClientControl()->fActive =
false;
619 fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result);
623 inline void JackClient::Error()
625 jack_error(
"JackClient::Execute error name = %s", GetClientControl()->fName);
628 fThread.DropSelfRealTime();
629 GetClientControl()->fActive =
false;
630 fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result);
639 int JackClient::PortRegister(
const char* port_name,
const char* port_type,
unsigned long flags,
unsigned long buffer_size)
642 string port_name_str = string(port_name);
643 if (port_name_str.size() == 0) {
649 string name = string(GetClientControl()->fName) + string(
":") + port_name_str;
650 if (name.size() >= REAL_JACK_PORT_NAME_SIZE) {
651 jack_error(
"\"%s:%s\" is too long to be used as a JACK port name.\n"
652 "Please use %lu characters or less",
653 GetClientControl()->fName,
655 JACK_PORT_NAME_SIZE - 1);
660 jack_port_id_t port_index = NO_PORT;
661 fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result);
664 jack_log(
"JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, name.c_str(), port_type, port_index);
665 fPortList.push_back(port_index);
672 int JackClient::PortUnRegister(jack_port_id_t port_index)
674 jack_log(
"JackClient::PortUnRegister port_index = %ld", port_index);
675 list<jack_port_id_t>::iterator it = find(fPortList.begin(), fPortList.end(), port_index);
677 if (it != fPortList.end()) {
680 fChannel->PortUnRegister(GetClientControl()->fRefNum, port_index, &result);
683 jack_error(
"unregistering a port %ld that is not own by the client", port_index);
688 int JackClient::PortConnect(
const char* src,
const char* dst)
690 jack_log(
"JackClient::Connect src = %s dst = %s", src, dst);
692 fChannel->PortConnect(GetClientControl()->fRefNum, src, dst, &result);
696 int JackClient::PortDisconnect(
const char* src,
const char* dst)
698 jack_log(
"JackClient::Disconnect src = %s dst = %s", src, dst);
700 fChannel->PortDisconnect(GetClientControl()->fRefNum, src, dst, &result);
704 int JackClient::PortDisconnect(jack_port_id_t src)
706 jack_log(
"JackClient::PortDisconnect src = %ld", src);
708 fChannel->PortDisconnect(GetClientControl()->fRefNum, src, ALL_PORTS, &result);
712 int JackClient::PortIsMine(jack_port_id_t port_index)
714 JackPort* port = GetGraphManager()->GetPort(port_index);
715 return GetClientControl()->fRefNum == port->GetRefNum();
718 int JackClient::PortRename(jack_port_id_t port_index,
const char* name)
721 fChannel->PortRename(GetClientControl()->fRefNum, port_index, name, &result);
729 int JackClient::SetBufferSize(jack_nframes_t buffer_size)
732 fChannel->SetBufferSize(buffer_size, &result);
736 int JackClient::SetFreeWheel(
int onoff)
739 fChannel->SetFreewheel(onoff, &result);
743 int JackClient::ComputeTotalLatencies()
746 fChannel->ComputeTotalLatencies(&result);
757 void JackClient::ShutDown()
760 JackGlobals::fServerRunning =
false;
763 fInfoShutdown(JackFailure,
"JACK server has been closed", fInfoShutdownArg);
764 fInfoShutdown = NULL;
765 }
else if (fShutdown) {
766 fShutdown(fShutdownArg);
775 inline int JackClient::ActivateAux()
778 if (IsActive() && fThread.GetStatus() != JackThread::kRunning) {
780 jack_log(
"JackClient::ActivateAux");
783 if (StartThread() < 0)
787 GetClientControl()->fCallback[kRealTimeCallback] = IsRealTime();
788 fChannel->ClientActivate(GetClientControl()->fRefNum, IsRealTime(), &result);
796 int JackClient::ReleaseTimebase()
799 fChannel->ReleaseTimebase(GetClientControl()->fRefNum, &result);
801 GetClientControl()->fTransportTimebase =
false;
809 int JackClient::SetSyncCallback(JackSyncCallback sync_callback,
void* arg)
811 GetClientControl()->fTransportSync = (fSync != NULL);
813 fSync = sync_callback;
814 return ActivateAux();
817 int JackClient::SetTimebaseCallback(
int conditional, JackTimebaseCallback timebase_callback,
void* arg)
820 fChannel->SetTimebaseCallback(GetClientControl()->fRefNum, conditional, &result);
823 GetClientControl()->fTransportTimebase =
true;
824 fTimebase = timebase_callback;
826 return ActivateAux();
834 int JackClient::SetSyncTimeout(jack_time_t timeout)
836 GetEngineControl()->fTransport.SetSyncTimeout(timeout);
842 void JackClient::TransportLocate(jack_nframes_t frame)
846 pos.
valid = (jack_position_bits_t)0;
847 jack_log(
"JackClient::TransportLocate pos = %ld", pos.
frame);
848 GetEngineControl()->fTransport.RequestNewPos(&pos);
854 jack_log(
"JackClient::TransportReposition pos = %ld", pos->
frame);
855 if (tmp.
valid & ~JACK_POSITION_MASK) {
858 GetEngineControl()->fTransport.RequestNewPos(&tmp);
863 jack_transport_state_t JackClient::TransportQuery(
jack_position_t* pos)
865 return GetEngineControl()->fTransport.Query(pos);
868 jack_nframes_t JackClient::GetCurrentTransportFrame()
870 return GetEngineControl()->fTransport.GetCurrentFrame();
874 void JackClient::TransportStart()
876 GetEngineControl()->fTransport.SetCommand(TransportCommandStart);
880 void JackClient::TransportStop()
882 GetEngineControl()->fTransport.SetCommand(TransportCommandStop);
888 void JackClient::CallSyncCallback()
890 CallSyncCallbackAux();
893 inline void JackClient::CallSyncCallbackAux()
895 if (GetClientControl()->fTransportSync) {
897 JackTransportEngine& transport = GetEngineControl()->fTransport;
899 jack_transport_state_t transport_state = transport.GetState();
902 if (fSync(transport_state, cur_pos, fSyncArg)) {
903 GetClientControl()->fTransportState = JackTransportRolling;
904 GetClientControl()->fTransportSync =
false;
907 GetClientControl()->fTransportState = JackTransportRolling;
908 GetClientControl()->fTransportSync =
false;
913 void JackClient::CallTimebaseCallback()
915 CallTimebaseCallbackAux();
918 inline void JackClient::CallTimebaseCallbackAux()
920 JackTransportEngine& transport = GetEngineControl()->fTransport;
924 transport.GetTimebaseMaster(master, unused);
926 if (GetClientControl()->fRefNum == master && fTimebase) {
928 jack_transport_state_t transport_state = transport.GetState();
931 if (GetClientControl()->fTransportTimebase) {
932 fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos,
true, fTimebaseArg);
933 GetClientControl()->fTransportTimebase =
false;
934 }
else if (transport_state == JackTransportRolling) {
935 fTimebase(transport_state, GetEngineControl()->fBufferSize, cur_pos,
false, fTimebaseArg);
938 transport.WriteNextStateStop(1);
946 void JackClient::OnShutdown(JackShutdownCallback callback,
void *arg)
949 jack_error(
"You cannot set callbacks on an active client");
952 fShutdown = callback;
956 void JackClient::OnInfoShutdown(JackInfoShutdownCallback callback,
void *arg)
959 jack_error(
"You cannot set callbacks on an active client");
961 GetClientControl()->fCallback[kShutDownCallback] = (callback != NULL);
962 fInfoShutdownArg = arg;
963 fInfoShutdown = callback;
967 int JackClient::SetProcessCallback(JackProcessCallback callback,
void *arg)
970 jack_error(
"You cannot set callbacks on an active client");
972 }
else if (fThreadFun) {
973 jack_error (
"A thread callback has already been setup, both models cannot be used at the same time!");
982 int JackClient::SetXRunCallback(JackXRunCallback callback,
void *arg)
985 jack_error(
"You cannot set callbacks on an active client");
988 GetClientControl()->fCallback[kXRunCallback] = (callback != NULL);
995 int JackClient::SetInitCallback(JackThreadInitCallback callback,
void *arg)
998 jack_error(
"You cannot set callbacks on an active client");
1004 JackMessageBuffer::fInstance->SetInitCallback(callback, arg);
1009 int JackClient::SetGraphOrderCallback(JackGraphOrderCallback callback,
void *arg)
1012 jack_error(
"You cannot set callbacks on an active client");
1015 GetClientControl()->fCallback[kGraphOrderCallback] = (callback != NULL);
1016 fGraphOrder = callback;
1017 fGraphOrderArg = arg;
1022 int JackClient::SetBufferSizeCallback(JackBufferSizeCallback callback,
void *arg)
1025 jack_error(
"You cannot set callbacks on an active client");
1028 GetClientControl()->fCallback[kBufferSizeCallback] = (callback != NULL);
1029 fBufferSizeArg = arg;
1030 fBufferSize = callback;
1035 int JackClient::SetSampleRateCallback(JackSampleRateCallback callback,
void *arg)
1038 jack_error(
"You cannot set callbacks on an active client");
1041 GetClientControl()->fCallback[kSampleRateCallback] = (callback != NULL);
1042 fSampleRateArg = arg;
1043 fSampleRate = callback;
1046 callback(GetEngineControl()->fSampleRate, arg);
1051 int JackClient::SetClientRegistrationCallback(JackClientRegistrationCallback callback,
void* arg)
1054 jack_error(
"You cannot set callbacks on an active client");
1058 fClientRegistrationArg = arg;
1059 fClientRegistration = callback;
1064 int JackClient::SetFreewheelCallback(JackFreewheelCallback callback,
void *arg)
1067 jack_error(
"You cannot set callbacks on an active client");
1070 GetClientControl()->fCallback[kStartFreewheelCallback] = (callback != NULL);
1071 GetClientControl()->fCallback[kStopFreewheelCallback] = (callback != NULL);
1072 fFreewheelArg = arg;
1073 fFreewheel = callback;
1078 int JackClient::SetPortRegistrationCallback(JackPortRegistrationCallback callback,
void *arg)
1081 jack_error(
"You cannot set callbacks on an active client");
1084 GetClientControl()->fCallback[kPortRegistrationOnCallback] = (callback != NULL);
1085 GetClientControl()->fCallback[kPortRegistrationOffCallback] = (callback != NULL);
1086 fPortRegistrationArg = arg;
1087 fPortRegistration = callback;
1092 int JackClient::SetPortConnectCallback(JackPortConnectCallback callback,
void *arg)
1095 jack_error(
"You cannot set callbacks on an active client");
1098 GetClientControl()->fCallback[kPortConnectCallback] = (callback != NULL);
1099 GetClientControl()->fCallback[kPortDisconnectCallback] = (callback != NULL);
1100 fPortConnectArg = arg;
1101 fPortConnect = callback;
1106 int JackClient::SetPortRenameCallback(JackPortRenameCallback callback,
void *arg)
1109 jack_error(
"You cannot set callbacks on an active client");
1112 GetClientControl()->fCallback[kPortRenameCallback] = (callback != NULL);
1113 fPortRenameArg = arg;
1114 fPortRename = callback;
1119 int JackClient::SetProcessThread(JackThreadCallback fun,
void *arg)
1122 jack_error(
"You cannot set callbacks on an active client");
1124 }
else if (fProcess) {
1125 jack_error (
"A process callback has already been setup, both models cannot be used at the same time!");
1129 fThreadFunArg = arg;
1137 jack_error(
"You cannot set callbacks on an active client");
1140 GetClientControl()->fCallback[kSessionCallback] = (callback != NULL);
1142 fSession = callback;
1147 int JackClient::SetLatencyCallback(JackLatencyCallback callback,
void *arg)
1150 jack_error(
"You cannot set callbacks on an active client");
1155 fLatency = callback;
1164 char* JackClient::GetInternalClientName(
int ref)
1166 char name_res[JACK_CLIENT_NAME_SIZE + 1];
1168 fChannel->GetInternalClientName(GetClientControl()->fRefNum, ref, name_res, &result);
1169 return (result < 0) ? NULL : strdup(name_res);
1172 int JackClient::InternalClientHandle(
const char* client_name, jack_status_t* status)
1174 int int_ref, result = -1;
1175 fChannel->InternalClientHandle(GetClientControl()->fRefNum, client_name, (
int*)status, &int_ref, &result);
1179 int JackClient::InternalClientLoad(
const char* client_name, jack_options_t options, jack_status_t* status,
jack_varargs_t* va)
1181 if (strlen(client_name) >= JACK_CLIENT_NAME_SIZE) {
1182 jack_error (
"\"%s\" is too long for a JACK client name.\n"
1183 "Please use %lu characters or less.",
1184 client_name, JACK_CLIENT_NAME_SIZE);
1188 if (va->load_name && (strlen(va->load_name) >= JACK_PATH_MAX)) {
1189 jack_error(
"\"%s\" is too long for a shared object name.\n"
1190 "Please use %lu characters or less.",
1191 va->load_name, JACK_PATH_MAX);
1192 int my_status1 = *status | (JackFailure | JackInvalidOption);
1193 *status = (jack_status_t)my_status1;
1197 if (va->load_init && (strlen(va->load_init) >= JACK_LOAD_INIT_LIMIT)) {
1198 jack_error (
"\"%s\" is too long for internal client init "
1199 "string.\nPlease use %lu characters or less.",
1200 va->load_init, JACK_LOAD_INIT_LIMIT);
1201 int my_status1 = *status | (JackFailure | JackInvalidOption);
1202 *status = (jack_status_t)my_status1;
1206 int int_ref, result = -1;
1207 fChannel->InternalClientLoad(GetClientControl()->fRefNum, client_name, va->load_name, va->load_init, options, (
int*)status, &int_ref, -1, &result);
1211 void JackClient::InternalClientUnload(
int ref, jack_status_t* status)
1214 fChannel->InternalClientUnload(GetClientControl()->fRefNum, ref, (
int*)status, &result);
1221 jack_session_command_t* JackClient::SessionNotify(
const char* target, jack_session_event_type_t type,
const char* path)
1224 fChannel->SessionNotify(GetClientControl()->fRefNum, target, type, path, &res);
1231 strncpy(GetClientControl()->fSessionCommand, ev->
command_line,
sizeof(GetClientControl()->fSessionCommand));
1233 GetClientControl()->fSessionCommand[0] =
'\0';
1236 GetClientControl()->fSessionFlags = ev->
flags;
1238 jack_log(
"JackClient::SessionReply... we are here");
1239 if (fChannel->IsChannelThread()) {
1240 jack_log(
"JackClient::SessionReply... in callback reply");
1242 fSessionReply = kImmediateSessionReply;
1246 jack_log(
"JackClient::SessionReply... out of cb");
1249 fChannel->SessionReply(GetClientControl()->fRefNum, &result);
1253 char* JackClient::GetUUIDForClientName(
const char* client_name)
1255 char uuid_res[JACK_UUID_SIZE];
1257 fChannel->GetUUIDForClientName(GetClientControl()->fRefNum, client_name, uuid_res, &result);
1258 return (result) ? NULL : strdup(uuid_res);
1261 char* JackClient::GetClientNameByUUID(
const char* uuid)
1263 char name_res[JACK_CLIENT_NAME_SIZE + 1];
1265 fChannel->GetClientNameForUUID(GetClientControl()->fRefNum, uuid, name_res, &result);
1266 return (result) ? NULL : strdup(name_res);
1269 int JackClient::ReserveClientName(
const char* client_name,
const char* uuid)
1272 fChannel->ReserveClientName( GetClientControl()->fRefNum, client_name, uuid, &result);
1276 int JackClient::ClientHasSessionCallback(
const char* client_name)
1279 fChannel->ClientHasSessionCallback(client_name, &result);