Browse Source

Merge 261828fd51 into cfb85b0143

pull/597/merge
twischer-adit GitHub 5 years ago
parent
commit
adc4a730d8
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
53 changed files with 908 additions and 531 deletions
  1. +131
    -123
      common/JackAPI.cpp
  2. +7
    -1
      common/JackAudioAdapterFactory.cpp
  3. +2
    -2
      common/JackAudioPort.cpp
  4. +8
    -7
      common/JackClient.cpp
  5. +3
    -2
      common/JackClient.h
  6. +1
    -1
      common/JackConnectionManager.cpp
  7. +2
    -1
      common/JackConnectionManager.h
  8. +6
    -0
      common/JackConstants.h
  9. +8
    -1
      common/JackControlAPI.cpp
  10. +1
    -1
      common/JackDebugClient.cpp
  11. +1
    -0
      common/JackDriver.h
  12. +5
    -1
      common/JackEngineControl.h
  13. +2
    -2
      common/JackEngineProfiling.cpp
  14. +4
    -1
      common/JackEngineProfiling.h
  15. +7
    -5
      common/JackGenericClientChannel.cpp
  16. +4
    -1
      common/JackGenericClientChannel.h
  17. +14
    -3
      common/JackGlobals.cpp
  18. +231
    -17
      common/JackGlobals.h
  19. +6
    -3
      common/JackGraphManager.cpp
  20. +4
    -2
      common/JackGraphManager.h
  21. +8
    -24
      common/JackInternalClient.cpp
  22. +6
    -5
      common/JackInternalClient.h
  23. +88
    -59
      common/JackLibAPI.cpp
  24. +19
    -51
      common/JackLibClient.cpp
  25. +1
    -4
      common/JackLibClient.h
  26. +105
    -75
      common/JackLibGlobals.h
  27. +2
    -1
      common/JackMidiPort.cpp
  28. +22
    -14
      common/JackMidiUtil.cpp
  29. +4
    -2
      common/JackNetAdapter.cpp
  30. +1
    -1
      common/JackPortType.cpp
  31. +4
    -2
      common/JackPortType.h
  32. +7
    -5
      common/JackServer.cpp
  33. +4
    -2
      common/JackServer.h
  34. +27
    -9
      common/JackServerAPI.cpp
  35. +27
    -6
      common/JackServerGlobals.cpp
  36. +54
    -29
      common/JackServerGlobals.h
  37. +4
    -4
      common/JackThreadedDriver.cpp
  38. +7
    -5
      common/JackTransportEngine.cpp
  39. +3
    -2
      common/JackTransportEngine.h
  40. +36
    -36
      common/shm.c
  41. +5
    -3
      linux/alsa/JackAlsaAdapter.cpp
  42. +2
    -1
      linux/alsa/JackAlsaAdapter.h
  43. +1
    -1
      macosx/coreaudio/JackCoreAudioAdapter.h
  44. +1
    -1
      macosx/coreaudio/JackCoreAudioAdapter.mm
  45. +1
    -1
      posix/JackPosixServerLaunch.cpp
  46. +3
    -3
      posix/JackSocketClientChannel.cpp
  47. +1
    -1
      posix/JackSocketClientChannel.h
  48. +5
    -3
      solaris/oss/JackOSSAdapter.cpp
  49. +5
    -1
      solaris/oss/JackOSSAdapter.h
  50. +3
    -3
      windows/JackWinNamedPipeClientChannel.cpp
  51. +2
    -1
      windows/JackWinNamedPipeClientChannel.h
  52. +1
    -1
      windows/portaudio/JackPortAudioAdapter.cpp
  53. +2
    -1
      windows/portaudio/JackPortAudioAdapter.h

+ 131
- 123
common/JackAPI.cpp View File

@@ -291,7 +291,7 @@ static inline bool CheckBufferSize(jack_nframes_t buffer_size)
return (buffer_size >= 1 && buffer_size <= BUFFER_SIZE_MAX); return (buffer_size >= 1 && buffer_size <= BUFFER_SIZE_MAX);
} }


static inline void WaitGraphChange()
static inline void WaitGraphChange(JackGlobals *globals)
{ {
/* /*
TLS key that is set only in RT thread, so never waits for pending TLS key that is set only in RT thread, so never waits for pending
@@ -299,8 +299,8 @@ static inline void WaitGraphChange()
*/ */


if (jack_tls_get(JackGlobals::fRealTimeThread) == NULL) { if (jack_tls_get(JackGlobals::fRealTimeThread) == NULL) {
JackGraphManager* manager = GetGraphManager();
JackEngineControl* control = GetEngineControl();
JackGraphManager* manager = globals->GetGraphManager();
JackEngineControl* control = globals->GetEngineControl();
assert(manager); assert(manager);
assert(control); assert(control);
if (manager->IsPendingChange()) { if (manager->IsPendingChange()) {
@@ -348,13 +348,17 @@ LIB_EXPORT void* jack_port_get_buffer(jack_port_t* port, jack_nframes_t frames)
{ {
JackGlobals::CheckContext("jack_port_get_buffer"); JackGlobals::CheckContext("jack_port_get_buffer");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_buffer called with an incorrect port %ld", myport); jack_error("jack_port_get_buffer called with an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
if (!global) {
jack_error("jack_port_get_buffer called with invalid context (port %ld)", myport);
return NULL;
}
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetBuffer(myport, frames) : NULL); return (manager ? manager->GetBuffer(myport, frames) : NULL);
} }
} }
@@ -363,8 +367,7 @@ LIB_EXPORT jack_uuid_t jack_port_uuid(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_uuid"); JackGlobals::CheckContext("jack_port_uuid");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_uuid called with an incorrect port %ld", myport); jack_error("jack_port_uuid called with an incorrect port %ld", myport);
return 0; return 0;
@@ -377,13 +380,13 @@ LIB_EXPORT const char* jack_port_name(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_name"); JackGlobals::CheckContext("jack_port_name");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_name called with an incorrect port %ld", myport); jack_error("jack_port_name called with an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetName() : NULL); return (manager ? manager->GetPort(myport)->GetName() : NULL);
} }
} }
@@ -392,13 +395,13 @@ LIB_EXPORT const char* jack_port_short_name(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_short_name"); JackGlobals::CheckContext("jack_port_short_name");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_short_name called with an incorrect port %ld", myport); jack_error("jack_port_short_name called with an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetShortName() : NULL); return (manager ? manager->GetPort(myport)->GetShortName() : NULL);
} }
} }
@@ -407,13 +410,13 @@ LIB_EXPORT int jack_port_flags(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_flags"); JackGlobals::CheckContext("jack_port_flags");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_flags called with an incorrect port %ld", myport); jack_error("jack_port_flags called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetFlags() : -1); return (manager ? manager->GetPort(myport)->GetFlags() : -1);
} }
} }
@@ -422,13 +425,13 @@ LIB_EXPORT const char* jack_port_type(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_type"); JackGlobals::CheckContext("jack_port_type");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_flags called an incorrect port %ld", myport); jack_error("jack_port_flags called an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetType() : NULL); return (manager ? manager->GetPort(myport)->GetType() : NULL);
} }
} }
@@ -437,13 +440,13 @@ LIB_EXPORT jack_port_type_id_t jack_port_type_id(const jack_port_t *port)
{ {
JackGlobals::CheckContext("jack_port_type_id"); JackGlobals::CheckContext("jack_port_type_id");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_type_id called an incorrect port %ld", myport); jack_error("jack_port_type_id called an incorrect port %ld", myport);
return 0; return 0;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? GetPortTypeId(manager->GetPort(myport)->GetType()) : 0); return (manager ? GetPortTypeId(manager->GetPort(myport)->GetType()) : 0);
} }
} }
@@ -452,14 +455,14 @@ LIB_EXPORT int jack_port_connected(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_connected"); JackGlobals::CheckContext("jack_port_connected");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_connected called with an incorrect port %ld", myport); jack_error("jack_port_connected called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetConnectionsNum(myport) : -1); return (manager ? manager->GetConnectionsNum(myport) : -1);
} }
} }
@@ -468,8 +471,7 @@ LIB_EXPORT int jack_port_connected_to(const jack_port_t* port, const char* port_
{ {
JackGlobals::CheckContext("jack_port_connected_to"); JackGlobals::CheckContext("jack_port_connected_to");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t src = (jack_port_id_t)port_aux;
jack_port_id_t src = JackGlobals::PortId(port);
if (!CheckPort(src)) { if (!CheckPort(src)) {
jack_error("jack_port_connected_to called with an incorrect port %ld", src); jack_error("jack_port_connected_to called with an incorrect port %ld", src);
return -1; return -1;
@@ -477,8 +479,9 @@ LIB_EXPORT int jack_port_connected_to(const jack_port_t* port, const char* port_
jack_error("jack_port_connected_to called with a NULL port name"); jack_error("jack_port_connected_to called with a NULL port name");
return -1; return -1;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
jack_port_id_t dst = (manager ? manager->GetPort(port_name) : NO_PORT); jack_port_id_t dst = (manager ? manager->GetPort(port_name) : NO_PORT);
if (dst == NO_PORT) { if (dst == NO_PORT) {
jack_error("Unknown destination port port_name = %s", port_name); jack_error("Unknown destination port port_name = %s", port_name);
@@ -493,19 +496,22 @@ LIB_EXPORT int jack_port_tie(jack_port_t* src, jack_port_t* dst)
{ {
JackGlobals::CheckContext("jack_port_tie"); JackGlobals::CheckContext("jack_port_tie");


uintptr_t src_aux = (uintptr_t)src;
jack_port_id_t mysrc = (jack_port_id_t)src_aux;
jack_port_id_t mysrc = JackGlobals::PortId(src);
if (!CheckPort(mysrc)) { if (!CheckPort(mysrc)) {
jack_error("jack_port_tie called with a NULL src port"); jack_error("jack_port_tie called with a NULL src port");
return -1; return -1;
} }
uintptr_t dst_aux = (uintptr_t)dst;
jack_port_id_t mydst = (jack_port_id_t)dst_aux;
jack_port_id_t mydst = JackGlobals::PortId(dst);
if (!CheckPort(mydst)) { if (!CheckPort(mydst)) {
jack_error("jack_port_tie called with a NULL dst port"); jack_error("jack_port_tie called with a NULL dst port");
return -1; return -1;
} }
JackGraphManager* manager = GetGraphManager();
if (JackGlobals::PortContext(src) != JackGlobals::PortContext(dst)) {
jack_error("jack_port_tie called with ports not belonging to the same context");
return -1;
}
JackGlobals *global = JackGlobals::PortGlobal(src);
JackGraphManager* manager = global->GetGraphManager();
if (manager && manager->GetPort(mysrc)->GetRefNum() != manager->GetPort(mydst)->GetRefNum()) { if (manager && manager->GetPort(mysrc)->GetRefNum() != manager->GetPort(mydst)->GetRefNum()) {
jack_error("jack_port_tie called with ports not belonging to the same client"); jack_error("jack_port_tie called with ports not belonging to the same client");
return -1; return -1;
@@ -518,13 +524,13 @@ LIB_EXPORT int jack_port_untie(jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_untie"); JackGlobals::CheckContext("jack_port_untie");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_untie called with an incorrect port %ld", myport); jack_error("jack_port_untie called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->UnTie() : -1); return (manager ? manager->GetPort(myport)->UnTie() : -1);
} }
} }
@@ -533,14 +539,14 @@ LIB_EXPORT jack_nframes_t jack_port_get_latency(jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_get_latency"); JackGlobals::CheckContext("jack_port_get_latency");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_latency called with an incorrect port %ld", myport); jack_error("jack_port_get_latency called with an incorrect port %ld", myport);
return 0; return 0;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetLatency() : 0); return (manager ? manager->GetPort(myport)->GetLatency() : 0);
} }
} }
@@ -549,12 +555,12 @@ LIB_EXPORT void jack_port_set_latency(jack_port_t* port, jack_nframes_t frames)
{ {
JackGlobals::CheckContext("jack_port_set_latency"); JackGlobals::CheckContext("jack_port_set_latency");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_set_latency called with an incorrect port %ld", myport); jack_error("jack_port_set_latency called with an incorrect port %ld", myport);
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
if (manager) if (manager)
manager->GetPort(myport)->SetLatency(frames); manager->GetPort(myport)->SetLatency(frames);
} }
@@ -564,13 +570,13 @@ LIB_EXPORT void jack_port_get_latency_range(jack_port_t *port, jack_latency_call
{ {
JackGlobals::CheckContext("jack_port_get_latency_range"); JackGlobals::CheckContext("jack_port_get_latency_range");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_latency_range called with an incorrect port %ld", myport); jack_error("jack_port_get_latency_range called with an incorrect port %ld", myport);
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
if (manager) if (manager)
manager->GetPort(myport)->GetLatencyRange(mode, range); manager->GetPort(myport)->GetLatencyRange(mode, range);
} }
@@ -580,13 +586,13 @@ LIB_EXPORT void jack_port_set_latency_range(jack_port_t *port, jack_latency_call
{ {
JackGlobals::CheckContext("jack_port_set_latency_range"); JackGlobals::CheckContext("jack_port_set_latency_range");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_set_latency_range called with an incorrect port %ld", myport); jack_error("jack_port_set_latency_range called with an incorrect port %ld", myport);
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
if (manager) if (manager)
manager->GetPort(myport)->SetLatencyRange(mode, range); manager->GetPort(myport)->SetLatencyRange(mode, range);
} }
@@ -598,8 +604,7 @@ LIB_EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port




JackClient* client = (JackClient*)ext_client; JackClient* client = (JackClient*)ext_client;
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (client == NULL) { if (client == NULL) {
jack_error("jack_recompute_total_latency called with a NULL client"); jack_error("jack_recompute_total_latency called with a NULL client");
return -1; return -1;
@@ -607,8 +612,9 @@ LIB_EXPORT int jack_recompute_total_latency(jack_client_t* ext_client, jack_port
jack_error("jack_recompute_total_latency called with a NULL port"); jack_error("jack_recompute_total_latency called with a NULL port");
return -1; return -1;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->ComputeTotalLatency(myport) : -1); return (manager ? manager->ComputeTotalLatency(myport) : -1);
} }
} }
@@ -634,7 +640,8 @@ LIB_EXPORT int jack_port_set_name(jack_port_t* port, const char* name)
// Find a valid client // Find a valid client
jack_client_t* client = NULL; jack_client_t* client = NULL;
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
if ((client = (jack_client_t*)JackGlobals::fClientTable[i])) {
JackGlobals *global = JackGlobals::PortGlobal(port);
if ((client = (jack_client_t*)global->fClientTable[i])) {
break; break;
} }
} }
@@ -647,8 +654,7 @@ LIB_EXPORT int jack_port_rename(jack_client_t* ext_client, jack_port_t* port, co
JackGlobals::CheckContext("jack_port_rename"); JackGlobals::CheckContext("jack_port_rename");


JackClient* client = (JackClient*)ext_client; JackClient* client = (JackClient*)ext_client;
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (client == NULL) { if (client == NULL) {
jack_error("jack_port_rename called with a NULL client"); jack_error("jack_port_rename called with a NULL client");
return -1; return -1;
@@ -667,8 +673,7 @@ LIB_EXPORT int jack_port_set_alias(jack_port_t* port, const char* name)
{ {
JackGlobals::CheckContext("jack_port_set_alias"); JackGlobals::CheckContext("jack_port_set_alias");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_set_alias called with an incorrect port %ld", myport); jack_error("jack_port_set_alias called with an incorrect port %ld", myport);
return -1; return -1;
@@ -676,7 +681,8 @@ LIB_EXPORT int jack_port_set_alias(jack_port_t* port, const char* name)
jack_error("jack_port_set_alias called with a NULL port name"); jack_error("jack_port_set_alias called with a NULL port name");
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->SetAlias(name) : -1); return (manager ? manager->GetPort(myport)->SetAlias(name) : -1);
} }
} }
@@ -685,8 +691,7 @@ LIB_EXPORT int jack_port_unset_alias(jack_port_t* port, const char* name)
{ {
JackGlobals::CheckContext("jack_port_unset_alias"); JackGlobals::CheckContext("jack_port_unset_alias");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_unset_alias called with an incorrect port %ld", myport); jack_error("jack_port_unset_alias called with an incorrect port %ld", myport);
return -1; return -1;
@@ -694,7 +699,8 @@ LIB_EXPORT int jack_port_unset_alias(jack_port_t* port, const char* name)
jack_error("jack_port_unset_alias called with a NULL port name"); jack_error("jack_port_unset_alias called with a NULL port name");
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->UnsetAlias(name) : -1); return (manager ? manager->GetPort(myport)->UnsetAlias(name) : -1);
} }
} }
@@ -703,13 +709,13 @@ LIB_EXPORT int jack_port_get_aliases(const jack_port_t* port, char* const aliase
{ {
JackGlobals::CheckContext("jack_port_get_aliases"); JackGlobals::CheckContext("jack_port_get_aliases");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_aliases called with an incorrect port %ld", myport); jack_error("jack_port_get_aliases called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetPort(myport)->GetAliases(aliases) : -1); return (manager ? manager->GetPort(myport)->GetAliases(aliases) : -1);
} }
} }
@@ -718,13 +724,13 @@ LIB_EXPORT int jack_port_request_monitor(jack_port_t* port, int onoff)
{ {
JackGlobals::CheckContext("jack_port_request_monitor"); JackGlobals::CheckContext("jack_port_request_monitor");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_request_monitor called with an incorrect port %ld", myport); jack_error("jack_port_request_monitor called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->RequestMonitor(myport, onoff) : -1); return (manager ? manager->RequestMonitor(myport, onoff) : -1);
} }
} }
@@ -738,7 +744,7 @@ LIB_EXPORT int jack_port_request_monitor_by_name(jack_client_t* ext_client, cons
jack_error("jack_port_request_monitor_by_name called with a NULL client"); jack_error("jack_port_request_monitor_by_name called with a NULL client");
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGraphManager* manager = client->GetGlobal()->GetGraphManager();
if (!manager) if (!manager)
return -1; return -1;
jack_port_id_t myport = manager->GetPort(port_name); jack_port_id_t myport = manager->GetPort(port_name);
@@ -755,13 +761,13 @@ LIB_EXPORT int jack_port_ensure_monitor(jack_port_t* port, int onoff)
{ {
JackGlobals::CheckContext("jack_port_ensure_monitor"); JackGlobals::CheckContext("jack_port_ensure_monitor");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_ensure_monitor called with an incorrect port %ld", myport); jack_error("jack_port_ensure_monitor called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global ? global->GetGraphManager() : nullptr;
return (manager ? manager->GetPort(myport)->EnsureMonitor(onoff) : -1); return (manager ? manager->GetPort(myport)->EnsureMonitor(onoff) : -1);
} }
} }
@@ -770,13 +776,13 @@ LIB_EXPORT int jack_port_monitoring_input(jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_monitoring_input"); JackGlobals::CheckContext("jack_port_monitoring_input");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_monitoring_input called with an incorrect port %ld", myport); jack_error("jack_port_monitoring_input called with an incorrect port %ld", myport);
return -1; return -1;
} else { } else {
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
JackGraphManager* manager = global ? global->GetGraphManager() : nullptr;
return (manager ? manager->GetPort(myport)->MonitoringInput() : -1); return (manager ? manager->GetPort(myport)->MonitoringInput() : -1);
} }
} }
@@ -790,7 +796,7 @@ LIB_EXPORT int jack_is_realtime(jack_client_t* ext_client)
jack_error("jack_is_realtime called with a NULL client"); jack_error("jack_is_realtime called with a NULL client");
return -1; return -1;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fRealTime : -1); return (control ? control->fRealTime : -1);
} }
} }
@@ -1095,7 +1101,9 @@ LIB_EXPORT jack_port_t* jack_port_register(jack_client_t* ext_client, const char
jack_error("jack_port_register called with a NULL port name or a NULL port_type"); jack_error("jack_port_register called with a NULL port name or a NULL port_type");
return NULL; return NULL;
} else { } else {
return (jack_port_t *)((uintptr_t)client->PortRegister(port_name, port_type, flags, buffer_size));
JackGlobals* global =client->GetGlobal();
jack_port_id_t port_id = (jack_port_id_t)((uintptr_t)client->PortRegister(port_name, port_type, flags, buffer_size));
return global->PortById(port_id);
} }
} }


@@ -1108,8 +1116,7 @@ LIB_EXPORT int jack_port_unregister(jack_client_t* ext_client, jack_port_t* port
jack_error("jack_port_unregister called with a NULL client"); jack_error("jack_port_unregister called with a NULL client");
return -1; return -1;
} }
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_unregister called with an incorrect port %ld", myport); jack_error("jack_port_unregister called with an incorrect port %ld", myport);
return -1; return -1;
@@ -1126,8 +1133,7 @@ LIB_EXPORT int jack_port_is_mine(const jack_client_t* ext_client, const jack_por
jack_error("jack_port_is_mine called with a NULL client"); jack_error("jack_port_is_mine called with a NULL client");
return -1; return -1;
} }
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_is_mine called with an incorrect port %ld", myport); jack_error("jack_port_is_mine called with an incorrect port %ld", myport);
return -1; return -1;
@@ -1139,14 +1145,14 @@ LIB_EXPORT const char** jack_port_get_connections(const jack_port_t* port)
{ {
JackGlobals::CheckContext("jack_port_get_connections"); JackGlobals::CheckContext("jack_port_get_connections");


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_connections called with an incorrect port %ld", myport); jack_error("jack_port_get_connections called with an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetConnections(myport) : NULL); return (manager ? manager->GetConnections(myport) : NULL);
} }
} }
@@ -1162,14 +1168,14 @@ LIB_EXPORT const char** jack_port_get_all_connections(const jack_client_t* ext_c
return NULL; return NULL;
} }


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_all_connections called with an incorrect port %ld", myport); jack_error("jack_port_get_all_connections called with an incorrect port %ld", myport);
return NULL; return NULL;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
return (manager ? manager->GetConnections(myport) : NULL); return (manager ? manager->GetConnections(myport) : NULL);
} }
} }
@@ -1184,14 +1190,14 @@ LIB_EXPORT jack_nframes_t jack_port_get_total_latency(jack_client_t* ext_client,
return 0; return 0;
} }


uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(port);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_get_total_latency called with an incorrect port %ld", myport); jack_error("jack_port_get_total_latency called with an incorrect port %ld", myport);
return 0; return 0;
} else { } else {
WaitGraphChange();
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = JackGlobals::PortGlobal(port);
WaitGraphChange(global);
JackGraphManager* manager = global->GetGraphManager();
if (manager) { if (manager) {
manager->ComputeTotalLatency(myport); manager->ComputeTotalLatency(myport);
return manager->GetPort(myport)->GetTotalLatency(); return manager->GetPort(myport)->GetTotalLatency();
@@ -1242,8 +1248,7 @@ LIB_EXPORT int jack_port_disconnect(jack_client_t* ext_client, jack_port_t* src)
jack_error("jack_port_disconnect called with a NULL client"); jack_error("jack_port_disconnect called with a NULL client");
return -1; return -1;
} }
uintptr_t port_aux = (uintptr_t)src;
jack_port_id_t myport = (jack_port_id_t)port_aux;
jack_port_id_t myport = JackGlobals::PortId(src);
if (!CheckPort(myport)) { if (!CheckPort(myport)) {
jack_error("jack_port_disconnect called with an incorrect port %ld", myport); jack_error("jack_port_disconnect called with an incorrect port %ld", myport);
return -1; return -1;
@@ -1260,7 +1265,7 @@ LIB_EXPORT jack_nframes_t jack_get_sample_rate(jack_client_t* ext_client)
jack_error("jack_get_sample_rate called with a NULL client"); jack_error("jack_get_sample_rate called with a NULL client");
return 0; return 0;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fSampleRate : 0); return (control ? control->fSampleRate : 0);
} }
} }
@@ -1274,7 +1279,7 @@ LIB_EXPORT jack_nframes_t jack_get_buffer_size(jack_client_t* ext_client)
jack_error("jack_get_buffer_size called with a NULL client"); jack_error("jack_get_buffer_size called with a NULL client");
return 0; return 0;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fBufferSize : 0); return (control ? control->fBufferSize : 0);
} }
} }
@@ -1288,7 +1293,7 @@ LIB_EXPORT const char** jack_get_ports(jack_client_t* ext_client, const char* po
jack_error("jack_get_ports called with a NULL client"); jack_error("jack_get_ports called with a NULL client");
return NULL; return NULL;
} }
JackGraphManager* manager = GetGraphManager();
JackGraphManager* manager = client->GetGlobal()->GetGraphManager();
return (manager ? manager->GetPorts(port_name_pattern, type_name_pattern, flags) : NULL); return (manager ? manager->GetPorts(port_name_pattern, type_name_pattern, flags) : NULL);
} }


@@ -1307,10 +1312,11 @@ LIB_EXPORT jack_port_t* jack_port_by_name(jack_client_t* ext_client, const char*
return NULL; return NULL;
} }
JackGraphManager* manager = GetGraphManager();
JackGlobals *global = client->GetGlobal();
JackGraphManager* manager = global->GetGraphManager();
if (manager) { if (manager) {
int res = manager->GetPort(portname); // returns a port index at least > 1
return (res == NO_PORT) ? NULL : (jack_port_t*)((uintptr_t)res);
jack_port_id_t port_id = manager->GetPort(portname); // returns a port index at least > 1
return (port_id == NO_PORT) ? NULL : global->PortById(port_id);
} else { } else {
return NULL; return NULL;
} }
@@ -1343,7 +1349,7 @@ LIB_EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext
JackGlobals::CheckContext("jack_frames_since_cycle_start"); JackGlobals::CheckContext("jack_frames_since_cycle_start");


JackTimer timer; JackTimer timer;
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = ((JackClient*)ext_client)->GetGlobal()->GetEngineControl();
if (control) { if (control) {
control->ReadFrameTime(&timer); control->ReadFrameTime(&timer);
return timer.FramesSinceCycleStart(GetMicroSeconds(), control->fSampleRate); return timer.FramesSinceCycleStart(GetMicroSeconds(), control->fSampleRate);
@@ -1369,7 +1375,7 @@ LIB_EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack
return 0; return 0;
} else { } else {
JackTimer timer; JackTimer timer;
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
if (control) { if (control) {
control->ReadFrameTime(&timer); control->ReadFrameTime(&timer);
return timer.Frames2Time(frames, control->fBufferSize); return timer.Frames2Time(frames, control->fBufferSize);
@@ -1389,7 +1395,7 @@ LIB_EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, j
return 0; return 0;
} else { } else {
JackTimer timer; JackTimer timer;
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
if (control) { if (control) {
control->ReadFrameTime(&timer); control->ReadFrameTime(&timer);
return timer.Time2Frames(usecs, control->fBufferSize); return timer.Time2Frames(usecs, control->fBufferSize);
@@ -1410,7 +1416,7 @@ LIB_EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client)
{ {
JackGlobals::CheckContext("jack_last_frame_time"); JackGlobals::CheckContext("jack_last_frame_time");


JackEngineControl* control = GetEngineControl();
JackEngineControl* control = ((JackClient*)ext_client)->GetGlobal()->GetEngineControl();
return (control) ? control->fFrameTimer.ReadCurrentState()->CurFrame() : 0; return (control) ? control->fFrameTimer.ReadCurrentState()->CurFrame() : 0;
} }


@@ -1422,7 +1428,7 @@ LIB_EXPORT int jack_get_cycle_times(const jack_client_t *client,
{ {
JackGlobals::CheckContext("jack_get_cycle_times"); JackGlobals::CheckContext("jack_get_cycle_times");


JackEngineControl* control = GetEngineControl();
JackEngineControl* control = ((JackClient*)client)->GetGlobal()->GetEngineControl();
if (control) { if (control) {
JackTimer timer; JackTimer timer;
control->ReadFrameTime(&timer); control->ReadFrameTime(&timer);
@@ -1441,7 +1447,7 @@ LIB_EXPORT float jack_cpu_load(jack_client_t* ext_client)
jack_error("jack_cpu_load called with a NULL client"); jack_error("jack_cpu_load called with a NULL client");
return 0.0f; return 0.0f;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fCPULoad : 0.0f); return (control ? control->fCPULoad : 0.0f);
} }
} }
@@ -1501,7 +1507,7 @@ LIB_EXPORT size_t jack_port_type_get_buffer_size(jack_client_t* ext_client, cons
jack_error("jack_port_type_get_buffer_size called with an unknown port type = %s", port_type); jack_error("jack_port_type_get_buffer_size called with an unknown port type = %s", port_type);
return 0; return 0;
} else { } else {
return GetPortType(port_id)->size();
return GetPortType(port_id)->size(client->GetGlobal());
} }
} }
} }
@@ -1666,7 +1672,7 @@ LIB_EXPORT float jack_get_max_delayed_usecs(jack_client_t* ext_client)
jack_error("jack_get_max_delayed_usecs called with a NULL client"); jack_error("jack_get_max_delayed_usecs called with a NULL client");
return 0.f; return 0.f;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fMaxDelayedUsecs : 0.f); return (control ? control->fMaxDelayedUsecs : 0.f);
} }
} }
@@ -1680,7 +1686,7 @@ LIB_EXPORT float jack_get_xrun_delayed_usecs(jack_client_t* ext_client)
jack_error("jack_get_xrun_delayed_usecs called with a NULL client"); jack_error("jack_get_xrun_delayed_usecs called with a NULL client");
return 0.f; return 0.f;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control ? control->fXrunDelayedUsecs : 0.f); return (control ? control->fXrunDelayedUsecs : 0.f);
} }
} }
@@ -1693,7 +1699,7 @@ LIB_EXPORT void jack_reset_max_delayed_usecs(jack_client_t* ext_client)
if (client == NULL) { if (client == NULL) {
jack_error("jack_reset_max_delayed_usecs called with a NULL client"); jack_error("jack_reset_max_delayed_usecs called with a NULL client");
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
control->ResetXRun(); control->ResetXRun();
} }
} }
@@ -1708,7 +1714,7 @@ LIB_EXPORT int jack_client_real_time_priority(jack_client_t* ext_client)
jack_error("jack_client_real_time_priority called with a NULL client"); jack_error("jack_client_real_time_priority called with a NULL client");
return -1; return -1;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control->fRealTime) ? control->fClientPriority : -1; return (control->fRealTime) ? control->fClientPriority : -1;
} }
} }
@@ -1722,17 +1728,19 @@ LIB_EXPORT int jack_client_max_real_time_priority(jack_client_t* ext_client)
jack_error("jack_client_max_real_time_priority called with a NULL client"); jack_error("jack_client_max_real_time_priority called with a NULL client");
return -1; return -1;
} else { } else {
JackEngineControl* control = GetEngineControl();
JackEngineControl* control = client->GetGlobal()->GetEngineControl();
return (control->fRealTime) ? control->fMaxClientPriority : -1; return (control->fRealTime) ? control->fMaxClientPriority : -1;
} }
} }


LIB_EXPORT int jack_acquire_real_time_scheduling(jack_native_thread_t thread, int priority) LIB_EXPORT int jack_acquire_real_time_scheduling(jack_native_thread_t thread, int priority)
{ {
JackEngineControl* control = GetEngineControl();
return (control
? JackThread::AcquireRealTimeImp(thread, priority, control->fPeriod, control->fComputation, control->fConstraint)
: -1);
jack_error("jack_acquire_real_time_scheduling is not implemented");
abort();
// JackEngineControl* control = GetEngineControl();
// return (control
// ? JackThread::AcquireRealTimeImp(thread, priority, control->fPeriod, control->fComputation, control->fConstraint)
// : -1);
} }


LIB_EXPORT int jack_client_create_thread(jack_client_t* client, LIB_EXPORT int jack_client_create_thread(jack_client_t* client,
@@ -1744,7 +1752,7 @@ LIB_EXPORT int jack_client_create_thread(jack_client_t* client,
{ {
JackGlobals::CheckContext("jack_client_create_thread"); JackGlobals::CheckContext("jack_client_create_thread");


JackEngineControl* control = GetEngineControl();
JackEngineControl* control = ((JackClient*)client)->GetGlobal()->GetEngineControl();
int res = JackThread::StartImp(thread, priority, realtime, routine, arg); int res = JackThread::StartImp(thread, priority, realtime, routine, arg);
return (res == 0) return (res == 0)
? ((realtime ? JackThread::AcquireRealTimeImp(*thread, priority, control->fPeriod, control->fComputation, control->fConstraint) : res)) ? ((realtime ? JackThread::AcquireRealTimeImp(*thread, priority, control->fPeriod, control->fComputation, control->fConstraint) : res))


+ 7
- 1
common/JackAudioAdapterFactory.cpp View File

@@ -60,9 +60,15 @@ extern "C"
jack_nframes_t buffer_size = jack_get_buffer_size(jack_client); jack_nframes_t buffer_size = jack_get_buffer_size(jack_client);
jack_nframes_t sample_rate = jack_get_sample_rate(jack_client); jack_nframes_t sample_rate = jack_get_sample_rate(jack_client);



if (jack_client == NULL) {
jack_error("jack_internal_initialize called with NULL jack_client");
return 1;
}

try { try {


adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackPlatformAdapter(buffer_size, sample_rate, params), params);
adapter = new Jack::JackAudioAdapter(jack_client, new Jack::JackPlatformAdapter(*((JackClient*) jack_client), buffer_size, sample_rate, params), params);
assert(adapter); assert(adapter);


if (adapter->Open() == 0) { if (adapter->Open() == 0) {


+ 2
- 2
common/JackAudioPort.cpp View File

@@ -154,9 +154,9 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun
} }
} }


static size_t AudioBufferSize()
static size_t AudioBufferSize(JackGlobals *global)
{ {
return GetEngineControl()->fBufferSize * sizeof(jack_default_audio_sample_t);
return global->GetEngineControl()->fBufferSize * sizeof(jack_default_audio_sample_t);
} }


const JackPortType gAudioPortType = const JackPortType gAudioPortType =


+ 8
- 7
common/JackClient.cpp View File

@@ -39,9 +39,10 @@ namespace Jack


#define IsRealTime() ((fProcess != NULL) | (fThreadFun != NULL) | (fSync != NULL) | (fTimebase != NULL)) #define IsRealTime() ((fProcess != NULL) | (fThreadFun != NULL) | (fSync != NULL) | (fTimebase != NULL))


JackClient::JackClient(JackSynchro* table):fThread(this)
JackClient::JackClient(JackGlobals* globals):JackGlobalsInterface(globals),
fThread(this)
{ {
fSynchroTable = table;
fSynchroTable = globals->GetSynchroTable();
fProcess = NULL; fProcess = NULL;
fGraphOrder = NULL; fGraphOrder = NULL;
fXrun = NULL; fXrun = NULL;
@@ -114,11 +115,12 @@ int JackClient::Close()
fChannel->ClientClose(GetClientControl()->fRefNum, &result); fChannel->ClientClose(GetClientControl()->fRefNum, &result);
fChannel->Close(); fChannel->Close();
assert(JackGlobals::fSynchroMutex);
JackGlobals::fSynchroMutex->Lock();
assert(GetGlobal());
assert(GetGlobal()->fSynchroMutex);
GetGlobal()->fSynchroMutex->Lock();
fSynchroTable[GetClientControl()->fRefNum].Disconnect(); fSynchroTable[GetClientControl()->fRefNum].Disconnect();
JackGlobals::fSynchroMutex->Unlock();
JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL;
GetGlobal()->fSynchroMutex->Unlock();
GetGlobal()->fClientTable[GetClientControl()->fRefNum] = nullptr;
return result; return result;
} }


@@ -1345,6 +1347,5 @@ int JackClient::PropertyChangeNotify(jack_uuid_t subject, const char* key, jack_
return result; return result;
} }



} // end of namespace } // end of namespace



+ 3
- 2
common/JackClient.h View File

@@ -29,6 +29,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "JackChannel.h" #include "JackChannel.h"
#include "JackRequest.h" #include "JackRequest.h"
#include "JackMetadata.h" #include "JackMetadata.h"
#include "JackGlobals.h"
#include "varargs.h" #include "varargs.h"
#include <list> #include <list>


@@ -45,7 +46,7 @@ struct JackEngineControl;
\brief The base class for clients: share part of the implementation for JackInternalClient and JackLibClient. \brief The base class for clients: share part of the implementation for JackInternalClient and JackLibClient.
*/ */


class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnableInterface
class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnableInterface, public JackGlobalsInterface
{ {
friend class JackDebugClient; friend class JackDebugClient;


@@ -128,7 +129,7 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable


public: public:


JackClient(JackSynchro* table);
JackClient(JackGlobals* globals);
virtual ~JackClient(); virtual ~JackClient();
char* GetServerName() { return fServerName; } char* GetServerName() { return fServerName; }


+ 1
- 1
common/JackConnectionManager.cpp View File

@@ -57,7 +57,7 @@ bool JackConnectionManager::IsLoopPathAux(int ref1, int ref2) const
{ {
jack_log("JackConnectionManager::IsLoopPathAux ref1 = %ld ref2 = %ld", ref1, ref2); jack_log("JackConnectionManager::IsLoopPathAux ref1 = %ld ref2 = %ld", ref1, ref2);


if (ref1 < GetEngineControl()->fDriverNum || ref2 < GetEngineControl()->fDriverNum) {
if (ref1 < GetGlobal()->GetEngineControl()->fDriverNum || ref2 < GetGlobal()->GetEngineControl()->fDriverNum) {
return false; return false;
} else if (ref1 == ref2) { // Same refnum } else if (ref1 == ref2) { // Same refnum
return true; return true;


+ 2
- 1
common/JackConnectionManager.h View File

@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "JackConstants.h" #include "JackConstants.h"
#include "JackActivationCount.h" #include "JackActivationCount.h"
#include "JackError.h" #include "JackError.h"
#include "JackGlobals.h"
#include "JackCompilerDeps.h" #include "JackCompilerDeps.h"
#include <vector> #include <vector>
#include <assert.h> #include <assert.h>
@@ -408,7 +409,7 @@ struct JackClientTiming
*/ */


PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE
class SERVER_EXPORT JackConnectionManager
class SERVER_EXPORT JackConnectionManager : public JackGlobalsInterface
{ {


private: private:


+ 6
- 0
common/JackConstants.h View File

@@ -57,6 +57,12 @@
#define PORT_NUM_FOR_CLIENT 768 #define PORT_NUM_FOR_CLIENT 768
#endif #endif


// used by JackLib when process has mulitple clients connecting to different Jack Servers
#define PORT_SERVER_CONTEXT_BITS (8)
#define PORT_SERVER_CONTEXT_MAX ((1 << PORT_SERVER_CONTEXT_BITS) - 1)
#define PORT_SERVER_CONTEXT_SHIFT (sizeof(jack_port_id_t) * 8 - PORT_SERVER_CONTEXT_BITS)
#define PORT_SERVER_CONTEXT_MASK (PORT_SERVER_CONTEXT_MAX << PORT_SERVER_CONTEXT_SHIFT)

#define FIRST_AVAILABLE_PORT 1 #define FIRST_AVAILABLE_PORT 1


#define CONNECTION_NUM_FOR_PORT PORT_NUM_FOR_CLIENT #define CONNECTION_NUM_FOR_PORT PORT_NUM_FOR_CLIENT


+ 8
- 1
common/JackControlAPI.cpp View File

@@ -1052,6 +1052,12 @@ jackctl_server_open(
goto fail; goto fail;
} }


JackServerGlobals *global = JackGlobalsManager::Instance()->CreateGlobal<JackServerGlobals>(server_ptr->name.str);
if (global == nullptr) {
jack_error("Failed to create global context");
goto fail;
}

/* get the engine/driver started */ /* get the engine/driver started */
server_ptr->engine = new JackServer( server_ptr->engine = new JackServer(
server_ptr->sync.b, server_ptr->sync.b,
@@ -1063,7 +1069,8 @@ jackctl_server_open(
server_ptr->verbose.b, server_ptr->verbose.b,
(jack_timer_type_t)server_ptr->clock_source.ui, (jack_timer_type_t)server_ptr->clock_source.ui,
server_ptr->self_connect_mode.c, server_ptr->self_connect_mode.c,
server_ptr->name.str);
server_ptr->name.str,
global);
if (server_ptr->engine == NULL) if (server_ptr->engine == NULL)
{ {
jack_error("Failed to create new JackServer object"); jack_error("Failed to create new JackServer object");


+ 1
- 1
common/JackDebugClient.cpp View File

@@ -35,7 +35,7 @@ namespace Jack
{ {


JackDebugClient::JackDebugClient(JackClient * client) JackDebugClient::JackDebugClient(JackClient * client)
: JackClient(client->fSynchroTable)
: JackClient(client->GetGlobal())
{ {
fTotalPortNumber = 1; // The total number of port opened and maybe closed. Historical view. fTotalPortNumber = 1; // The total number of port opened and maybe closed. Historical view.
fOpenPortNumber = 0; // The current number of opened port. fOpenPortNumber = 0; // The current number of opened port.


+ 1
- 0
common/JackDriver.h View File

@@ -126,6 +126,7 @@ typedef std::list<std::pair<std::string, std::pair<std::string, std::string> > >


class SERVER_EXPORT JackDriver : public JackDriverClientInterface class SERVER_EXPORT JackDriver : public JackDriverClientInterface
{ {
friend class JackThreadedDriver;


protected: protected:




+ 5
- 1
common/JackEngineControl.h View File

@@ -92,7 +92,11 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
JackEngineProfiling fProfiler; JackEngineProfiling fProfiler;
#endif #endif


JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name)
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name, JackGlobals *global)
: fTransport(global)
#ifdef JACK_MONITOR
, fProfiler(global)
#endif
{ {
fBufferSize = 512; fBufferSize = 512;
fSampleRate = 48000; fSampleRate = 48000;


+ 2
- 2
common/JackEngineProfiling.cpp View File

@@ -31,7 +31,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


JackEngineProfiling::JackEngineProfiling():fAudioCycle(0),fMeasuredClient(0)
JackEngineProfiling::JackEngineProfiling(JackGlobals *global):fGlobal(global), fAudioCycle(0),fMeasuredClient(0)
{ {
jack_info("Engine profiling activated, beware %ld MBytes are needed to record profiling points...", sizeof(fProfileTable) / (1024 * 1024)); jack_info("Engine profiling activated, beware %ld MBytes are needed to record profiling points...", sizeof(fProfileTable) / (1024 * 1024));


@@ -354,7 +354,7 @@ void JackEngineProfiling::Profile(JackClientInterface** table,
fProfileTable[fAudioCycle].fPrevCycleEnd = prev_cycle_end; fProfileTable[fAudioCycle].fPrevCycleEnd = prev_cycle_end;
fProfileTable[fAudioCycle].fAudioCycle = fAudioCycle; fProfileTable[fAudioCycle].fAudioCycle = fAudioCycle;


for (int i = GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
for (int i = fGlobal->GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i]; JackClientInterface* client = table[i];
JackClientTiming* timing = manager->GetClientTiming(i); JackClientTiming* timing = manager->GetClientTiming(i);
if (client && client->GetClientControl()->fActive && client->GetClientControl()->fCallback[kRealTimeCallback]) { if (client && client->GetClientControl()->fActive && client->GetClientControl()->fCallback[kRealTimeCallback]) {


+ 4
- 1
common/JackEngineProfiling.h View File

@@ -24,6 +24,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "JackTypes.h" #include "JackTypes.h"
#include "JackConstants.h" #include "JackConstants.h"
#include "JackShmMem.h" #include "JackShmMem.h"
#include "JackGlobals.h"


namespace Jack namespace Jack
{ {
@@ -111,6 +112,8 @@ class SERVER_EXPORT JackEngineProfiling


private: private:


JackGlobals* fGlobal;

JackTimingMeasure fProfileTable[TIME_POINTS]; JackTimingMeasure fProfileTable[TIME_POINTS];
JackTimingClientInterval fIntervalTable[MEASURED_CLIENTS]; JackTimingClientInterval fIntervalTable[MEASURED_CLIENTS];


@@ -121,7 +124,7 @@ class SERVER_EXPORT JackEngineProfiling


public: public:


JackEngineProfiling();
JackEngineProfiling(JackGlobals *global);
~JackEngineProfiling(); ~JackEngineProfiling();


void Profile(JackClientInterface** table, void Profile(JackClientInterface** table,


+ 7
- 5
common/JackGenericClientChannel.cpp View File

@@ -25,8 +25,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


JackGenericClientChannel::JackGenericClientChannel()
{}
JackGenericClientChannel::JackGenericClientChannel(JackGlobals *global)
{
fGlobals = global;
}


JackGenericClientChannel::~JackGenericClientChannel() JackGenericClientChannel::~JackGenericClientChannel()
{} {}
@@ -52,8 +54,8 @@ void JackGenericClientChannel::ServerSyncCall(JackRequest* req, JackResult* res,
*result = -1; *result = -1;
return; return;
} }
if (!JackGlobals::fServerRunning) {
if (!fGlobals->fServerRunning) {
jack_error("Server is not running"); jack_error("Server is not running");
*result = -1; *result = -1;
return; return;
@@ -83,7 +85,7 @@ void JackGenericClientChannel::ServerAsyncCall(JackRequest* req, JackResult* res
return; return;
} }
if (!JackGlobals::fServerRunning) {
if (!fGlobals->fServerRunning) {
jack_error("Server is not running"); jack_error("Server is not running");
*result = -1; *result = -1;
return; return;


+ 4
- 1
common/JackGenericClientChannel.h View File

@@ -27,6 +27,7 @@ namespace Jack


struct JackRequest; struct JackRequest;
struct JackResult; struct JackResult;
class JackGlobals;


/*! /*!
\brief Generic JackClientChannel class. \brief Generic JackClientChannel class.
@@ -37,6 +38,8 @@ class JackGenericClientChannel : public detail::JackClientChannelInterface


protected: protected:


JackGlobals *fGlobals;

detail::JackClientRequestInterface* fRequest; detail::JackClientRequestInterface* fRequest;


void ServerSyncCall(JackRequest* req, JackResult* res, int* result); void ServerSyncCall(JackRequest* req, JackResult* res, int* result);
@@ -44,7 +47,7 @@ class JackGenericClientChannel : public detail::JackClientChannelInterface


public: public:


JackGenericClientChannel();
JackGenericClientChannel(JackGlobals *global);
virtual ~JackGenericClientChannel(); virtual ~JackGenericClientChannel();


virtual int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { return -1; } virtual int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* obj, jack_options_t options, jack_status_t* status) { return -1; }


+ 14
- 3
common/JackGlobals.cpp View File

@@ -34,9 +34,8 @@ jack_tls_key JackGlobals::fKeyLogFunction;
static bool fKeyLogFunctionInitialized = jack_tls_allocate_key(&JackGlobals::fKeyLogFunction); static bool fKeyLogFunctionInitialized = jack_tls_allocate_key(&JackGlobals::fKeyLogFunction);


JackMutex* JackGlobals::fOpenMutex = new JackMutex(); JackMutex* JackGlobals::fOpenMutex = new JackMutex();
JackMutex* JackGlobals::fSynchroMutex = new JackMutex();
volatile bool JackGlobals::fServerRunning = false;
JackClient* JackGlobals::fClientTable[CLIENT_NUM] = {};

JackGlobalsManager JackGlobalsManager::fInstance;


#ifndef WIN32 #ifndef WIN32
jack_thread_creator_t JackGlobals::fJackThreadCreator = pthread_create; jack_thread_creator_t JackGlobals::fJackThreadCreator = pthread_create;
@@ -78,4 +77,16 @@ void JackGlobals::CheckContext(const char* name)


#endif #endif


JackGlobals::JackGlobals(const std::string &server_name)
: fServerRunning(false)
, fSynchroMutex(new JackMutex)
, fServerName(server_name)
{
}

JackGlobals::~JackGlobals()
{
delete fSynchroMutex;
}

} // end of namespace } // end of namespace

+ 231
- 17
common/JackGlobals.h View File

@@ -20,9 +20,16 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#ifndef __JackGlobals__ #ifndef __JackGlobals__
#define __JackGlobals__ #define __JackGlobals__


#include <memory>
#include <vector>
#include <string>
#include <algorithm>
#include <mutex>

#include "JackPlatformPlug.h" #include "JackPlatformPlug.h"
#include "JackSystemDeps.h" #include "JackSystemDeps.h"
#include "JackConstants.h" #include "JackConstants.h"
#include "JackError.h"


#ifdef __CLIENTDEBUG__ #ifdef __CLIENTDEBUG__
#include <iostream> #include <iostream>
@@ -33,32 +40,239 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


namespace Jack namespace Jack
{ {
class JackGlobals;
class JackGraphManager;
class JackServer;
struct JackEngineControl;


// Globals used for client management on server or library side. // Globals used for client management on server or library side.
struct JackGlobals {

static jack_tls_key fRealTimeThread;
static jack_tls_key fNotificationThread;
static jack_tls_key fKeyLogFunction;
static JackMutex* fOpenMutex;
static JackMutex* fSynchroMutex;
static volatile bool fServerRunning;
static JackClient* fClientTable[CLIENT_NUM];
static bool fVerbose;
class JackGlobalsManager
{

/* This object is managed by JackGlobalsManager */
private:

static JackGlobalsManager fInstance;

JackGlobalsManager() {}
~JackGlobalsManager() {}

public:

std::vector<JackGlobals*> fContexts;

inline static JackGlobalsManager* Instance()
{
return &fInstance;
}

template <class T>
inline T* CreateGlobal(const std::string &server_name);

inline void DestroyGlobal(const std::string &server_name);

};

// Globals used for client management on server or library side.
class JackGlobals
{

friend class JackGlobalsManager;

protected:

JackGlobals(const std::string &server_name);
virtual ~JackGlobals();

public:

static jack_tls_key fRealTimeThread;
static jack_tls_key fNotificationThread;
static jack_tls_key fKeyLogFunction;
static JackMutex* fOpenMutex;
static bool fVerbose;
#ifndef WIN32 #ifndef WIN32
static jack_thread_creator_t fJackThreadCreator;
static jack_thread_creator_t fJackThreadCreator;
#endif #endif


#ifdef __CLIENTDEBUG__ #ifdef __CLIENTDEBUG__
static std::ofstream* fStream;
static std::ofstream* fStream;
#endif #endif
static void CheckContext(const char* name);
static void CheckContext(const char* name);

volatile bool fServerRunning;
JackMutex* fSynchroMutex;
std::mutex fMutex;
std::string fServerName;
JackClient* fClientTable[CLIENT_NUM];

/* is called each time a context for specific server is added */
virtual bool AddContext(const uint32_t &cntx_num, const std::string &server_name) = 0;

/* is called each time a context for specific server is removed */
virtual bool DelContext(const uint32_t &cntx_num) = 0;

virtual JackGraphManager* GetGraphManager() = 0;
virtual JackEngineControl* GetEngineControl() = 0;
virtual JackSynchro* GetSynchroTable() = 0;
virtual JackServer* GetServer() = 0;

inline static jack_port_id_t PortId(const jack_port_t* port)
{
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t port_masked = (jack_port_id_t)port_aux;
jack_port_id_t port_id = port_masked & ~PORT_SERVER_CONTEXT_MASK;
return port_id;
}

inline static JackGlobals* PortGlobal(const jack_port_t* port)
{
jack_port_id_t context_id = PortContext(port);

if (context_id >= JackGlobalsManager::Instance()->fContexts.size())
{
jack_error("invalid context for port '%p' requested", port);
return nullptr;
}

return JackGlobalsManager::Instance()->fContexts[context_id];
}

inline static jack_port_id_t PortContext(const jack_port_t* port)
{
uintptr_t port_aux = (uintptr_t)port;
jack_port_id_t port_masked = (jack_port_id_t)port_aux;
jack_port_id_t port_context = (port_masked & PORT_SERVER_CONTEXT_MASK) >> PORT_SERVER_CONTEXT_SHIFT;
return port_context;
}

inline jack_port_id_t PortContext()
{
std::vector<JackGlobals*> &contexts = JackGlobalsManager::Instance()->fContexts;

auto it = std::find_if(contexts.begin(), contexts.end(), [this] (JackGlobals* i) {
return (i && i->fServerName.compare(this->fServerName) == 0);
});

if (it == contexts.end()) {
return PORT_SERVER_CONTEXT_MAX;
}

return it - contexts.begin();
}

inline jack_port_t* PortById(const jack_port_id_t &port_id)
{
jack_port_id_t context_id = PortContext();
if (context_id > PORT_SERVER_CONTEXT_MAX) {
return NULL;
}

/* cast to uintptr_t required to avoid [-Wint-to-pointer-cast] warning */
const uintptr_t port = ((context_id << PORT_SERVER_CONTEXT_SHIFT) | port_id);
return (jack_port_t*)port;


}

}; };


// Each "side" server and client will implement this to get the shared graph manager, engine control and inter-process synchro table.
extern SERVER_EXPORT JackGraphManager* GetGraphManager();
extern SERVER_EXPORT JackEngineControl* GetEngineControl();
extern SERVER_EXPORT JackSynchro* GetSynchroTable();
class JackGlobalsInterface
{

private:

JackGlobals *fGlobal;

public:

JackGlobalsInterface(JackGlobals *global = nullptr)
: fGlobal(global)
{

}

~JackGlobalsInterface()
{

}

inline JackGlobals* GetGlobal() const
{
return fGlobal;
}

inline void SetGlobal(JackGlobals *global)
{
fGlobal = global;
}

};

template <class T>
inline T* JackGlobalsManager::CreateGlobal(const std::string &server_name)
{
uint32_t context_num = fContexts.size();

std::vector<JackGlobals*>::iterator it = std::find_if(fContexts.begin(), fContexts.end(), [&server_name] (JackGlobals* i) {
return (i && (i->fServerName.compare(server_name) == 0));
});

T* global = nullptr;

if (it == fContexts.end()) {
global = new T(server_name);
it = std::find(fContexts.begin(), fContexts.end(), nullptr);
if (it == fContexts.end()) {
fContexts.push_back(static_cast<JackGlobals*>(global));
} else {
*it = global;
}
} else {
global = dynamic_cast<T*>(*it);
}

if (global == nullptr) {
return global;
}

bool success = false;
{
std::lock_guard<std::mutex> lock(global->fMutex);
success = global->AddContext(context_num, server_name);
}

if (success == false) {
DestroyGlobal(server_name);
return nullptr;
}

return global;
}

inline void JackGlobalsManager::DestroyGlobal(const std::string &server_name)
{
std::vector<JackGlobals*>::iterator it = std::find_if(fContexts.begin(), fContexts.end(), [&server_name] (JackGlobals* i) {
return (i && (i->fServerName.compare(server_name) == 0));
});

if (it == fContexts.end()) {
return;
}

JackGlobals *global = *it;

{
std::lock_guard<std::mutex> lock(global->fMutex);

if (global->DelContext(fContexts.size()) == false) {
return;
}
}

delete global;
*it = nullptr;
}


} // end of namespace } // end of namespace




+ 6
- 3
common/JackGraphManager.cpp View File

@@ -45,11 +45,12 @@ void JackGraphManager::AssertPort(jack_port_id_t port_index)
} }
} }


JackGraphManager* JackGraphManager::Allocate(int port_max)
JackGraphManager* JackGraphManager::Allocate(int port_max, JackGlobals* global)
{ {
// Using "Placement" new // Using "Placement" new
void* shared_ptr = JackShmMem::operator new(sizeof(JackGraphManager) + port_max * sizeof(JackPort)); void* shared_ptr = JackShmMem::operator new(sizeof(JackGraphManager) + port_max * sizeof(JackPort));
return new(shared_ptr) JackGraphManager(port_max);
JackGraphManager *manager = new(shared_ptr) JackGraphManager(port_max, global);
return manager;
} }


void JackGraphManager::Destroy(JackGraphManager* manager) void JackGraphManager::Destroy(JackGraphManager* manager)
@@ -59,7 +60,7 @@ void JackGraphManager::Destroy(JackGraphManager* manager)
JackShmMem::operator delete(manager); JackShmMem::operator delete(manager);
} }


JackGraphManager::JackGraphManager(int port_max)
JackGraphManager::JackGraphManager(int port_max, JackGlobals *global)
{ {
assert(port_max <= PORT_NUM_MAX); assert(port_max <= PORT_NUM_MAX);


@@ -68,6 +69,8 @@ JackGraphManager::JackGraphManager(int port_max)
} }


fPortMax = port_max; fPortMax = port_max;

ReadCurrentState()->SetGlobal(global);
} }


JackPort* JackGraphManager::GetPort(jack_port_id_t port_index) JackPort* JackGraphManager::GetPort(jack_port_id_t port_index)


+ 4
- 2
common/JackGraphManager.h View File

@@ -32,6 +32,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


class JackGlobals;

/*! /*!
\brief Graph manager: contains the connection manager and the port array. \brief Graph manager: contains the connection manager and the port array.
*/ */
@@ -57,7 +59,7 @@ class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState


public: public:


JackGraphManager(int port_max);
JackGraphManager(int port_max, JackGlobals *global);
~JackGraphManager() ~JackGraphManager()
{} {}


@@ -134,7 +136,7 @@ class SERVER_EXPORT JackGraphManager : public JackShmMem, public JackAtomicState
void Save(JackConnectionManager* dst); void Save(JackConnectionManager* dst);
void Restore(JackConnectionManager* src); void Restore(JackConnectionManager* src);


static JackGraphManager* Allocate(int port_max);
static JackGraphManager* Allocate(int port_max, JackGlobals *global);
static void Destroy(JackGraphManager* manager); static void Destroy(JackGraphManager* manager);


} POST_PACKED_STRUCTURE; } POST_PACKED_STRUCTURE;


+ 8
- 24
common/JackInternalClient.cpp View File

@@ -37,25 +37,9 @@ namespace Jack
JackGraphManager* JackInternalClient::fGraphManager = NULL; JackGraphManager* JackInternalClient::fGraphManager = NULL;
JackEngineControl* JackInternalClient::fEngineControl = NULL; JackEngineControl* JackInternalClient::fEngineControl = NULL;


// Used for external C API (JackAPI.cpp)
SERVER_EXPORT JackGraphManager* GetGraphManager()
JackInternalClient::JackInternalClient(JackServerGlobals *globals): JackClient(globals)
{ {
return JackServerGlobals::fInstance->GetGraphManager();
}

SERVER_EXPORT JackEngineControl* GetEngineControl()
{
return JackServerGlobals::fInstance->GetEngineControl();
}

SERVER_EXPORT JackSynchro* GetSynchroTable()
{
return JackServerGlobals::fInstance->GetSynchroTable();
}

JackInternalClient::JackInternalClient(JackServer* server, JackSynchro* table): JackClient(table)
{
fChannel = new JackInternalClientChannel(server);
fChannel = new JackInternalClientChannel(globals->fInstance);
} }


JackInternalClient::~JackInternalClient() JackInternalClient::~JackInternalClient()
@@ -101,8 +85,8 @@ int JackInternalClient::Open(const char* server_name, const char* name, jack_uui
} }


SetupDriverSync(false); SetupDriverSync(false);
JackGlobals::fClientTable[fClientControl.fRefNum] = this;
JackGlobals::fServerRunning = true;
GetGlobal()->fClientTable[fClientControl.fRefNum] = this;
GetGlobal()->fServerRunning = true;
jack_log("JackInternalClient::Open name = %s refnum = %ld", name_res, fClientControl.fRefNum); jack_log("JackInternalClient::Open name = %s refnum = %ld", name_res, fClientControl.fRefNum);
return 0; return 0;


@@ -193,8 +177,8 @@ int JackLoadableInternalClient2::Init(const char* so_name)
return 0; return 0;
} }


JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, JackSynchro* table, const char* object_data)
: JackLoadableInternalClient(server, table)
JackLoadableInternalClient1::JackLoadableInternalClient1(JackServerGlobals *global, const char* object_data)
: JackLoadableInternalClient(global)
{ {
if (object_data != NULL) if (object_data != NULL)
strncpy(fObjectData, object_data, JACK_LOAD_INIT_LIMIT); strncpy(fObjectData, object_data, JACK_LOAD_INIT_LIMIT);
@@ -202,8 +186,8 @@ JackLoadableInternalClient1::JackLoadableInternalClient1(JackServer* server, Jac
memset(fObjectData, 0, sizeof(fObjectData)); memset(fObjectData, 0, sizeof(fObjectData));
} }


JackLoadableInternalClient2::JackLoadableInternalClient2(JackServer* server, JackSynchro* table, const JSList* parameters)
: JackLoadableInternalClient(server, table)
JackLoadableInternalClient2::JackLoadableInternalClient2(JackServerGlobals *global, const JSList* parameters)
: JackLoadableInternalClient(global)
{ {
fParameters = parameters; fParameters = parameters;
} }


+ 6
- 5
common/JackInternalClient.h View File

@@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


#include "JackClient.h" #include "JackClient.h"
#include "JackClientControl.h" #include "JackClientControl.h"
#include "JackServerGlobals.h"
#include "driver_interface.h" #include "driver_interface.h"


namespace Jack namespace Jack
@@ -43,7 +44,7 @@ class JackInternalClient : public JackClient


public: public:


JackInternalClient(JackServer* server, JackSynchro* table);
JackInternalClient(JackServerGlobals *globals);
virtual ~JackInternalClient(); virtual ~JackInternalClient();


int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status); int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status);
@@ -76,8 +77,8 @@ class JackLoadableInternalClient : public JackInternalClient


public: public:


JackLoadableInternalClient(JackServer* server, JackSynchro* table)
:JackInternalClient(server, table), fHandle(NULL), fFinish(NULL), fDescriptor(NULL)
JackLoadableInternalClient(JackServerGlobals* global)
:JackInternalClient(global), fHandle(NULL), fFinish(NULL), fDescriptor(NULL)
{} {}
virtual ~JackLoadableInternalClient(); virtual ~JackLoadableInternalClient();


@@ -95,7 +96,7 @@ class JackLoadableInternalClient1 : public JackLoadableInternalClient


public: public:


JackLoadableInternalClient1(JackServer* server, JackSynchro* table, const char* object_data);
JackLoadableInternalClient1(JackServerGlobals *global, const char* object_data);
virtual ~JackLoadableInternalClient1() virtual ~JackLoadableInternalClient1()
{} {}


@@ -114,7 +115,7 @@ class JackLoadableInternalClient2 : public JackLoadableInternalClient


public: public:


JackLoadableInternalClient2(JackServer* server, JackSynchro* table, const JSList* parameters);
JackLoadableInternalClient2(JackServerGlobals *global, const JSList* parameters);
virtual ~JackLoadableInternalClient2() virtual ~JackLoadableInternalClient2()
{} {}




+ 88
- 59
common/JackLibAPI.cpp View File

@@ -65,9 +65,6 @@ static jack_client_t * jack_client_open_aux (const char *client_name,
jack_options_t options, jack_options_t options,
jack_status_t *status, va_list ap); jack_status_t *status, va_list ap);


JackLibGlobals* JackLibGlobals::fGlobals = NULL;
int JackLibGlobals::fClientCount = 0;

jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t options, jack_status_t* status) jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t options, jack_status_t* status)
{ {
jack_varargs_t va; /* variable arguments */ jack_varargs_t va; /* variable arguments */
@@ -95,24 +92,28 @@ jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t optio
/* parse variable arguments */ /* parse variable arguments */
jack_varargs_init(&va); jack_varargs_init(&va);


JackLibGlobals::Init(); // jack library initialisation
JackLibGlobals *global = JackGlobalsManager::Instance()->CreateGlobal<JackLibGlobals>(va.server_name);
if (global == nullptr) {
jack_error("jack failed to create global context");
return 0;
}


if (try_start_server(&va, options, status)) { if (try_start_server(&va, options, status)) {
jack_error("jack server is not running or cannot be started"); jack_error("jack server is not running or cannot be started");
JackLibGlobals::Destroy(); // jack library destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name); // jack library destruction
return 0; return 0;
} }


if (JACK_DEBUG) { if (JACK_DEBUG) {
client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode
client = new JackDebugClient(new JackLibClient(global)); // Debug mode
} else { } else {
client = new JackLibClient(GetSynchroTable());
client = new JackLibClient(global);
} }


int res = client->Open(va.server_name, client_name, va.session_id, options, status); int res = client->Open(va.server_name, client_name, va.session_id, options, status);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackLibGlobals::Destroy(); // jack library destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name); // jack library destruction
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
@@ -148,24 +149,28 @@ static jack_client_t* jack_client_open_aux(const char* client_name, jack_options
/* parse variable arguments */ /* parse variable arguments */
jack_varargs_parse(options, ap, &va); jack_varargs_parse(options, ap, &va);


JackLibGlobals::Init(); // jack library initialisation
JackLibGlobals *global = JackGlobalsManager::Instance()->CreateGlobal<JackLibGlobals>(va.server_name);
if (global == nullptr) {
jack_error("jack failed to create global context");
return 0;
}


if (try_start_server(&va, options, status)) { if (try_start_server(&va, options, status)) {
jack_error("jack server is not running or cannot be started"); jack_error("jack server is not running or cannot be started");
JackLibGlobals::Destroy(); // jack library destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name); // jack library destruction
return 0; return 0;
} }


if (JACK_DEBUG) { if (JACK_DEBUG) {
client = new JackDebugClient(new JackLibClient(GetSynchroTable())); // Debug mode
client = new JackDebugClient(new JackLibClient(global)); // Debug mode
} else { } else {
client = new JackLibClient(GetSynchroTable());
client = new JackLibClient(global);
} }


int res = client->Open(va.server_name, client_name, va.session_id, options, status); int res = client->Open(va.server_name, client_name, va.session_id, options, status);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackLibGlobals::Destroy(); // jack library destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name); // jack library destruction
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
@@ -209,8 +214,8 @@ LIB_EXPORT int jack_client_close(jack_client_t* ext_client)
jack_error("jack_client_close called with a NULL client"); jack_error("jack_client_close called with a NULL client");
} else { } else {
res = client->Close(); res = client->Close();
JackGlobalsManager::Instance()->DestroyGlobal(client->GetGlobal()->fServerName); // jack library destruction
delete client; delete client;
JackLibGlobals::Destroy(); // jack library destruction
jack_log("jack_client_close res = %d", res); jack_log("jack_client_close res = %d", res);
} }
JackGlobals::fOpenMutex->Unlock(); JackGlobals::fOpenMutex->Unlock();
@@ -229,93 +234,117 @@ LIB_EXPORT int jack_set_property(jack_client_t* ext_client, jack_uuid_t subject,
{ {
JackGlobals::CheckContext("jack_set_property"); JackGlobals::CheckContext("jack_set_property");


JackClient* client = (JackClient*)ext_client;
jack_log("jack_set_property ext_client %x client %x ", ext_client, client);
if (client == NULL) {
jack_error("jack_set_property called with a NULL client");
return -1;
} else {
JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->SetProperty(client, subject, key, value, type) : -1);
}
jack_error("jack_set_property is not implemented");
return -1;

// JackClient* client = (JackClient*)ext_client;
// jack_log("jack_set_property ext_client %x client %x ", ext_client, client);
// if (client == NULL) {
// jack_error("jack_set_property called with a NULL client");
// return -1;
// } else {
// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->SetProperty(client, subject, key, value, type) : -1);
// }
} }


LIB_EXPORT int jack_get_property(jack_uuid_t subject, const char* key, char** value, char** type) LIB_EXPORT int jack_get_property(jack_uuid_t subject, const char* key, char** value, char** type)
{ {
JackGlobals::CheckContext("jack_get_property"); JackGlobals::CheckContext("jack_get_property");


JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->GetProperty(subject, key, value, type) : -1);
jack_error("jack_get_property is not implemented");
return -1;

// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->GetProperty(subject, key, value, type) : -1);
} }


LIB_EXPORT void jack_free_description(jack_description_t* desc, int free_actual_description_too) LIB_EXPORT void jack_free_description(jack_description_t* desc, int free_actual_description_too)
{ {
JackGlobals::CheckContext("jack_free_description"); JackGlobals::CheckContext("jack_free_description");


JackMetadata* metadata = GetMetadata();
if (metadata)
metadata->FreeDescription(desc, free_actual_description_too);
jack_error("jack_free_description is not implemented");
return;

// JackMetadata* metadata = GetMetadata();
// if (metadata)
// metadata->FreeDescription(desc, free_actual_description_too);
} }


LIB_EXPORT int jack_get_properties(jack_uuid_t subject, jack_description_t* desc) LIB_EXPORT int jack_get_properties(jack_uuid_t subject, jack_description_t* desc)
{ {
JackGlobals::CheckContext("jack_get_properties"); JackGlobals::CheckContext("jack_get_properties");


JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->GetProperties(subject, desc) : -1);
jack_error("jack_get_properties is not implemented");
return -1;

// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->GetProperties(subject, desc) : -1);
} }


LIB_EXPORT int jack_get_all_properties(jack_description_t** descriptions) LIB_EXPORT int jack_get_all_properties(jack_description_t** descriptions)
{ {
JackGlobals::CheckContext("jack_get_all_properties"); JackGlobals::CheckContext("jack_get_all_properties");


JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->GetAllProperties(descriptions) : -1);
jack_error("jack_get_all_properties is not implemented");
return -1;

// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->GetAllProperties(descriptions) : -1);
} }


LIB_EXPORT int jack_remove_property(jack_client_t* ext_client, jack_uuid_t subject, const char* key) LIB_EXPORT int jack_remove_property(jack_client_t* ext_client, jack_uuid_t subject, const char* key)
{ {
JackGlobals::CheckContext("jack_remove_property"); JackGlobals::CheckContext("jack_remove_property");


JackClient* client = (JackClient*)ext_client;
jack_log("jack_remove_property ext_client %x client %x ", ext_client, client);
if (client == NULL) {
jack_error("jack_remove_property called with a NULL client");
return -1;
} else {
JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->RemoveProperty(client, subject, key) : -1);
}
jack_error("jack_remove_property is not implemented");
return -1;

// JackClient* client = (JackClient*)ext_client;
// jack_log("jack_remove_property ext_client %x client %x ", ext_client, client);
// if (client == NULL) {
// jack_error("jack_remove_property called with a NULL client");
// return -1;
// } else {
// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->RemoveProperty(client, subject, key) : -1);
// }
} }


LIB_EXPORT int jack_remove_properties(jack_client_t* ext_client, jack_uuid_t subject) LIB_EXPORT int jack_remove_properties(jack_client_t* ext_client, jack_uuid_t subject)
{ {
JackGlobals::CheckContext("jack_remove_properties"); JackGlobals::CheckContext("jack_remove_properties");


JackClient* client = (JackClient*)ext_client;
jack_log("jack_remove_properties ext_client %x client %x ", ext_client, client);
if (client == NULL) {
jack_error("jack_remove_properties called with a NULL client");
return -1;
} else {
JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->RemoveProperties(client, subject) : -1);
}
jack_error("jack_remove_properties is not implemented");
return -1;

// JackClient* client = (JackClient*)ext_client;
// jack_log("jack_remove_properties ext_client %x client %x ", ext_client, client);
// if (client == NULL) {
// jack_error("jack_remove_properties called with a NULL client");
// return -1;
// } else {
// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->RemoveProperties(client, subject) : -1);
// }
} }


LIB_EXPORT int jack_remove_all_properties(jack_client_t* ext_client) LIB_EXPORT int jack_remove_all_properties(jack_client_t* ext_client)
{ {
JackGlobals::CheckContext("jack_remove_all_properties"); JackGlobals::CheckContext("jack_remove_all_properties");


JackClient* client = (JackClient*)ext_client;
jack_log("jack_remove_all_properties ext_client %x client %x ", ext_client, client);
if (client == NULL) {
jack_error("jack_remove_all_properties called with a NULL client");
return -1;
} else {
JackMetadata* metadata = GetMetadata();
return (metadata ? metadata->RemoveAllProperties(client) : -1);
}
jack_error("jack_remove_all_properties is not implemented");
return -1;

// JackClient* client = (JackClient*)ext_client;
// jack_log("jack_remove_all_properties ext_client %x client %x ", ext_client, client);
// if (client == NULL) {
// jack_error("jack_remove_all_properties called with a NULL client");
// return -1;
// } else {
// JackMetadata* metadata = GetMetadata();
// return (metadata ? metadata->RemoveAllProperties(client) : -1);
// }
} }


LIB_EXPORT int jack_set_property_change_callback(jack_client_t* ext_client, JackPropertyChangeCallback callback, void* arg) LIB_EXPORT int jack_set_property_change_callback(jack_client_t* ext_client, JackPropertyChangeCallback callback, void* arg)


+ 19
- 51
common/JackLibClient.cpp View File

@@ -27,40 +27,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


// Used for external C API (JackAPI.cpp)
JackGraphManager* GetGraphManager()
{
if (JackLibGlobals::fGlobals) {
return JackLibGlobals::fGlobals->fGraphManager;
} else {
return NULL;
}
}

JackEngineControl* GetEngineControl()
{
if (JackLibGlobals::fGlobals) {
return JackLibGlobals::fGlobals->fEngineControl;
} else {
return NULL;
}
}

JackSynchro* GetSynchroTable()
{
return (JackLibGlobals::fGlobals ? JackLibGlobals::fGlobals->fSynchroTable : 0);
}

// Used for client-side Metadata API (JackLibAPI.cpp)
JackMetadata* GetMetadata()
{
if (JackLibGlobals::fGlobals) {
return JackLibGlobals::fGlobals->fMetadata;
} else {
return NULL;
}
}

//------------------- //-------------------
// Client management // Client management
//------------------- //-------------------
@@ -75,14 +41,14 @@ ShutDown is called:
void JackLibClient::ShutDown(jack_status_t code, const char* message) void JackLibClient::ShutDown(jack_status_t code, const char* message)
{ {
jack_log("JackLibClient::ShutDown"); jack_log("JackLibClient::ShutDown");
JackGlobals::fServerRunning = false;
GetGlobal()->fServerRunning = false;
JackClient::ShutDown(code, message); JackClient::ShutDown(code, message);
} }


JackLibClient::JackLibClient(JackSynchro* table): JackClient(table)
JackLibClient::JackLibClient(JackGlobals* global): JackClient(global)
{ {
jack_log("JackLibClient::JackLibClient table = %x", table);
fChannel = new JackClientChannel();
jack_log("JackLibClient::JackLibClient table = %x", global->GetSynchroTable());
fChannel = new JackClientChannel(global);
} }


JackLibClient::~JackLibClient() JackLibClient::~JackLibClient()
@@ -129,8 +95,10 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_uuid_t u


try { try {
// Map shared memory segments // Map shared memory segments
JackLibGlobals::fGlobals->fEngineControl.SetShmIndex(shared_engine, fServerName);
JackLibGlobals::fGlobals->fGraphManager.SetShmIndex(shared_graph, fServerName);
JackLibGlobals *lib_globals = dynamic_cast<Jack::JackLibGlobals*>(GetGlobal());
assert(lib_globals);
lib_globals->fEngineControl.SetShmIndex(shared_engine, fServerName);
lib_globals->fGraphManager.SetShmIndex(shared_graph, fServerName);
fClientControl.SetShmIndex(shared_client, fServerName); fClientControl.SetShmIndex(shared_client, fServerName);
JackGlobals::fVerbose = GetEngineControl()->fVerbose; JackGlobals::fVerbose = GetEngineControl()->fVerbose;
} catch (...) { } catch (...) {
@@ -141,16 +109,16 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_uuid_t u
SetupDriverSync(false); SetupDriverSync(false);


// Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process // Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process
assert(JackGlobals::fSynchroMutex);
JackGlobals::fSynchroMutex->Lock();
assert(GetGlobal()->fSynchroMutex);
GetGlobal()->fSynchroMutex->Lock();
res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName); res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName);
JackGlobals::fSynchroMutex->Unlock();
GetGlobal()->fSynchroMutex->Unlock();
if (!res) { if (!res) {
jack_error("Cannot ConnectSemaphore %s client", name_res); jack_error("Cannot ConnectSemaphore %s client", name_res);
goto error; goto error;
} }


JackGlobals::fClientTable[GetClientControl()->fRefNum] = this;
GetGlobal()->fClientTable[GetClientControl()->fRefNum] = this;
SetClockSource(GetEngineControl()->fClockSource); SetClockSource(GetEngineControl()->fClockSource);
jack_log("JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum); jack_log("JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum);
return 0; return 0;
@@ -167,8 +135,8 @@ error:
int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2) int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2)
{ {
int res = 0; int res = 0;
assert(JackGlobals::fSynchroMutex);
JackGlobals::fSynchroMutex->Lock();
assert(GetGlobal()->fSynchroMutex);
GetGlobal()->fSynchroMutex->Lock();


// Done all time // Done all time
switch (notify) { switch (notify) {
@@ -187,20 +155,20 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int
break; break;
} }


JackGlobals::fSynchroMutex->Unlock();
GetGlobal()->fSynchroMutex->Unlock();
return res; return res;
} }


JackGraphManager* JackLibClient::GetGraphManager() const JackGraphManager* JackLibClient::GetGraphManager() const
{ {
assert(JackLibGlobals::fGlobals->fGraphManager);
return JackLibGlobals::fGlobals->fGraphManager;
assert(GetGlobal()->GetGraphManager());
return GetGlobal()->GetGraphManager();
} }


JackEngineControl* JackLibClient::GetEngineControl() const JackEngineControl* JackLibClient::GetEngineControl() const
{ {
assert(JackLibGlobals::fGlobals->fEngineControl);
return JackLibGlobals::fGlobals->fEngineControl;
assert(GetGlobal()->GetEngineControl());
return GetGlobal()->GetEngineControl();
} }


JackClientControl* JackLibClient::GetClientControl() const JackClientControl* JackLibClient::GetClientControl() const


+ 1
- 4
common/JackLibClient.h View File

@@ -41,7 +41,7 @@ class JackLibClient : public JackClient


public: public:


JackLibClient(JackSynchro* table);
JackLibClient(JackGlobals* global);
virtual ~JackLibClient(); virtual ~JackLibClient();


int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status); int Open(const char* server_name, const char* name, jack_uuid_t uuid, jack_options_t options, jack_status_t* status);
@@ -54,9 +54,6 @@ class JackLibClient : public JackClient
JackClientControl* GetClientControl() const; JackClientControl* GetClientControl() const;
}; };


// Used for client-side Metadata API (JackLibAPI.cpp)
JackMetadata* GetMetadata();

} // end of namespace } // end of namespace


#endif #endif


+ 105
- 75
common/JackLibGlobals.h View File

@@ -50,96 +50,126 @@ class JackClient;
\brief Global library static structure: singleton kind of pattern. \brief Global library static structure: singleton kind of pattern.
*/ */


struct JackLibGlobals
class JackLibGlobals : public JackGlobals
{ {
JackShmReadWritePtr<JackGraphManager> fGraphManager; /*! Shared memory Port manager */
JackShmReadWritePtr<JackEngineControl> fEngineControl; /*! Shared engine control */ // transport engine has to be writable
JackSynchro fSynchroTable[CLIENT_NUM]; /*! Shared synchro table */
JackMetadata *fMetadata; /*! Shared metadata base */
sigset_t fProcessSignals;

static int fClientCount;
static JackLibGlobals* fGlobals;

JackLibGlobals()
{
jack_log("JackLibGlobals");
if (!JackMessageBuffer::Create()) {
jack_error("Cannot create message buffer");
}
fGraphManager = -1;
fEngineControl = -1;

fMetadata = new JackMetadata(false);

// Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server.
#ifdef WIN32
// TODO
#else
sigset_t signals;
sigemptyset(&signals);
sigaddset(&signals, SIGPIPE);
sigprocmask(SIG_BLOCK, &signals, &fProcessSignals);
#endif
}

~JackLibGlobals()
{
jack_log("~JackLibGlobals");
for (int i = 0; i < CLIENT_NUM; i++) {
fSynchroTable[i].Disconnect();
}
JackMessageBuffer::Destroy();


delete fMetadata;
fMetadata = NULL;
/* This object is managed by JackGlobalsManager */
friend class JackGlobalsManager;


// Restore old signal mask
#ifdef WIN32
// TODO
#else
sigprocmask(SIG_BLOCK, &fProcessSignals, 0);
#endif
}
private:


static void Init()
{
if (!JackGlobals::fServerRunning && fClientCount > 0) {
/* is called when first context for specific server is created */
JackLibGlobals(const std::string &server_name)
: JackGlobals(server_name)
, fMetadata(server_name.c_str())
{
fGraphManager = -1;
fEngineControl = -1;
fClientCount = 0;

InitTime();
}

/* is called when last context for specific server is removed */
~JackLibGlobals() override
{
EndTime();


// Cleanup remaining clients
jack_error("Jack server was closed but clients are still allocated, cleanup...");
for (int i = 0; i < CLIENT_NUM; i++) { for (int i = 0; i < CLIENT_NUM; i++) {
JackClient* client = JackGlobals::fClientTable[i];
if (client) {
jack_error("Cleanup client ref = %d", i);
client->Close();
delete client;
fSynchroTable[i].Disconnect();
}
}

public:

JackShmReadWritePtr<JackGraphManager> fGraphManager; /*! Shared memory Port manager */
JackShmReadWritePtr<JackEngineControl> fEngineControl; /*! Shared engine control */ // transport engine has to be writable
JackSynchro fSynchroTable[CLIENT_NUM]; /*! Shared synchro table */
JackMetadata fMetadata; /*! Shared metadata base */
sigset_t fProcessSignals;

int fClientCount;

/* is called each time a context for specific server is added */
bool AddContext(const uint32_t &context_num, const std::string &server_name) override
{
if (!fServerRunning && fClientCount > 0) {
// Cleanup remaining clients
jack_error("Jack server was closed but clients are still allocated, cleanup...");
for (int i = 0; i < CLIENT_NUM; i++) {
JackClient* client = fClientTable[i];
if (client) {
jack_error("Cleanup client ref = %d", i);
client->Close();
delete client;
}
} }

// run destructors for all included objects, keeping the behaviour to previous revisions of JackGlobals source
this->~JackLibGlobals();
// construct in place
new(this) JackLibGlobals(server_name);
} }


// Cleanup global context
fClientCount = 0;
delete fGlobals;
fGlobals = NULL;
fClientCount++;

if (context_num == 0 && !JackMessageBuffer::Create()) {
jack_error("Cannot create message buffer");
}

// Filter SIGPIPE to avoid having client get a SIGPIPE when trying to access a died server.
#ifdef WIN32
// TODO
#else
sigset_t signals;
sigemptyset(&signals);
sigaddset(&signals, SIGPIPE);
sigprocmask(SIG_BLOCK, &signals, &fProcessSignals);
#endif
return true;
} }


if (fClientCount++ == 0 && !fGlobals) {
jack_log("JackLibGlobals Init %x", fGlobals);
InitTime();
fGlobals = new JackLibGlobals();
/* is called each time a context for specific server is removed */
bool DelContext(const uint32_t &context_num) override
{
#ifdef WIN32
// TODO
#else
sigprocmask(SIG_BLOCK, &fProcessSignals, nullptr);
#endif
if (context_num == 0 && !JackMessageBuffer::Destroy()) {
jack_error("Cannot destroy message buffer");
}

return --fClientCount == 0;
} }
}


static void Destroy()
{
if (--fClientCount == 0 && fGlobals) {
jack_log("JackLibGlobals Destroy %x", fGlobals);
EndTime();
delete fGlobals;
fGlobals = NULL;
JackGraphManager *GetGraphManager() override
{
return fGraphManager;
}

JackEngineControl *GetEngineControl() override
{
return fEngineControl;
}

JackSynchro *GetSynchroTable() override
{
return fSynchroTable;
}

/* must not be used in JackLibGlobals */
JackServer *GetServer() override
{
assert(false);
return nullptr;
} }
}


JackMetadata* GetMetadata()
{
return &fMetadata;
}
}; };


} // end of namespace } // end of namespace


+ 2
- 1
common/JackMidiPort.cpp View File

@@ -146,8 +146,9 @@ static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count
mix->lost_events += event_count - events_done; mix->lost_events += event_count - events_done;
} }


static size_t MidiBufferSize()
static size_t MidiBufferSize(JackGlobals *global)
{ {
(void)(global);
return BUFFER_SIZE_MAX * sizeof(jack_default_audio_sample_t); return BUFFER_SIZE_MAX * sizeof(jack_default_audio_sample_t);
} }




+ 22
- 14
common/JackMidiUtil.cpp View File

@@ -55,26 +55,32 @@ Jack::ApplyRunningStatus(jack_midi_event_t *event,
jack_nframes_t jack_nframes_t
Jack::GetCurrentFrame() Jack::GetCurrentFrame()
{ {
jack_time_t time = GetMicroSeconds();
JackEngineControl *control = GetEngineControl();
JackTimer timer;
control->ReadFrameTime(&timer);
return timer.Time2Frames(time, control->fBufferSize);
jack_error("Jack::GetCurrentFrame is not implemented");
abort();
// jack_time_t time = GetMicroSeconds();
// JackEngineControl *control = GetEngineControl();
// JackTimer timer;
// control->ReadFrameTime(&timer);
// return timer.Time2Frames(time, control->fBufferSize);
} }


jack_nframes_t jack_nframes_t
Jack::GetFramesFromTime(jack_time_t time) Jack::GetFramesFromTime(jack_time_t time)
{ {
JackEngineControl* control = GetEngineControl();
JackTimer timer;
control->ReadFrameTime(&timer);
return timer.Time2Frames(time, control->fBufferSize);
jack_error("Jack::GetFramesFromTime is not implemented");
abort();
// JackEngineControl* control = GetEngineControl();
// JackTimer timer;
// control->ReadFrameTime(&timer);
// return timer.Time2Frames(time, control->fBufferSize);
} }


jack_nframes_t jack_nframes_t
Jack::GetLastFrame() Jack::GetLastFrame()
{ {
return GetEngineControl()->fFrameTimer.ReadCurrentState()->CurFrame();
jack_error("Jack::GetLastFrame is not implemented");
abort();
// return GetEngineControl()->fFrameTimer.ReadCurrentState()->CurFrame();
} }


int int
@@ -114,8 +120,10 @@ Jack::GetMessageLength(jack_midi_data_t status_byte)
jack_time_t jack_time_t
Jack::GetTimeFromFrames(jack_nframes_t frames) Jack::GetTimeFromFrames(jack_nframes_t frames)
{ {
JackEngineControl* control = GetEngineControl();
JackTimer timer;
control->ReadFrameTime(&timer);
return timer.Frames2Time(frames, control->fBufferSize);
jack_error("Jack::GetTimeFromFrames is not implemented");
abort();
// JackEngineControl* control = GetEngineControl();
// JackTimer timer;
// control->ReadFrameTime(&timer);
// return timer.Frames2Time(frames, control->fBufferSize);
} }

+ 4
- 2
common/JackNetAdapter.cpp View File

@@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackServerGlobals.h" #include "JackServerGlobals.h"
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackArgParser.h" #include "JackArgParser.h"
#include "JackClient.h"
#include <assert.h> #include <assert.h>


namespace Jack namespace Jack
@@ -245,9 +246,10 @@ namespace Jack
SetAdaptedSampleRate(fParams.fSampleRate); SetAdaptedSampleRate(fParams.fSampleRate);


// Will do "something" on OSX only... // Will do "something" on OSX only...
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
JackEngineControl *control = ((JackClient*)fClient)->GetGlobal()->GetEngineControl();
fThread.SetParams(control->fPeriod, control->fComputation, control->fConstraint);


if (fThread.AcquireSelfRealTime(GetEngineControl()->fClientPriority) < 0) {
if (fThread.AcquireSelfRealTime(control->fClientPriority) < 0) {
jack_error("AcquireSelfRealTime error"); jack_error("AcquireSelfRealTime error");
} else { } else {
set_threaded_log_function(); set_threaded_log_function();


+ 1
- 1
common/JackPortType.cpp View File

@@ -30,7 +30,7 @@ static const JackPortType* gPortTypes[] =
&gMidiPortType, &gMidiPortType,
}; };


jack_port_type_id_t PORT_TYPES_MAX = sizeof(gPortTypes) / sizeof(gPortTypes[0]);
const jack_port_type_id_t PORT_TYPES_MAX = sizeof(gPortTypes) / sizeof(gPortTypes[0]);


jack_port_type_id_t GetPortTypeId(const char* port_type) jack_port_type_id_t GetPortTypeId(const char* port_type)
{ {


+ 4
- 2
common/JackPortType.h View File

@@ -27,12 +27,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


extern jack_port_type_id_t PORT_TYPES_MAX;
class JackGlobals;

extern const jack_port_type_id_t PORT_TYPES_MAX;


struct JackPortType struct JackPortType
{ {
const char* fName; const char* fName;
size_t (*size)();
size_t (*size)(JackGlobals *global);
void (*init)(void* buffer, size_t buffer_size, jack_nframes_t nframes); void (*init)(void* buffer, size_t buffer_size, jack_nframes_t nframes);
void (*mixdown)(void *mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes); void (*mixdown)(void *mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes);
}; };


+ 7
- 5
common/JackServer.cpp View File

@@ -43,7 +43,8 @@ namespace Jack
//---------------- //----------------
// Server control // Server control
//---------------- //----------------
JackServer::JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, char self_connect_mode, const char* server_name)
JackServer::JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, char self_connect_mode, const char* server_name, JackServerGlobals *global)
: fGlobal(global)
{ {
if (rt) { if (rt) {
jack_info("JACK server starting in realtime mode with priority %ld", priority); jack_info("JACK server starting in realtime mode with priority %ld", priority);
@@ -53,8 +54,9 @@ JackServer::JackServer(bool sync, bool temporary, int timeout, bool rt, int prio


jack_info("self-connect-mode is \"%s\"", jack_get_self_connect_mode_description(self_connect_mode)); jack_info("self-connect-mode is \"%s\"", jack_get_self_connect_mode_description(self_connect_mode));


fGraphManager = JackGraphManager::Allocate(port_max);
fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, clock, server_name);
fConnectionState.SetGlobal(global);
fGraphManager = JackGraphManager::Allocate(port_max, global);
fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, clock, server_name, global);
fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl, self_connect_mode); fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl, self_connect_mode);


// A distinction is made between the threaded freewheel driver and the // A distinction is made between the threaded freewheel driver and the
@@ -196,14 +198,14 @@ bool JackServer::IsRunning()


int JackServer::InternalClientLoad1(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, jack_uuid_t uuid, int* status) int JackServer::InternalClientLoad1(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, jack_uuid_t uuid, int* status)
{ {
JackLoadableInternalClient* client = new JackLoadableInternalClient1(JackServerGlobals::fInstance, GetSynchroTable(), objet_data);
JackLoadableInternalClient* client = new JackLoadableInternalClient1(fGlobal, objet_data);
assert(client); assert(client);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, uuid, status); return InternalClientLoadAux(client, so_name, client_name, options, int_ref, uuid, status);
} }


int JackServer::InternalClientLoad2(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, jack_uuid_t uuid, int* status) int JackServer::InternalClientLoad2(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, jack_uuid_t uuid, int* status)
{ {
JackLoadableInternalClient* client = new JackLoadableInternalClient2(JackServerGlobals::fInstance, GetSynchroTable(), parameters);
JackLoadableInternalClient* client = new JackLoadableInternalClient2(fGlobal, parameters);
assert(client); assert(client);
return InternalClientLoadAux(client, so_name, client_name, options, int_ref, uuid, status); return InternalClientLoadAux(client, so_name, client_name, options, int_ref, uuid, status);
} }


+ 4
- 2
common/JackServer.h View File

@@ -26,7 +26,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackDriverLoader.h" #include "JackDriverLoader.h"
#include "JackDriverInfo.h" #include "JackDriverInfo.h"
#include "JackConnectionManager.h" #include "JackConnectionManager.h"
#include "JackGlobals.h"
#include "JackPlatformPlug.h" #include "JackPlatformPlug.h"
#include "jslist.h" #include "jslist.h"


@@ -38,6 +37,7 @@ class JackDriverClientInterface;
struct JackEngineControl; struct JackEngineControl;
class JackLockedEngine; class JackLockedEngine;
class JackLoadableInternalClient; class JackLoadableInternalClient;
class JackServerGlobals;


/*! /*!
\brief The Jack server. \brief The Jack server.
@@ -60,11 +60,13 @@ class SERVER_EXPORT JackServer
JackSynchro fSynchroTable[CLIENT_NUM]; JackSynchro fSynchroTable[CLIENT_NUM];
bool fFreewheel; bool fFreewheel;


JackServerGlobals *fGlobal;

int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, jack_uuid_t uuid, int* status); int InternalClientLoadAux(JackLoadableInternalClient* client, const char* so_name, const char* client_name, int options, int* int_ref, jack_uuid_t uuid, int* status);


public: public:


JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, char self_connect_mode, const char* server_name);
JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, char self_connect_mode, const char* server_name, JackServerGlobals* global);
~JackServer(); ~JackServer();


// Server control // Server control


+ 27
- 9
common/JackServerAPI.cpp View File

@@ -74,22 +74,32 @@ jack_client_t* jack_client_new_aux(const char* client_name, jack_options_t optio
/* parse variable arguments */ /* parse variable arguments */
jack_varargs_init(&va); jack_varargs_init(&va);


if (!JackServerGlobals::Init()) { // jack server initialisation
// jack server init and start
JackServerGlobals *global = JackGlobalsManager::Instance()->CreateGlobal<JackServerGlobals>(va.server_name);
if (global == nullptr) {
int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1;
return NULL;
}

if (!global->Init()) {
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name);
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
} }


if (JACK_DEBUG) { if (JACK_DEBUG) {
client = new JackDebugClient(new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable())); // Debug mode
client = new JackDebugClient(new JackInternalClient(global)); // Debug mode
} else { } else {
client = new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable());
client = new JackInternalClient(global);
} }


int res = client->Open(va.server_name, client_name, va.session_id, options, status); int res = client->Open(va.server_name, client_name, va.session_id, options, status);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackServerGlobals::Destroy(); // jack server destruction
// jack server stop and destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name);
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
@@ -125,22 +135,30 @@ jack_client_t* jack_client_open_aux(const char* client_name, jack_options_t opti
/* parse variable arguments */ /* parse variable arguments */
jack_varargs_parse(options, ap, &va); jack_varargs_parse(options, ap, &va);


if (!JackServerGlobals::Init()) { // jack server initialisation
JackServerGlobals *global = JackGlobalsManager::Instance()->CreateGlobal<JackServerGlobals>(va.server_name);
if (global == nullptr) {
int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1;
return NULL;
}

if (!global->Init()) {
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name);
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
} }


if (JACK_DEBUG) { if (JACK_DEBUG) {
client = new JackDebugClient(new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable())); // Debug mode
client = new JackDebugClient(new JackInternalClient(global)); // Debug mode
} else { } else {
client = new JackInternalClient(JackServerGlobals::fInstance, GetSynchroTable());
client = new JackInternalClient(global);
} }


int res = client->Open(va.server_name, client_name, va.session_id, options, status); int res = client->Open(va.server_name, client_name, va.session_id, options, status);
if (res < 0) { if (res < 0) {
delete client; delete client;
JackServerGlobals::Destroy(); // jack server destruction
JackGlobalsManager::Instance()->DestroyGlobal(va.server_name);
int my_status1 = (JackFailure | JackServerError); int my_status1 = (JackFailure | JackServerError);
*status = (jack_status_t)my_status1; *status = (jack_status_t)my_status1;
return NULL; return NULL;
@@ -184,8 +202,8 @@ SERVER_EXPORT int jack_client_close(jack_client_t* ext_client)
jack_error("jack_client_close called with a NULL client"); jack_error("jack_client_close called with a NULL client");
} else { } else {
res = client->Close(); res = client->Close();
JackGlobalsManager::Instance()->DestroyGlobal(client->GetGlobal()->fServerName);
delete client; delete client;
JackServerGlobals::Destroy(); // jack server destruction
jack_log("jack_client_close res = %d", res); jack_log("jack_client_close res = %d", res);
} }
JackGlobals::fOpenMutex->Unlock(); JackGlobals::fOpenMutex->Unlock();


+ 27
- 6
common/JackServerGlobals.cpp View File

@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackServerGlobals.h" #include "JackServerGlobals.h"
#include "JackLockedEngine.h" #include "JackLockedEngine.h"
#include "JackTools.h" #include "JackTools.h"
#include "JackServer.h"
#include "shm.h" #include "shm.h"
#include <getopt.h> #include <getopt.h>
#include <errno.h> #include <errno.h>
@@ -52,7 +53,7 @@ int JackServerGlobals::Start(const char* server_name,
char self_connect_mode) char self_connect_mode)
{ {
jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose); jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose);
new JackServer(sync, temporary, time_out_ms, rt, priority, port_max, verbose, clock, self_connect_mode, server_name); // Will setup fInstance and fUserCount globals
new JackServer(sync, temporary, time_out_ms, rt, priority, port_max, verbose, clock, self_connect_mode, server_name, this); // Will setup fInstance and fUserCount globals
int res = fInstance->Open(driver_desc, driver_params); int res = fInstance->Open(driver_desc, driver_params);
return (res < 0) ? res : fInstance->Start(); return (res < 0) ? res : fInstance->Start();
} }
@@ -64,7 +65,7 @@ void JackServerGlobals::Stop()
fInstance->Close(); fInstance->Close();
} }


void JackServerGlobals::Delete()
void JackServerGlobals::Destroy()
{ {
jack_log("Jackdmp: delete server"); jack_log("Jackdmp: delete server");


@@ -351,7 +352,7 @@ bool JackServerGlobals::Init()
int res = Start(server_name, driver_desc, master_driver_params, sync, temporary, client_timeout, realtime, realtime_priority, port_max, verbose_aux, clock_source, JACK_DEFAULT_SELF_CONNECT_MODE); int res = Start(server_name, driver_desc, master_driver_params, sync, temporary, client_timeout, realtime, realtime_priority, port_max, verbose_aux, clock_source, JACK_DEFAULT_SELF_CONNECT_MODE);
if (res < 0) { if (res < 0) {
jack_error("Cannot start server... exit"); jack_error("Cannot start server... exit");
Delete();
Destroy();
jack_cleanup_shm(); jack_cleanup_shm();
JackTools::CleanupFiles(server_name); JackTools::CleanupFiles(server_name);
jack_unregister_server(server_name); jack_unregister_server(server_name);
@@ -400,22 +401,42 @@ error:
if (master_driver_params) { if (master_driver_params) {
jack_free_driver_params(master_driver_params); jack_free_driver_params(master_driver_params);
} }
Destroy();
Deinit();
return false; return false;
} }


void JackServerGlobals::Destroy()
void JackServerGlobals::Deinit()
{ {
if (--fUserCount == 0) { if (--fUserCount == 0) {
jack_log("JackServerGlobals Destroy"); jack_log("JackServerGlobals Destroy");
Stop(); Stop();
Delete();
Destroy();
jack_cleanup_shm(); jack_cleanup_shm();
JackTools::CleanupFiles(server_name); JackTools::CleanupFiles(server_name);
jack_unregister_server(server_name); jack_unregister_server(server_name);
} }
} }


JackGraphManager *JackServerGlobals::GetGraphManager()
{
return fInstance->GetGraphManager();
}

JackEngineControl *JackServerGlobals::GetEngineControl()
{
return fInstance->GetEngineControl();
}

JackSynchro *JackServerGlobals::GetSynchroTable()
{
return fInstance->GetSynchroTable();
}

JackServer *JackServerGlobals::GetServer()
{
return fInstance;
}

} // end of namespace } // end of namespace





+ 54
- 29
common/JackServerGlobals.h View File

@@ -24,6 +24,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackDriverLoader.h" #include "JackDriverLoader.h"
#include "JackCompilerDeps.h" #include "JackCompilerDeps.h"
#include "JackServer.h" #include "JackServer.h"
#include "JackGlobals.h"
#include <map> #include <map>


namespace Jack namespace Jack
@@ -35,36 +36,60 @@ class JackClient;
\brief Global server static structure: singleton kind of pattern. \brief Global server static structure: singleton kind of pattern.
*/ */


struct SERVER_EXPORT JackServerGlobals
class SERVER_EXPORT JackServerGlobals : public JackGlobals
{ {
static JackServer* fInstance;
static unsigned int fUserCount;
static std::map<std::string, JackDriverInfo*> fSlavesList;
static std::map<std::string, int> fInternalsList;

static bool (* on_device_acquire)(const char* device_name);
static void (* on_device_release)(const char* device_name);
static void (* on_device_reservation_loop)(void);

JackServerGlobals();
~JackServerGlobals();

static bool Init();
static void Destroy();
static int Start(const char* server_name,
jack_driver_desc_t* driver_desc,
JSList* driver_params,
int sync,
int temporary,
int time_out_ms,
int rt,
int priority,
int port_max,
int verbose,
jack_timer_type_t clock,
char self_connect_mode);
static void Stop();
static void Delete();

/* This object is managed by JackGlobalsManager */
friend class JackGlobalsManager;

private:

JackServerGlobals(const std::string &server_name) : JackGlobals(server_name) {}
~JackServerGlobals() override {}

public:

static JackServer* fInstance;
static unsigned int fUserCount;
static std::map<std::string, JackDriverInfo*> fSlavesList;
static std::map<std::string, int> fInternalsList;

static bool (* on_device_acquire)(const char* device_name);
static void (* on_device_release)(const char* device_name);
static void (* on_device_reservation_loop)(void);

bool Init();
void Deinit();
int Start(const char* server_name,
jack_driver_desc_t* driver_desc,
JSList* driver_params,
int sync,
int temporary,
int time_out_ms,
int rt,
int priority,
int port_max,
int verbose,
jack_timer_type_t clock,
char self_connect_mode);
void Stop();
void Destroy();

bool AddContext(const uint32_t &context_num, const std::string &server_name) override
{
return true;
}

bool DelContext(const uint32_t &context_num) override
{
return true;
}

JackGraphManager* GetGraphManager() override;
JackEngineControl* GetEngineControl() override;
JackSynchro* GetSynchroTable() override;
JackServer* GetServer() override;

}; };


} // end of namespace } // end of namespace


+ 4
- 4
common/JackThreadedDriver.cpp View File

@@ -259,10 +259,10 @@ void JackThreadedDriver::SetRealTime()
if (fDriver->IsRealTime()) { if (fDriver->IsRealTime()) {
jack_log("JackThreadedDriver::Init real-time"); jack_log("JackThreadedDriver::Init real-time");
// Will do "something" on OSX only... // Will do "something" on OSX only...
GetEngineControl()->fPeriod = GetEngineControl()->fConstraint = GetEngineControl()->fPeriodUsecs * 1000;
GetEngineControl()->fComputation = JackTools::ComputationMicroSec(GetEngineControl()->fBufferSize) * 1000;
fThread.SetParams(GetEngineControl()->fPeriod, GetEngineControl()->fComputation, GetEngineControl()->fConstraint);
if (fThread.AcquireSelfRealTime(GetEngineControl()->fServerPriority) < 0) {
fDriver->fEngineControl->fPeriod = fDriver->fEngineControl->fConstraint = fDriver->fEngineControl->fPeriodUsecs * 1000;
fDriver->fEngineControl->fComputation = JackTools::ComputationMicroSec(fDriver->fEngineControl->fBufferSize) * 1000;
fThread.SetParams(fDriver->fEngineControl->fPeriod, fDriver->fEngineControl->fComputation, fDriver->fEngineControl->fConstraint);
if (fThread.AcquireSelfRealTime(fDriver->fEngineControl->fServerPriority) < 0) {
jack_error("AcquireSelfRealTime error"); jack_error("AcquireSelfRealTime error");
} else { } else {
set_threaded_log_function(); set_threaded_log_function();


+ 7
- 5
common/JackTransportEngine.cpp View File

@@ -34,7 +34,9 @@ using namespace std;
namespace Jack namespace Jack
{ {


JackTransportEngine::JackTransportEngine(): JackAtomicArrayState<jack_position_t>()
JackTransportEngine::JackTransportEngine(JackGlobals *global)
: JackAtomicArrayState<jack_position_t>()
, JackGlobalsInterface(global)
{ {
fTransportState = JackTransportStopped; fTransportState = JackTransportStopped;
fTransportCmd = fPreviousCmd = TransportCommandStop; fTransportCmd = fPreviousCmd = TransportCommandStop;
@@ -92,7 +94,7 @@ int JackTransportEngine::SetTimebaseMaster(int refnum, bool conditionnal)
// RT // RT
bool JackTransportEngine::CheckAllRolling(JackClientInterface** table) bool JackTransportEngine::CheckAllRolling(JackClientInterface** table)
{ {
for (int i = GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
for (int i = GetGlobal()->GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i]; JackClientInterface* client = table[i];
if (client && client->GetClientControl()->fTransportState != JackTransportRolling) { if (client && client->GetClientControl()->fTransportState != JackTransportRolling) {
jack_log("CheckAllRolling ref = %ld is not rolling", i); jack_log("CheckAllRolling ref = %ld is not rolling", i);
@@ -106,7 +108,7 @@ bool JackTransportEngine::CheckAllRolling(JackClientInterface** table)
// RT // RT
void JackTransportEngine::MakeAllStartingLocating(JackClientInterface** table) void JackTransportEngine::MakeAllStartingLocating(JackClientInterface** table)
{ {
for (int i = GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
for (int i = GetGlobal()->GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i]; JackClientInterface* client = table[i];
if (client) { if (client) {
JackClientControl* control = client->GetClientControl(); JackClientControl* control = client->GetClientControl();
@@ -122,7 +124,7 @@ void JackTransportEngine::MakeAllStartingLocating(JackClientInterface** table)
// RT // RT
void JackTransportEngine::MakeAllStopping(JackClientInterface** table) void JackTransportEngine::MakeAllStopping(JackClientInterface** table)
{ {
for (int i = GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
for (int i = GetGlobal()->GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i]; JackClientInterface* client = table[i];
if (client) { if (client) {
JackClientControl* control = client->GetClientControl(); JackClientControl* control = client->GetClientControl();
@@ -137,7 +139,7 @@ void JackTransportEngine::MakeAllStopping(JackClientInterface** table)
// RT // RT
void JackTransportEngine::MakeAllLocating(JackClientInterface** table) void JackTransportEngine::MakeAllLocating(JackClientInterface** table)
{ {
for (int i = GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
for (int i = GetGlobal()->GetEngineControl()->fDriverNum; i < CLIENT_NUM; i++) {
JackClientInterface* client = table[i]; JackClientInterface* client = table[i];
if (client) { if (client) {
JackClientControl* control = client->GetClientControl(); JackClientControl* control = client->GetClientControl();


+ 3
- 2
common/JackTransportEngine.h View File

@@ -23,6 +23,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


#include "JackAtomicArrayState.h" #include "JackAtomicArrayState.h"
#include "JackCompilerDeps.h" #include "JackCompilerDeps.h"
#include "JackGlobals.h"
#include "types.h" #include "types.h"


namespace Jack namespace Jack
@@ -90,7 +91,7 @@ We have:
class JackClientInterface; class JackClientInterface;


PRE_PACKED_STRUCTURE PRE_PACKED_STRUCTURE
class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_position_t>
class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_position_t>, public JackGlobalsInterface
{ {


private: private:
@@ -115,7 +116,7 @@ class SERVER_EXPORT JackTransportEngine : public JackAtomicArrayState<jack_posit


public: public:


JackTransportEngine();
JackTransportEngine(JackGlobals *global);


~JackTransportEngine() ~JackTransportEngine()
{} {}


+ 36
- 36
common/shm.c View File

@@ -79,17 +79,17 @@ static int GetPID()
} }


#ifdef USE_POSIX_SHM #ifdef USE_POSIX_SHM
static jack_shmtype_t jack_shmtype = shm_POSIX;
static const jack_shmtype_t jack_shmtype = shm_POSIX;
#elif WIN32 #elif WIN32
static jack_shmtype_t jack_shmtype = shm_WIN32;
static const jack_shmtype_t jack_shmtype = shm_WIN32;
#else #else
static jack_shmtype_t jack_shmtype = shm_SYSV;
static const jack_shmtype_t jack_shmtype = shm_SYSV;
#endif #endif


/* interface-dependent forward declarations */ /* interface-dependent forward declarations */
static int jack_access_registry (jack_shm_info_t *ri); static int jack_access_registry (jack_shm_info_t *ri);
static int jack_create_registry (jack_shm_info_t *ri); static int jack_create_registry (jack_shm_info_t *ri);
static void jack_remove_shm (jack_shm_id_t *id);
static void jack_remove_shm (const jack_shm_id_t id);


/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* common interface-independent section * common interface-independent section
@@ -103,7 +103,13 @@ static void jack_remove_shm (jack_shm_id_t *id);
*/ */


/* per-process global data for the SHM interfaces */ /* per-process global data for the SHM interfaces */
#ifdef USE_POSIX_SHM
static const jack_shm_id_t registry_id = "/jack-shm-registry";
#elif WIN32
static const jack_shm_id_t registry_id = "jack-shm-registry";
#else
static jack_shm_id_t registry_id; /* SHM id for the registry */ static jack_shm_id_t registry_id; /* SHM id for the registry */
#endif


#ifdef WIN32 #ifdef WIN32
static jack_shm_info_t registry_info = {/* SHM info for the registry */ static jack_shm_info_t registry_info = {/* SHM info for the registry */
@@ -120,7 +126,6 @@ static jack_shm_info_t registry_info = { /* SHM info for the registry */
/* pointers to registry header and array */ /* pointers to registry header and array */
static jack_shm_header_t *jack_shm_header = NULL; static jack_shm_header_t *jack_shm_header = NULL;
static jack_shm_registry_t *jack_shm_registry = NULL; static jack_shm_registry_t *jack_shm_registry = NULL;
static char jack_shm_server_prefix[JACK_SERVER_NAME_SIZE+1] = "";


/* jack_shm_lock_registry() serializes updates to the shared memory /* jack_shm_lock_registry() serializes updates to the shared memory
* segment JACK uses to keep track of the SHM segments allocated to * segment JACK uses to keep track of the SHM segments allocated to
@@ -315,16 +320,16 @@ jack_shm_validate_registry ()
* name, in the interest of portability we use colons instead. * name, in the interest of portability we use colons instead.
*/ */
static void static void
jack_set_server_prefix (const char *server_name)
jack_get_server_prefix (const char* const server_name, char* const prefix, const size_t size)
{ {
#ifdef WIN32 #ifdef WIN32
char buffer[UNLEN+1]={0}; char buffer[UNLEN+1]={0};
DWORD len = UNLEN+1; DWORD len = UNLEN+1;
GetUserName(buffer, &len); GetUserName(buffer, &len);
snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix),
snprintf (prefix, size,
"jack-%s:%s:", buffer, server_name); "jack-%s:%s:", buffer, server_name);
#else #else
snprintf (jack_shm_server_prefix, sizeof (jack_shm_server_prefix),
snprintf (prefix, size,
"jack-%d:%s:", GetUID(), server_name); "jack-%d:%s:", GetUID(), server_name);
#endif #endif
} }
@@ -349,7 +354,7 @@ jack_server_initialize_shm (int new_registry)
rc = jack_access_registry (&registry_info); rc = jack_access_registry (&registry_info);


if (new_registry) { if (new_registry) {
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
rc = ENOENT; rc = ENOENT;
} }


@@ -365,7 +370,7 @@ jack_server_initialize_shm (int new_registry)
/* Apparently, this registry was created by an older /* Apparently, this registry was created by an older
* JACK version. Delete it so we can try again. */ * JACK version. Delete it so we can try again. */
jack_release_shm (&registry_info); jack_release_shm (&registry_info);
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
if ((rc = jack_create_registry (&registry_info)) != 0) { if ((rc = jack_create_registry (&registry_info)) != 0) {
jack_error ("incompatible shm registry (%s)", jack_error ("incompatible shm registry (%s)",
strerror (errno)); strerror (errno));
@@ -394,11 +399,12 @@ int
jack_initialize_shm (const char *server_name) jack_initialize_shm (const char *server_name)
{ {
int rc; int rc;
char server_prefix[JACK_SERVER_NAME_SIZE+1];


if (jack_shm_header) if (jack_shm_header)
return 0; /* already initialized */ return 0; /* already initialized */


jack_set_server_prefix (server_name);
jack_get_server_prefix (server_name, server_prefix, sizeof(server_prefix));


if (jack_shm_lock_registry () < 0) { if (jack_shm_lock_registry () < 0) {
jack_error ("jack_shm_lock_registry fails..."); jack_error ("jack_shm_lock_registry fails...");
@@ -429,7 +435,7 @@ jack_destroy_shm (jack_shm_info_t* si)
if (si->index == JACK_SHM_NULL_INDEX) if (si->index == JACK_SHM_NULL_INDEX)
return; /* segment not allocated */ return; /* segment not allocated */


jack_remove_shm (&jack_shm_registry[si->index].id);
jack_remove_shm (jack_shm_registry[si->index].id);
jack_release_shm_info (si->index); jack_release_shm_info (si->index);
} }


@@ -490,8 +496,9 @@ int
jack_register_server (const char *server_name, int new_registry) jack_register_server (const char *server_name, int new_registry)
{ {
int i, res = 0; int i, res = 0;
char server_prefix[JACK_SERVER_NAME_SIZE+1];


jack_set_server_prefix (server_name);
jack_get_server_prefix (server_name, server_prefix, sizeof(server_prefix));


if (jack_server_initialize_shm (new_registry)) if (jack_server_initialize_shm (new_registry))
return ENOMEM; return ENOMEM;
@@ -507,8 +514,8 @@ jack_register_server (const char *server_name, int new_registry)
for (i = 0; i < MAX_SERVERS; i++) { for (i = 0; i < MAX_SERVERS; i++) {


if (strncmp (jack_shm_header->server[i].name, if (strncmp (jack_shm_header->server[i].name,
jack_shm_server_prefix,
JACK_SERVER_NAME_SIZE) != 0)
server_prefix,
sizeof(server_prefix)) != 0)
continue; /* no match */ continue; /* no match */


if (jack_shm_header->server[i].pid == GetPID()){ if (jack_shm_header->server[i].pid == GetPID()){
@@ -548,8 +555,8 @@ jack_register_server (const char *server_name, int new_registry)
/* claim it */ /* claim it */
jack_shm_header->server[i].pid = GetPID(); jack_shm_header->server[i].pid = GetPID();
strncpy (jack_shm_header->server[i].name, strncpy (jack_shm_header->server[i].name,
jack_shm_server_prefix,
JACK_SERVER_NAME_SIZE);
server_prefix,
sizeof(server_prefix));


unlock: unlock:
jack_shm_unlock_registry (); jack_shm_unlock_registry ();
@@ -630,7 +637,7 @@ jack_cleanup_shm ()
int index = copy.index; int index = copy.index;


if ((index >= 0) && (index < MAX_SHM_ID)) { if ((index >= 0) && (index < MAX_SHM_ID)) {
jack_remove_shm (&jack_shm_registry[index].id);
jack_remove_shm (jack_shm_registry[index].id);
jack_release_shm_entry (index); jack_release_shm_entry (index);
} }
r->size = 0; r->size = 0;
@@ -715,8 +722,6 @@ jack_access_registry (jack_shm_info_t *ri)
/* registry must be locked */ /* registry must be locked */
int shm_fd; int shm_fd;


strncpy (registry_id, "/jack-shm-registry", sizeof (registry_id));

/* try to open an existing segment */ /* try to open an existing segment */
if ((shm_fd = shm_open (registry_id, O_RDWR, 0666)) < 0) { if ((shm_fd = shm_open (registry_id, O_RDWR, 0666)) < 0) {
int rc = errno; int rc = errno;
@@ -759,8 +764,6 @@ jack_create_registry (jack_shm_info_t *ri)
/* registry must be locked */ /* registry must be locked */
int shm_fd; int shm_fd;


strncpy (registry_id, "/jack-shm-registry", sizeof (registry_id));

if ((shm_fd = shm_open (registry_id, O_RDWR|O_CREAT, 0666)) < 0) { if ((shm_fd = shm_open (registry_id, O_RDWR|O_CREAT, 0666)) < 0) {
int rc = errno; int rc = errno;
jack_error ("Cannot create shm registry segment (%s)", jack_error ("Cannot create shm registry segment (%s)",
@@ -779,7 +782,7 @@ jack_create_registry (jack_shm_info_t *ri)
if (ftruncate (shm_fd, JACK_SHM_REGISTRY_SIZE) < 0) { if (ftruncate (shm_fd, JACK_SHM_REGISTRY_SIZE) < 0) {
int rc = errno; int rc = errno;
jack_error ("Cannot set registry size (%s)", strerror (errno)); jack_error ("Cannot set registry size (%s)", strerror (errno));
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
close (shm_fd); close (shm_fd);
return rc; return rc;
} }
@@ -789,7 +792,7 @@ jack_create_registry (jack_shm_info_t *ri)
MAP_SHARED, shm_fd, 0)) == MAP_FAILED) { MAP_SHARED, shm_fd, 0)) == MAP_FAILED) {
jack_error ("Cannot mmap shm registry segment (%s)", jack_error ("Cannot mmap shm registry segment (%s)",
strerror (errno)); strerror (errno));
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
close (shm_fd); close (shm_fd);
return EINVAL; return EINVAL;
} }
@@ -806,10 +809,10 @@ jack_create_registry (jack_shm_info_t *ri)
} }


static void static void
jack_remove_shm (jack_shm_id_t *id)
jack_remove_shm (const jack_shm_id_t id)
{ {
/* registry may or may not be locked */ /* registry may or may not be locked */
shm_unlink ((char *) id);
shm_unlink (id);
} }


void void
@@ -955,7 +958,6 @@ jack_access_registry (jack_shm_info_t *ri)
{ {
/* registry must be locked */ /* registry must be locked */
HANDLE shm_fd; HANDLE shm_fd;
strncpy (registry_id, "jack-shm-registry", sizeof (registry_id));


/* try to open an existing segment */ /* try to open an existing segment */


@@ -969,7 +971,7 @@ jack_access_registry (jack_shm_info_t *ri)


if ((ri->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, JACK_SHM_REGISTRY_SIZE)) == NULL) { if ((ri->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, JACK_SHM_REGISTRY_SIZE)) == NULL) {
jack_error ("Cannot mmap shm registry segment (%ld)", GetLastError()); jack_error ("Cannot mmap shm registry segment (%ld)", GetLastError());
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
CloseHandle (shm_fd); CloseHandle (shm_fd);
return EINVAL; return EINVAL;
} }
@@ -989,8 +991,6 @@ jack_create_registry (jack_shm_info_t *ri)
/* registry must be locked */ /* registry must be locked */
HANDLE shm_fd; HANDLE shm_fd;


strncpy (registry_id, "jack-shm-registry", sizeof (registry_id));

if ((shm_fd = CreateFileMapping(INVALID_HANDLE_VALUE, if ((shm_fd = CreateFileMapping(INVALID_HANDLE_VALUE,
0, PAGE_READWRITE, 0, PAGE_READWRITE,
0, JACK_SHM_REGISTRY_SIZE, 0, JACK_SHM_REGISTRY_SIZE,
@@ -1002,7 +1002,7 @@ jack_create_registry (jack_shm_info_t *ri)


if ((ri->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, JACK_SHM_REGISTRY_SIZE)) == NULL) { if ((ri->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, JACK_SHM_REGISTRY_SIZE)) == NULL) {
jack_error ("Cannot mmap shm registry segment (%ld)", GetLastError()); jack_error ("Cannot mmap shm registry segment (%ld)", GetLastError());
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
CloseHandle (shm_fd); CloseHandle (shm_fd);
return EINVAL; return EINVAL;
} }
@@ -1020,7 +1020,7 @@ jack_create_registry (jack_shm_info_t *ri)
} }


static void static void
jack_remove_shm (jack_shm_id_t *id)
jack_remove_shm (jack_shm_id_t id)
{ {
/* nothing to do */ /* nothing to do */
} }
@@ -1102,7 +1102,7 @@ jack_attach_shm (jack_shm_info_t* si)


if ((si->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, registry->size)) == NULL) { if ((si->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_ALL_ACCESS, 0, 0, registry->size)) == NULL) {
jack_error ("Cannot mmap shm segment (%ld)", GetLastError()); jack_error ("Cannot mmap shm segment (%ld)", GetLastError());
jack_remove_shm (&registry_id);
jack_remove_shm (registry_id);
CloseHandle (shm_fd); CloseHandle (shm_fd);
return -1; return -1;
} }
@@ -1125,7 +1125,7 @@ jack_attach_shm_read (jack_shm_info_t* si)


if ((si->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_READ, 0, 0, registry->size)) == NULL) { if ((si->ptr.attached_at = MapViewOfFile (shm_fd, FILE_MAP_READ, 0, 0, registry->size)) == NULL) {
jack_error("Cannot mmap shm segment (%ld)", GetLastError()); jack_error("Cannot mmap shm segment (%ld)", GetLastError());
jack_remove_shm(&registry_id);
jack_remove_shm(registry_id);
CloseHandle(shm_fd); CloseHandle(shm_fd);
return -1; return -1;
} }
@@ -1224,10 +1224,10 @@ jack_create_registry (jack_shm_info_t *ri)
} }


static void static void
jack_remove_shm (jack_shm_id_t *id)
jack_remove_shm (jack_shm_id_t id)
{ {
/* registry may or may not be locked */ /* registry may or may not be locked */
shmctl (*id, IPC_RMID, NULL);
shmctl (id, IPC_RMID, NULL);
} }


void void


+ 5
- 3
linux/alsa/JackAlsaAdapter.cpp View File

@@ -24,14 +24,16 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackAlsaAdapter.h" #include "JackAlsaAdapter.h"
#include "JackGlobals.h" #include "JackGlobals.h"
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackClient.h"


namespace Jack namespace Jack
{ {


JackAlsaAdapter::JackAlsaAdapter ( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params ) :
JackAlsaAdapter::JackAlsaAdapter ( JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params ) :
JackAudioAdapterInterface ( buffer_size, sample_rate ), JackAudioAdapterInterface ( buffer_size, sample_rate ),
fThread ( this ), fThread ( this ),
fAudioInterface ( buffer_size, sample_rate )
fAudioInterface ( buffer_size, sample_rate ),
fClient( jack_client )
{ {
const JSList* node; const JSList* node;
const jack_driver_param_t* param; const jack_driver_param_t* param;
@@ -110,7 +112,7 @@ namespace Jack
fAudioInterface.longinfo(); fAudioInterface.longinfo();


//turn the thread realtime //turn the thread realtime
fThread.AcquireRealTime(GetEngineControl()->fClientPriority);
fThread.AcquireRealTime(fClient.GetGlobal()->GetEngineControl()->fClientPriority);
return 0; return 0;
} }




+ 2
- 1
linux/alsa/JackAlsaAdapter.h View File

@@ -602,9 +602,10 @@ namespace Jack
private: private:
JackThread fThread; JackThread fThread;
AudioInterface fAudioInterface; AudioInterface fAudioInterface;
JackClient &fClient;


public: public:
JackAlsaAdapter ( jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params );
JackAlsaAdapter ( JackClient &client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params );
~JackAlsaAdapter() ~JackAlsaAdapter()
{} {}




+ 1
- 1
macosx/coreaudio/JackCoreAudioAdapter.h View File

@@ -150,7 +150,7 @@ class JackCoreAudioAdapter : public JackAudioAdapterInterface


public: public:


JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
JackCoreAudioAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
~JackCoreAudioAdapter() ~JackCoreAudioAdapter()
{} {}




+ 1
- 1
macosx/coreaudio/JackCoreAudioAdapter.mm View File

@@ -321,7 +321,7 @@ OSStatus JackCoreAudioAdapter::Render(AudioUnitRenderActionFlags *ioActionFlags,
} }
} }


JackCoreAudioAdapter::JackCoreAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
JackCoreAudioAdapter::JackCoreAudioAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
:JackAudioAdapterInterface(buffer_size, sample_rate), fInputData(0), fCapturing(false), fPlaying(false), fState(false) :JackAudioAdapterInterface(buffer_size, sample_rate), fInputData(0), fCapturing(false), fPlaying(false), fState(false)
{ {
const JSList* node; const JSList* node;


+ 1
- 1
posix/JackPosixServerLaunch.cpp View File

@@ -242,7 +242,7 @@ static int start_server(const char* server_name, jack_options_t options)


static int server_connect(char* server_name) static int server_connect(char* server_name)
{ {
JackClientChannel channel;
JackClientChannel channel(nullptr);
int res = channel.ServerCheck(server_name); int res = channel.ServerCheck(server_name);
channel.Close(); channel.Close();
JackSleep(2000); // Added by JE - 02-01-2009 (gives JackSleep(2000); // Added by JE - 02-01-2009 (gives


+ 3
- 3
posix/JackSocketClientChannel.cpp View File

@@ -26,8 +26,8 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
namespace Jack namespace Jack
{ {


JackSocketClientChannel::JackSocketClientChannel()
:JackGenericClientChannel(), fThread(this)
JackSocketClientChannel::JackSocketClientChannel(JackGlobals *global)
:JackGenericClientChannel(global), fThread(this)
{ {
fRequest = new JackClientSocket(); fRequest = new JackClientSocket();
fNotificationSocket = NULL; fNotificationSocket = NULL;
@@ -53,7 +53,7 @@ int JackSocketClientChannel::Open(const char* server_name, const char* name, jac
} }
// OK so server is there... // OK so server is there...
JackGlobals::fServerRunning = true;
client->GetGlobal()->fServerRunning = true;


// Check name in server // Check name in server
ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result, true); ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result, true);


+ 1
- 1
posix/JackSocketClientChannel.h View File

@@ -46,7 +46,7 @@ class JackSocketClientChannel : public JackGenericClientChannel, public JackRunn


public: public:


JackSocketClientChannel();
JackSocketClientChannel(JackGlobals *global);
virtual ~JackSocketClientChannel(); virtual ~JackSocketClientChannel();


int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status); int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status);


+ 5
- 3
solaris/oss/JackOSSAdapter.cpp View File

@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackOSSAdapter.h" #include "JackOSSAdapter.h"
#include "JackServerGlobals.h" #include "JackServerGlobals.h"
#include "JackEngineControl.h" #include "JackEngineControl.h"
#include "JackClient.h"
#include "memops.h" #include "memops.h"


#include <sys/ioctl.h> #include <sys/ioctl.h>
@@ -103,13 +104,14 @@ void JackOSSAdapter::SetSampleFormat()
} }
} }


JackOSSAdapter::JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
JackOSSAdapter::JackOSSAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
:JackAudioAdapterInterface(buffer_size, sample_rate) :JackAudioAdapterInterface(buffer_size, sample_rate)
,fThread(this), ,fThread(this),
fInFD(-1), fOutFD(-1), fBits(OSS_DRIVER_DEF_BITS), fInFD(-1), fOutFD(-1), fBits(OSS_DRIVER_DEF_BITS),
fSampleFormat(0), fNperiods(OSS_DRIVER_DEF_NPERIODS), fRWMode(0), fIgnoreHW(true), fExcl(false), fSampleFormat(0), fNperiods(OSS_DRIVER_DEF_NPERIODS), fRWMode(0), fIgnoreHW(true), fExcl(false),
fInputBufferSize(0), fOutputBufferSize(0), fInputBufferSize(0), fOutputBufferSize(0),
fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true)
fInputBuffer(NULL), fOutputBuffer(NULL), fFirstCycle(true),
fClient(jack_client)
{ {
const JSList* node; const JSList* node;
const jack_driver_param_t* param; const jack_driver_param_t* param;
@@ -496,7 +498,7 @@ int JackOSSAdapter::Open()
} }


//turn the thread realtime //turn the thread realtime
fThread.AcquireRealTime(JackServerGlobals::fInstance->GetEngineControl()->fClientPriority);
fThread.AcquireRealTime(fClient.GetGlobal()->GetEngineControl()->fClientPriority);
return 0; return 0;


error: error:


+ 5
- 1
solaris/oss/JackOSSAdapter.h View File

@@ -32,6 +32,8 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack namespace Jack
{ {


class JackClient;

typedef jack_default_audio_sample_t jack_sample_t; typedef jack_default_audio_sample_t jack_sample_t;


#define OSS_DRIVER_DEF_DEV "/dev/dsp" #define OSS_DRIVER_DEF_DEV "/dev/dsp"
@@ -86,9 +88,11 @@ class JackOSSAdapter : public JackAudioAdapterInterface, public JackRunnableInte
void SetSampleFormat(); void SetSampleFormat();
void DisplayDeviceInfo(); void DisplayDeviceInfo();


JackClient &fClient;

public: public:


JackOSSAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
JackOSSAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
~JackOSSAdapter() ~JackOSSAdapter()
{} {}




+ 3
- 3
windows/JackWinNamedPipeClientChannel.cpp View File

@@ -27,8 +27,8 @@
namespace Jack namespace Jack
{ {


JackWinNamedPipeClientChannel::JackWinNamedPipeClientChannel()
:JackGenericClientChannel(),fThread(this)
JackWinNamedPipeClientChannel::JackWinNamedPipeClientChannel(JackGlobals *global)
:JackGenericClientChannel(global),fThread(this)
{ {
fRequest = new JackWinNamedPipeClient(); fRequest = new JackWinNamedPipeClient();
} }
@@ -60,7 +60,7 @@ int JackWinNamedPipeClientChannel::Open(const char* server_name, const char* nam
} }
// OK so server is there... // OK so server is there...
JackGlobals::fServerRunning = true;
client->GetGlobal()->fServerRunning = true;


// Check name in server // Check name in server
ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result, true); ClientCheck(name, uuid, name_res, JACK_PROTOCOL_VERSION, (int)options, (int*)status, &result, true);


+ 2
- 1
windows/JackWinNamedPipeClientChannel.h View File

@@ -29,6 +29,7 @@
namespace Jack namespace Jack
{ {


class JackGlobals;
class JackClient; class JackClient;


/*! /*!
@@ -46,7 +47,7 @@ class JackWinNamedPipeClientChannel : public JackGenericClientChannel, public Ja


public: public:


JackWinNamedPipeClientChannel();
JackWinNamedPipeClientChannel(JackGlobals *global);
virtual ~JackWinNamedPipeClientChannel(); virtual ~JackWinNamedPipeClientChannel();


int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status); int Open(const char* server_name, const char* name, jack_uuid_t uuid, char* name_res, JackClient* client, jack_options_t options, jack_status_t* status);


+ 1
- 1
windows/portaudio/JackPortAudioAdapter.cpp View File

@@ -34,7 +34,7 @@ namespace Jack
return paContinue; return paContinue;
} }


JackPortAudioAdapter::JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
JackPortAudioAdapter::JackPortAudioAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params)
: JackAudioAdapterInterface(buffer_size, sample_rate) : JackAudioAdapterInterface(buffer_size, sample_rate)
{ {
jack_log("JackPortAudioAdapter::JackPortAudioAdapter buffer_size = %d, sample_rate = %d", buffer_size, sample_rate); jack_log("JackPortAudioAdapter::JackPortAudioAdapter buffer_size = %d, sample_rate = %d", buffer_size, sample_rate);


+ 2
- 1
windows/portaudio/JackPortAudioAdapter.h View File

@@ -26,6 +26,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.


namespace Jack namespace Jack
{ {
class JackClient;


/*! /*!
\brief Audio adapter using PortAudio API. \brief Audio adapter using PortAudio API.
@@ -49,7 +50,7 @@ namespace Jack


public: public:


JackPortAudioAdapter(jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
JackPortAudioAdapter(JackClient &jack_client, jack_nframes_t buffer_size, jack_nframes_t sample_rate, const JSList* params);
~JackPortAudioAdapter() ~JackPortAudioAdapter()
{} {}




Loading…
Cancel
Save