[SCM] jackd2/master: Imported Upstream version 1.9.9.5+20130127git15950eb1

adiknoth-guest at users.alioth.debian.org adiknoth-guest at users.alioth.debian.org
Sun Jan 27 20:14:36 UTC 2013


The following commit has been merged in the master branch:
commit ff482c725d427bb1f00ea7f02d8b2a11da889780
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date:   Sun Jan 27 13:50:42 2013 +0100

    Imported Upstream version 1.9.9.5+20130127git15950eb1

diff --git a/ChangeLog b/ChangeLog
index 74ab271..03429ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -37,6 +37,14 @@ Robin Gareus
   Jackdmp changes log
 ---------------------------
 
+2012-12-10 Stephane Letz  <letz at grame.fr>
+
+	* Version 1.9.10 started. 
+
+2012-11-21 Stephane Letz  <letz at grame.fr>
+
+	* Correct JackPortAudioDriver::Open : special case for ASIO drivers.
+
 2012-10-20 Stephane Letz  <letz at grame.fr>
 
 	* Correct JackEngine::NotifyGraphReorder : graph-order callback now notified after port latencies update.
diff --git a/README b/README
index ec94f23..e64b4a1 100644
--- a/README
+++ b/README
@@ -214,7 +214,7 @@ Note : To experiment with the -S option, jackdmp must be launched in a console.
 1.9.6 : Improve JackCoreAudioDriver and JackCoreAudioAdapter : when no devices are described, takes default input and output and aggregate them.Correct JackGraphManager::DeactivatePort. Correct JackMachServerChannel::Execute : keep running even in error cases. Raise JACK_PROTOCOL_VERSION number. Arnold Krille firewire patch. Raise JACK_DRIVER_PARAM_STRING_MAX and JACK_PARAM_STRING_MAX to 127 otherwise some audio drivers cannot be loaded on OSX. Fix some file header to have library side code use LGPL. On Windows, now use TRE library for regexp (BSD license instead of GPL license). ffado-portname-sync.patch from ticket #163 applied. Remove call to exit in library code. Make jack_connect/jack_disconnect wait for effective port connection/disconnection. Add tests to validate intclient.h API. On Linux, inter-process synchronization primitive switched to POSIX semaphore. In JackCoreAudioDriver, move code called in MeasureCallback to be called once in IO thread. David Garcia Garzon netone patch. Fix from Fernando Lopez-Lezcano for compilation on fc13. Fix JackPosixSemaphore::TimedWait : same behavior as JackPosixSemaphore::Wait regarding EINTR. David Garcia Garzon unused_pkt_buf_field_jack2 netone patch. Arnold Krille firewire snooping patch. Jan Engelhardt patch for get_cycles on SPARC. Adrian Knoth hurd.patch, kfreebsd-fix.patch and alpha_ia64-sigsegv.patch from ticket 177. Adrian Knoth fix for linux cycle.h (ticket 188). In JackCoreAudioDriver, fix an issue when no value is given for input.
 1.9.7 : Sync JackAlsaDriver::alsa_driver_check_card_type with JACK1 backend. Correct JackServer::Open to avoid a race when control API is used on OSX. Improve backend error handling: fatal error returned by Read/Write now cause a Process failure (so a thread exit for blocking backends). Recoverable ones (XRuns..) are now treated internally in ALSA, FreeBob and FFADO backends. In jackdmp.cpp, jackctl_setup_signals moved before jackctl_server_start. Correct symbols export in backends on OSX. ALSA backend : suspend/resume handling. Correct dummy driver. Adrian Knoth jack_lsp patch. Remove JackPortIsActive flag. New latency API implementation. ComputeTotalLatencies now a client/server call. Add latent test client for latency API. Also print playback and capture latency in jack_lsp. jack_client_has_session_callback implementation. Check requested buffer size and limit to 1..8192 - avoids weird behaviour caused by jack_bufsize foobar.  jack_port_type_get_buffer_size implementation. Stop using alloca and allocate buffer on the heap for alsa_io. Rename jdelay to jack_iodelay as per Fons' request. Call buffer size callback in activate (actually this is done on client side in the RT thread Init method).  Add jack_midi_dump client. Synchronize net JACK1 with JACK1 version. Synchronize jack_connect/jack_disconnect with JACK1 version. Correct JackNetMaster::SetBufferSize. Use jack_default_audio_sample_t instead of float consistently, fix ticket #201. -X now allows to add several slave backends, add -I to load several internal clients. Rework internal slave driver management, JackServerGlobals now handle same parameters as jackdmp. Correct JackEngine::NotifyGraphReorder, update JackDebugClient with latest API. Devin Anderson server-ctl-proposal branch merged on trunk: improved control API, slave backend reworked. Implement renaming in JackDriver::Open to avoid name collision (thanks Devin Anderson). Correct alsa_driver_restart (thanks Devin Anderson). Correction of jack_connect/jack_disconnect: use of jack_activate and volatile keyword for thread shared variable. Correction of JackNetOneDriver for latest CELT API. Synchronize JackWeakAPI.cpp with new APIs. 
 1.9.8 : Merge newer-midi branch (Devin Anderson redesign of the MIDI drivers: alsarawmidi, ffado, coremidi and winmme). Correction in jackdmp.cpp: notify_server_stop should be done after server destruction. Correct driver lifetime management. Add XRun detection in PortAudio driver. CELT code for NetJack2. Merge branch switch-master-port-registration-notifications: correct driver port registration. Libjacknet in progress. Correct MIDI in NetJack2. Correct OSX real-time thread setup. Correct rd_acquire in dbus code. Correct NetJack2 connection handling. SaveConnections/RestoreConnections in NetDriver and JackAudioDriver. Special version of jack_attach_shm/jack_release_shm on client side for POSIX shared memory, to solve a memory leak issue. Another round of code improvements to handle completely buggy Digidesign CoreAudio user-land driver. Special CATCH_CLOSE_EXCEPTION_RETURN to handle Close API calls. Add JACK_NETJACK_PORT and JACK_NETJACK_MULTICAST environment variables for NetJack2. NetJack2 now only send data on network only is ports are connected both sides. Fix for "starting two instances of same app in parallel does not work" bug. Enable explicit channel mapping in CoreAudio driver. New JackTimedDriver class to be used by JackDummyDriver, JackNetDriver and JackNetOneDriver classes. More robust code in synchronization primitives and in JackMessageBuffer. More robust Control API implementation. Add jackctl_driver_get_type in Control API. Singleton behaviour for JackCoreMidiDriver and JackWinMMEDriver. John Emmas patch for DSP CPU computation. John Emmas Windows server launching patch. Fix jack_set_port_name API. Enable local access in NetJack2 code. Dynamic port management in JACK/CoreMidi bridge.  
-1.9.9 : Adrian Knoth fix in midiseq.c. Fix library symbols export issue. Cleanup drivers and internals loading code. jackctl_driver_params_parse API moved in public control.h. More general drivers/internals loading model on Windows. Factorize code the server/client request in JackRequestDecoder class. More robust server/client protocol. Implement shutdown for in server clients. Better time-out management in NetJack2. Experimental system port alias use in Windows JackRouter. Improve ShutDown in NetManager. Correct ShutDown in JackInternalClient and JackLibClient. Fix NetJack2 initialisation bug. Add EndTime function (especially for Windows). Rename JackProcessSync in JackPosixProcessSync. A bit more robust JackMessageBuffer implementation (in progress). Check server API callback from notification thread. Use a time-out in notification channel write function. Fix lock management in JackEngine. In control API, UNIX like sigset_t replaced by more abstract jackctl_sigmask_t * opaque struct. Improve libjacknet master mode. Remove JACK_32_64 flag, so POST_PACKED_STRUCTURE now always used. POST_PACKED_STRUCTURE used for jack_latency_range_t type. Rework JackMessageBuffer. [firewire] Introduce UpdateLatencies() in FFADO backend. [firewire] Allow FFADO backend to change the buffer size. Update waf. New jack_get_cycle_times() implementation from Fons Adriennsen. Align buffers to 32 byte boundaries to allow AVX processing. Extend jack_control to have parameter reset commands. Fix alsa driver parameter order. Control API: Enforce driver/internal parameter order. Fix in ALSA adapter. Devin Anderson patch for Jack/CoreMIDI duplicated messages. Change framework installation hierarchy for OSX Mountain Lion. Update JackCoreAudioDriver and JackCoreAudioAdapter with more recent API. jack_control: fix epr command. Add opus support to NetJack2. More robust channel mapping handling in JackCoreAudioDriver. netjack1/netone opus support. controlapi: fix double free on master switch. Use string ids in the alsa device list. netjack/opus: don't re-init en/decoders.
+1.9.9 : Adrian Knoth fix in midiseq.c. Fix library symbols export issue. Cleanup drivers and internals loading code. jackctl_driver_params_parse API moved in public control.h. More general drivers/internals loading model on Windows. Factorize code the server/client request in JackRequestDecoder class. More robust server/client protocol. Implement shutdown for in server clients. Better time-out management in NetJack2. Experimental system port alias use in Windows JackRouter. Improve ShutDown in NetManager. Correct ShutDown in JackInternalClient and JackLibClient. Fix NetJack2 initialisation bug. Add EndTime function (especially for Windows). Rename JackProcessSync in JackPosixProcessSync. A bit more robust JackMessageBuffer implementation (in progress). Check server API callback from notification thread. Use a time-out in notification channel write function. Fix lock management in JackEngine. In control API, UNIX like sigset_t replaced by more abstract jackctl_sigmask_t * opaque struct. Improve libjacknet master mode. Remove JACK_32_64 flag, so POST_PACKED_STRUCTURE now always used. POST_PACKED_STRUCTURE used for jack_latency_range_t type. Rework JackMessageBuffer. [firewire] Introduce UpdateLatencies() in FFADO backend. [firewire] Allow FFADO backend to change the buffer size. Update waf. New jack_get_cycle_times() implementation from Fons Adriennsen. Align buffers to 32 byte boundaries to allow AVX processing. Extend jack_control to have parameter reset commands. Fix alsa driver parameter order. Control API: Enforce driver/internal parameter order. Fix in ALSA adapter. Devin Anderson patch for Jack/CoreMIDI duplicated messages. Change framework installation hierarchy for OSX Mountain Lion. Update JackCoreAudioDriver and JackCoreAudioAdapter with more recent API. jack_control: fix epr command. Add opus support to NetJack2. More robust channel mapping handling in JackCoreAudioDriver. netjack1/netone opus support. controlapi: fix double free on master switch. Use string ids in the alsa device list. netjack/opus: don't re-init en/decoders. Correct JackPortAudioDriver::Open : special case for ASIO drivers.
 
 This is a work in progress but the implementation is now stable enough to be tested. jackdmp has been used successfully with the following applications : Ardour, Hydrogen, Jamin, QjackCtl, Jack-Rack, SooperLooper, AlsaPlayer...  
 
diff --git a/common/JackAudioPort.cpp b/common/JackAudioPort.cpp
index 2548318..4ddd6f9 100644
--- a/common/JackAudioPort.cpp
+++ b/common/JackAudioPort.cpp
@@ -41,46 +41,44 @@ static void AudioBufferInit(void* buffer, size_t buffer_size, jack_nframes_t)
 static inline void MixAudioBuffer(jack_default_audio_sample_t* mixbuffer, jack_default_audio_sample_t* buffer, jack_nframes_t frames)
 {
 #ifdef __APPLE__
-    // It seems that a vector mult only operation does not exist...
-    jack_default_audio_sample_t gain = jack_default_audio_sample_t(1.0);
-    vDSP_vsma(buffer, 1, &gain, mixbuffer, 1, mixbuffer, 1, frames);
+    vDSP_vadd(buffer, 1, mixbuffer, 1, mixbuffer, 1, frames);
 #else
     jack_nframes_t frames_group = frames / 4;
     frames = frames % 4;
 
     while (frames_group > 0) {
-#if defined (__SSE__) && !defined (__sun__)
+    #if defined (__SSE__) && !defined (__sun__)
         __m128 vec = _mm_add_ps(_mm_load_ps(mixbuffer), _mm_load_ps(buffer));
         _mm_store_ps(mixbuffer, vec);
 
         mixbuffer += 4;
         buffer += 4;
         frames_group--;
-#else
-    register jack_default_audio_sample_t mixFloat1 = *mixbuffer;
-    register jack_default_audio_sample_t sourceFloat1 = *buffer;
-    register jack_default_audio_sample_t mixFloat2 = *(mixbuffer + 1);
-    register jack_default_audio_sample_t sourceFloat2 = *(buffer + 1);
-    register jack_default_audio_sample_t mixFloat3 = *(mixbuffer + 2);
-    register jack_default_audio_sample_t sourceFloat3 = *(buffer + 2);
-    register jack_default_audio_sample_t mixFloat4 = *(mixbuffer + 3);
-    register jack_default_audio_sample_t sourceFloat4 = *(buffer + 3);
-
-    buffer += 4;
-    frames_group--;
-
-    mixFloat1 += sourceFloat1;
-    mixFloat2 += sourceFloat2;
-    mixFloat3 += sourceFloat3;
-    mixFloat4 += sourceFloat4;
-
-    *mixbuffer = mixFloat1;
-    *(mixbuffer + 1) = mixFloat2;
-    *(mixbuffer + 2) = mixFloat3;
-    *(mixbuffer + 3) = mixFloat4;
-
-    mixbuffer += 4;
-#endif
+    #else
+        register jack_default_audio_sample_t mixFloat1 = *mixbuffer;
+        register jack_default_audio_sample_t sourceFloat1 = *buffer;
+        register jack_default_audio_sample_t mixFloat2 = *(mixbuffer + 1);
+        register jack_default_audio_sample_t sourceFloat2 = *(buffer + 1);
+        register jack_default_audio_sample_t mixFloat3 = *(mixbuffer + 2);
+        register jack_default_audio_sample_t sourceFloat3 = *(buffer + 2);
+        register jack_default_audio_sample_t mixFloat4 = *(mixbuffer + 3);
+        register jack_default_audio_sample_t sourceFloat4 = *(buffer + 3);
+
+        buffer += 4;
+        frames_group--;
+
+        mixFloat1 += sourceFloat1;
+        mixFloat2 += sourceFloat2;
+        mixFloat3 += sourceFloat3;
+        mixFloat4 += sourceFloat4;
+
+        *mixbuffer = mixFloat1;
+        *(mixbuffer + 1) = mixFloat2;
+        *(mixbuffer + 2) = mixFloat3;
+        *(mixbuffer + 3) = mixFloat4;
+
+        mixbuffer += 4;
+    #endif
     }
 
     while (frames > 0) {
@@ -104,11 +102,10 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun
     jack_nframes_t frames_group = nframes / 4;
     jack_nframes_t remaining_frames = nframes % 4;
 
-    jack_default_audio_sample_t * source = static_cast<jack_default_audio_sample_t*>(src_buffers[0]);
-    jack_default_audio_sample_t * target = static_cast<jack_default_audio_sample_t*>(mixbuffer);
+    jack_default_audio_sample_t* source = static_cast<jack_default_audio_sample_t*>(src_buffers[0]);
+    jack_default_audio_sample_t* target = static_cast<jack_default_audio_sample_t*>(mixbuffer);
 
-    while (frames_group > 0)
-    {
+    while (frames_group > 0) {
         __m128 vec = _mm_load_ps(source);
         _mm_store_ps(target, vec);
         source += 4;
@@ -116,8 +113,9 @@ static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_coun
         --frames_group;
     }
 
-    for (jack_nframes_t i = 0; i != remaining_frames; ++i)
+    for (jack_nframes_t i = 0; i != remaining_frames; ++i) {
         target[i] = source[i];
+    }
 
 #else
     memcpy(mixbuffer, src_buffers[0], nframes * sizeof(jack_default_audio_sample_t));
diff --git a/common/JackClient.cpp b/common/JackClient.cpp
index fd12bc2..297f534 100644
--- a/common/JackClient.cpp
+++ b/common/JackClient.cpp
@@ -88,13 +88,15 @@ JackClient::JackClient(JackSynchro* table):fThread(this)
 JackClient::~JackClient()
 {}
 
-void JackClient::ShutDown()
+void JackClient::ShutDown(const char* message)
 {
     jack_log("JackClient::ShutDown");
  
+    // If "fInfoShutdown" callback, then call it
     if (fInfoShutdown) {
-        fInfoShutdown(JackFailure, "JACK server has been closed", fInfoShutdownArg);
+        fInfoShutdown(JackFailure, message, fInfoShutdownArg);
         fInfoShutdown = NULL;
+    // Otherwise possibly call the normal "fShutdown"
     } else if (fShutdown) {
         fShutdown(fShutdownArg);
         fShutdown = NULL;
@@ -117,7 +119,10 @@ int JackClient::Close()
     }
 
     fChannel->Close();
+    assert(JackGlobals::fSynchroMutex);
+    JackGlobals::fSynchroMutex->Lock();
     fSynchroTable[GetClientControl()->fRefNum].Disconnect();
+    JackGlobals::fSynchroMutex->Unlock();
     JackGlobals::fClientTable[GetClientControl()->fRefNum] = NULL;
     return result;
 }
@@ -146,8 +151,9 @@ void JackClient::SetupDriverSync(bool freewheel)
         }
     } else {
         jack_log("JackClient::SetupDriverSync driver sem in normal mode");
-        for (int i = 0; i < GetEngineControl()->fDriverNum; i++)
+        for (int i = 0; i < GetEngineControl()->fDriverNum; i++) {
             fSynchroTable[i].SetFlush(false);
+        }
     }
 }
 
@@ -292,10 +298,7 @@ int JackClient::ClientNotify(int refnum, const char* name, int notify, int sync,
 
             case kShutDownCallback:
                 jack_log("JackClient::kShutDownCallback");
-                if (fInfoShutdown) {
-                    fInfoShutdown((jack_status_t)value1, message, fInfoShutdownArg);
-                    fInfoShutdown = NULL;
-                }
+                ShutDown(message);
                 break;
 
             case kSessionCallback:
@@ -336,7 +339,7 @@ int JackClient::HandleLatencyCallback(int status)
     list<jack_port_id_t>::iterator it;
 
 	for (it = fPortList.begin(); it != fPortList.end(); it++) {
-	   JackPort* port = GetGraphManager()->GetPort(*it);
+        JackPort* port = GetGraphManager()->GetPort(*it);
         if ((port->GetFlags() & JackPortIsOutput) && (mode == JackPlaybackLatency)) {
             GetGraphManager()->RecalculateLatency(*it, mode);
 		}
@@ -656,7 +659,7 @@ inline void JackClient::Error()
     fThread.DropSelfRealTime();
     GetClientControl()->fActive = false;
     fChannel->ClientDeactivate(GetClientControl()->fRefNum, &result);
-    ShutDown();
+    ShutDown(JACK_SERVER_FAILURE);
     fThread.Terminate();
 }
 
@@ -667,15 +670,15 @@ inline void JackClient::Error()
 int JackClient::PortRegister(const char* port_name, const char* port_type, unsigned long flags, unsigned long buffer_size)
 {
     // Check if port name is empty
-    string port_name_str = string(port_name);
-    if (port_name_str.size() == 0) {
+    string port_short_name_str = string(port_name);
+    if (port_short_name_str.size() == 0) {
         jack_error("port_name is empty");
         return 0; // Means failure here...
     }
 
     // Check port name length
-    string name = string(GetClientControl()->fName) + string(":") + port_name_str;
-    if (name.size() >= REAL_JACK_PORT_NAME_SIZE) {
+    string port_full_name_str = string(GetClientControl()->fName) + string(":") + port_short_name_str;
+    if (port_full_name_str.size() >= REAL_JACK_PORT_NAME_SIZE) {
         jack_error("\"%s:%s\" is too long to be used as a JACK port name.\n"
                    "Please use %lu characters or less",
                    GetClientControl()->fName,
@@ -686,10 +689,10 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig
 
     int result = -1;
     jack_port_id_t port_index = NO_PORT;
-    fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result);
+    fChannel->PortRegister(GetClientControl()->fRefNum, port_full_name_str.c_str(), port_type, flags, buffer_size, &port_index, &result);
 
     if (result == 0) {
-        jack_log("JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, name.c_str(), port_type, port_index);
+        jack_log("JackClient::PortRegister ref = %ld name = %s type = %s port_index = %ld", GetClientControl()->fRefNum, port_full_name_str.c_str(), port_type, port_index);
         fPortList.push_back(port_index);
         return port_index;
     } else {
@@ -716,6 +719,14 @@ int JackClient::PortUnRegister(jack_port_id_t port_index)
 int JackClient::PortConnect(const char* src, const char* dst)
 {
     jack_log("JackClient::Connect src = %s dst = %s", src, dst);
+    if (strlen(src) >= REAL_JACK_PORT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK port name.\n", src);
+        return -1; 
+    }
+    if (strlen(dst) >= REAL_JACK_PORT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK port name.\n", src);
+        return -1; 
+    }
     int result = -1;
     fChannel->PortConnect(GetClientControl()->fRefNum, src, dst, &result);
     return result;
@@ -724,6 +735,14 @@ int JackClient::PortConnect(const char* src, const char* dst)
 int JackClient::PortDisconnect(const char* src, const char* dst)
 {
     jack_log("JackClient::Disconnect src = %s dst = %s", src, dst);
+    if (strlen(src) >= REAL_JACK_PORT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK port name.\n", src);
+        return -1; 
+    }
+    if (strlen(dst) >= REAL_JACK_PORT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK port name.\n", src);
+        return -1; 
+    }
     int result = -1;
     fChannel->PortDisconnect(GetClientControl()->fRefNum, src, dst, &result);
     return result;
@@ -956,6 +975,8 @@ void JackClient::OnShutdown(JackShutdownCallback callback, void *arg)
     if (IsActive()) {
         jack_error("You cannot set callbacks on an active client");
     } else {
+        // Shutdown callback will either be an old API version or the new version (with info) 
+        GetClientControl()->fCallback[kShutDownCallback] = (callback != NULL);
         fShutdownArg = arg;
         fShutdown = callback;
     }
@@ -966,6 +987,7 @@ void JackClient::OnInfoShutdown(JackInfoShutdownCallback callback, void *arg)
     if (IsActive()) {
         jack_error("You cannot set callbacks on an active client");
     } else {
+        // Shutdown callback will either be an old API version or the new version (with info)
         GetClientControl()->fCallback[kShutDownCallback] = (callback != NULL);
         fInfoShutdownArg = arg;
         fInfoShutdown = callback;
diff --git a/common/JackClient.h b/common/JackClient.h
index 0c977d0..af18736 100644
--- a/common/JackClient.h
+++ b/common/JackClient.h
@@ -143,7 +143,7 @@ class SERVER_EXPORT JackClient : public JackClientInterface, public JackRunnable
         virtual int SetBufferSize(jack_nframes_t buffer_size);
         virtual int SetFreeWheel(int onoff);
         virtual int ComputeTotalLatencies();
-        virtual void ShutDown();
+        virtual void ShutDown(const char* message);
         virtual jack_native_thread_t GetThreadID();
 
         // Port management
diff --git a/common/JackClientControl.h b/common/JackClientControl.h
index 925f09d..23b536a 100644
--- a/common/JackClientControl.h
+++ b/common/JackClientControl.h
@@ -68,8 +68,9 @@ struct JackClientControl : public JackShmMemAble
     void Init(const char* name, int pid, int refnum, int uuid)
     {
         strcpy(fName, name);
-        for (int i = 0; i < kMaxNotification; i++)
+        for (int i = 0; i < kMaxNotification; i++) {
             fCallback[i] = false;
+        }
         // Always activated
         fCallback[kAddClient] = true;
         fCallback[kRemoveClient] = true;
diff --git a/common/JackConnectionManager.cpp b/common/JackConnectionManager.cpp
index 2be93fc..cefb39f 100644
--- a/common/JackConnectionManager.cpp
+++ b/common/JackConnectionManager.cpp
@@ -69,8 +69,9 @@ bool JackConnectionManager::IsLoopPathAux(int ref1, int ref2) const
             return true;
         } else {
             for (int i = 0; i < CLIENT_NUM && output[i] != EMPTY; i++) { // Otherwise recurse for all ref1 outputs
-                if (IsLoopPathAux(output[i], ref2))
+                if (IsLoopPathAux(output[i], ref2)) {
                     return true; // Stop when a path is found
+                }
             }
             return false;
         }
@@ -304,8 +305,9 @@ void JackConnectionManager::TopologicalSort(std::vector<jack_int_t>& sorted)
                 tmp.ClearItem(refnum, dst);
                 jack_int_t output_ref2[CLIENT_NUM];
                 tmp.GetOutputTable1(dst, output_ref2);
-                if (HasNoConnection(output_ref2))
+                if (HasNoConnection(output_ref2)) {
                     level.insert(dst);
+                }
             }
         }
     }
@@ -380,8 +382,9 @@ bool JackConnectionManager::IsDirectConnection(int ref1, int ref2) const
 int JackConnectionManager::GetInputRefNum(jack_port_id_t port_index) const
 {
     for (int i = 0; i < CLIENT_NUM; i++) {
-        if (fInputPort[i].CheckItem(port_index))
+        if (fInputPort[i].CheckItem(port_index)) {
             return i;
+        }
     }
 
     return -1;
@@ -393,8 +396,9 @@ int JackConnectionManager::GetInputRefNum(jack_port_id_t port_index) const
 int JackConnectionManager::GetOutputRefNum(jack_port_id_t port_index) const
 {
     for (int i = 0; i < CLIENT_NUM; i++) {
-        if (fOutputPort[i].CheckItem(port_index))
+        if (fOutputPort[i].CheckItem(port_index)) {
             return i;
+        }
     }
 
     return -1;
@@ -422,8 +426,9 @@ bool JackConnectionManager::IncFeedbackConnection(jack_port_id_t port_src, jack_
     jack_log("JackConnectionManager::IncFeedbackConnection ref1 = %ld ref2 = %ld", ref1, ref2);
     assert(ref1 >= 0 && ref2 >= 0);
 
-    if (ref1 != ref2)
+    if (ref1 != ref2) {
         DirectConnect(ref2, ref1);
+    }
 
     return fLoopFeedback.IncConnection(ref1, ref2); // Add the feedback connection
 }
@@ -437,8 +442,9 @@ bool JackConnectionManager::DecFeedbackConnection(jack_port_id_t port_src, jack_
     jack_log("JackConnectionManager::DecFeedbackConnection ref1 = %ld ref2 = %ld", ref1, ref2);
     assert(ref1 >= 0 && ref2 >= 0);
 
-    if (ref1 != ref2)
+    if (ref1 != ref2) {
         DirectDisconnect(ref2, ref1);
+    }
 
     return fLoopFeedback.DecConnection(ref1, ref2); // Remove the feedback connection
 }
diff --git a/common/JackConstants.h b/common/JackConstants.h
index 6d7cb47..8ec8a8f 100644
--- a/common/JackConstants.h
+++ b/common/JackConstants.h
@@ -24,7 +24,7 @@
 #include "config.h"
 #endif
 
-#define VERSION "1.9.9.4"
+#define VERSION "1.9.10"
 
 #define BUFFER_SIZE_MAX 8192
 
@@ -37,7 +37,9 @@
 #define JACK_UUID_SIZE 32
 #define JACK_SESSION_COMMAND_SIZE 256
 
-#define REAL_JACK_PORT_NAME_SIZE JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE
+#define SYNC_MAX_NAME_SIZE 256
+
+#define REAL_JACK_PORT_NAME_SIZE JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE   // full name like "client_name:short_port_name"
 
 #ifndef PORT_NUM
 #define PORT_NUM 2048
@@ -64,9 +66,6 @@
 
 #define JACK_DEFAULT_SERVER_NAME "default"
 
-#define jack_server_entry "jackdmp_entry"
-#define jack_client_entry "jack_client"
-
 #define ALL_CLIENTS -1 // for notification
 
 #define JACK_PROTOCOL_VERSION 8
@@ -76,6 +75,8 @@
 #define FREEWHEEL_DRIVER_TIMEOUT 10     // in sec
 #define DRIVER_TIMEOUT_FACTOR    10
 
+#define JACK_SERVER_FAILURE "JACK server has been closed"
+
 
 #define NO_PORT   0xFFFE
 
diff --git a/common/JackControlAPI.cpp b/common/JackControlAPI.cpp
index 3cc1141..46c366d 100644
--- a/common/JackControlAPI.cpp
+++ b/common/JackControlAPI.cpp
@@ -728,7 +728,7 @@ SERVER_EXPORT jackctl_server_t * jackctl_server_create(
     server_ptr->parameters = NULL;
     server_ptr->engine = NULL;
 
-    strcpy(value.str, JACK_DEFAULT_SERVER_NAME);
+    strcpy(value.str, JackTools::DefaultServerName());
     if (jackctl_add_parameter(
             &server_ptr->parameters,
             "name",
diff --git a/common/JackDebugClient.cpp b/common/JackDebugClient.cpp
index e5efa7d..d9bc63c 100644
--- a/common/JackDebugClient.cpp
+++ b/common/JackDebugClient.cpp
@@ -363,10 +363,10 @@ ShutDown is called:
 (Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown))
 */
 
-void JackDebugClient::ShutDown()
+void JackDebugClient::ShutDown(const char* message)
 {
     CheckClient("ShutDown");
-    fClient->ShutDown();
+    fClient->ShutDown(message);
 }
 
 //---------------------
@@ -417,7 +417,7 @@ jack_nframes_t JackDebugClient::GetCurrentTransportFrame()
     return fClient->GetCurrentTransportFrame();
 }
 
-int JackDebugClient::TransportReposition(jack_position_t* pos)
+int JackDebugClient::TransportReposition(const jack_position_t* pos)
 {
     CheckClient("TransportReposition");
     return fClient->TransportReposition(pos);
diff --git a/common/JackDebugClient.h b/common/JackDebugClient.h
index 7256552..6279099 100644
--- a/common/JackDebugClient.h
+++ b/common/JackDebugClient.h
@@ -84,7 +84,7 @@ class JackDebugClient : public JackClient
         int SetBufferSize(jack_nframes_t buffer_size);
         int SetFreeWheel(int onoff);
         int ComputeTotalLatencies();
-        void ShutDown();
+        void ShutDown(const char* message);
         jack_native_thread_t GetThreadID();
 
         // Port management
@@ -106,7 +106,7 @@ class JackDebugClient : public JackClient
         void TransportLocate(jack_nframes_t frame);
         jack_transport_state_t TransportQuery(jack_position_t* pos);
         jack_nframes_t GetCurrentTransportFrame();
-        int TransportReposition(jack_position_t* pos);
+        int TransportReposition(const jack_position_t* pos);
         void TransportStart();
         void TransportStop();
 
diff --git a/common/JackDriver.cpp b/common/JackDriver.cpp
index 4e0cbbc..99c4210 100644
--- a/common/JackDriver.cpp
+++ b/common/JackDriver.cpp
@@ -265,7 +265,8 @@ JackClientControl* JackDriver::GetClientControl() const
 
 void JackDriver::NotifyXRun(jack_time_t cur_cycle_begin, float delayed_usecs)
 {
-    fEngine->NotifyXRun(cur_cycle_begin, delayed_usecs);
+    fEngineControl->NotifyXRun(cur_cycle_begin, delayed_usecs);
+    fEngine->NotifyDriverXRun();
 }
 
 void JackDriver::NotifyBufferSize(jack_nframes_t buffer_size)
diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp
index 43b50b3..dece352 100644
--- a/common/JackEngine.cpp
+++ b/common/JackEngine.cpp
@@ -94,20 +94,6 @@ int JackEngine::Close()
     return 0;
 }
 
-void JackEngine::ShutDown()
-{
-    jack_log("JackEngine::ShutDown");
-  
-    // Shutdown remaining clients (RT is stopped)
-    for (int i = fEngineControl->fDriverNum; i < CLIENT_NUM; i++) {
-        if (JackLoadableInternalClient* loadable_client = dynamic_cast<JackLoadableInternalClient*>(fClientTable[i])) {
-            jack_log("JackEngine::ShutDown loadable client = %s", loadable_client->GetClientControl()->fName);
-            loadable_client->ShutDown();
-        } 
-    }
-}
-
-
 void JackEngine::NotifyQuit()
 {
     fChannel.NotifyQuit();
@@ -128,9 +114,9 @@ int JackEngine::AllocateRefnum()
     return -1;
 }
 
-void JackEngine::ReleaseRefnum(int ref)
+void JackEngine::ReleaseRefnum(int refnum)
 {
-    fClientTable[ref] = NULL;
+    fClientTable[refnum] = NULL;
 
     if (fEngineControl->fTemporary) {
         int i;
@@ -140,7 +126,7 @@ void JackEngine::ReleaseRefnum(int ref)
             }
         }
         if (i == CLIENT_NUM) {
-            // last client and temporay case: quit the server
+            // Last client and temporay case: quit the server
             jack_log("JackEngine::ReleaseRefnum server quit");
             fEngineControl->fTemporary = false;
             throw JackTemporaryException();
@@ -155,10 +141,10 @@ void JackEngine::ReleaseRefnum(int ref)
 void JackEngine::ProcessNext(jack_time_t cur_cycle_begin)
 {
     fLastSwitchUsecs = cur_cycle_begin;
-    if (fGraphManager->RunNextGraph())  { // True if the graph actually switched to a new state
+    if (fGraphManager->RunNextGraph())  {   // True if the graph actually switched to a new state
         fChannel.Notify(ALL_CLIENTS, kGraphOrderCallback, 0);
     }
-    fSignal.Signal();                   // Signal for threads waiting for next cycle
+    fSignal.Signal();                       // Signal for threads waiting for next cycle
 }
 
 void JackEngine::ProcessCurrent(jack_time_t cur_cycle_begin)
@@ -272,33 +258,30 @@ int JackEngine::ComputeTotalLatencies()
 
 int JackEngine::ClientNotify(JackClientInterface* client, int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2)
 {   
-    if (!client) {
-        return 0;
-    }
-    
+    // Check if notification is needed
     if (!client->GetClientControl()->fCallback[notify]) {
         jack_log("JackEngine::ClientNotify: no callback for notification = %ld", notify);
         return 0;
     }
     
-    int ret;
+    int res1;
    
     // External client
     if (dynamic_cast<JackExternalClient*>(client)) {
-       ret = client->ClientNotify(refnum, name, notify, sync, message, value1, value2);
+       res1 = client->ClientNotify(refnum, name, notify, sync, message, value1, value2);
     // Important for internal client : unlock before calling the notification callbacks
     } else {
-        bool res = Unlock();
-        ret = client->ClientNotify(refnum, name, notify, sync, message, value1, value2);
-        if (res) {
+        bool res2 = Unlock();
+        res1 = client->ClientNotify(refnum, name, notify, sync, message, value1, value2);
+        if (res2) {
             Lock();
         }
     }
     
-    if (ret < 0) {
-        jack_error("NotifyClient fails name = %s notification = %ld val1 = %ld val2 = %ld", name, notify, value1, value2);
+    if (res1 < 0) {
+        jack_error("ClientNotify fails name = %s notification = %ld val1 = %ld val2 = %ld", name, notify, value1, value2);
     }
-    return ret;
+    return res1;
 }
 
 void JackEngine::NotifyClient(int refnum, int event, int sync, const char* message, int value1, int value2)
@@ -343,19 +326,21 @@ void JackEngine::NotifyRemoveClient(const char* name, int refnum)
 {
     // Notify existing clients (including the one beeing suppressed) of the removed client
     for (int i = 0; i < CLIENT_NUM; i++) {
-        ClientNotify(fClientTable[i], refnum, name, kRemoveClient, false, "", 0, 0);
+        JackClientInterface* client = fClientTable[i];
+        if (client) {
+            ClientNotify(client, refnum, name, kRemoveClient, false, "", 0, 0);
+        }
     }
 }
 
 // Coming from the driver
-void JackEngine::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs)
+void JackEngine::NotifyDriverXRun()
 {
     // Use the audio thread => request thread communication channel
-    fEngineControl->NotifyXRun(callback_usecs, delayed_usecs);
     fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0);
 }
 
-void JackEngine::NotifyXRun(int refnum)
+void JackEngine::NotifyClientXRun(int refnum)
 {
     if (refnum == ALL_CLIENTS) {
         NotifyClients(kXRunCallback, false, "", 0, 0);
@@ -426,6 +411,7 @@ void JackEngine::NotifyActivate(int refnum)
 int JackEngine::GetInternalClientName(int refnum, char* name_res)
 {
     JackClientInterface* client = fClientTable[refnum];
+    assert(client);
     strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE);
     return 0;
 }
@@ -713,6 +699,7 @@ int JackEngine::ClientExternalClose(int refnum)
 {
     jack_log("JackEngine::ClientExternalClose ref = %ld", refnum);
     JackClientInterface* client = fClientTable[refnum];
+    assert(client);
     int res = ClientCloseAux(refnum, true);
     client->Close();
     delete client;
@@ -761,7 +748,7 @@ int JackEngine::ClientCloseAux(int refnum, bool wait)
     }
 
     // Notify running clients
-    NotifyRemoveClient(client->GetClientControl()->fName, client->GetClientControl()->fRefNum);
+    NotifyRemoveClient(client->GetClientControl()->fName, refnum);
 
     // Cleanup...
     fSynchroTable[refnum].Destroy();
@@ -842,6 +829,21 @@ int JackEngine::ClientDeactivate(int refnum)
     }
 }
 
+void JackEngine::ClientKill(int refnum)
+{
+    if (fClientTable[refnum]) {
+        jack_log("JackEngine::ClientKill ref = %ld", refnum);
+        if (ClientDeactivate(refnum) < 0) {
+            jack_error("JackEngine::ClientKill ref = %ld cannot be removed from the graph !!", refnum);
+        }
+        if (ClientExternalClose(refnum) < 0) {
+            jack_error("JackEngine::ClientKill ref = %ld cannot be closed", refnum);
+        }
+    } else {
+        jack_log("JackEngine::ClientKill ref = %ld probably already killed...", refnum);
+    }
+}
+
 //-----------------
 // Port management
 //-----------------
@@ -873,6 +875,7 @@ int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index)
 {
     jack_log("JackEngine::PortUnRegister ref = %ld port_index = %ld", refnum, port_index);
     JackClientInterface* client = fClientTable[refnum];
+    assert(client);
 
     // Disconnect port ==> notification is sent
     PortDisconnect(refnum, port_index, ALL_PORTS);
@@ -954,22 +957,22 @@ int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t ds
         fGraphManager->GetConnections(src, connections);
 
         JackPort* port = fGraphManager->GetPort(src);
-        int ret = 0;
+        int res = 0;
         if (port->GetFlags() & JackPortIsOutput) {
             for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && (connections[i] != EMPTY); i++) {
                 if (PortDisconnect(refnum, src, connections[i]) != 0) {
-                    ret = -1;
+                    res = -1;
                 }
             }
         } else {
             for (int i = 0; (i < CONNECTION_NUM_FOR_PORT) && (connections[i] != EMPTY); i++) {
                 if (PortDisconnect(refnum, connections[i], src) != 0) {
-                    ret = -1;
+                    res = -1;
                 }
             }
         }
 
-        return ret;
+        return res;
     } else if (fGraphManager->CheckPorts(src, dst) < 0) {
         return -1;
     } else if (fGraphManager->Disconnect(src, dst) == 0) {
@@ -1066,6 +1069,7 @@ void JackEngine::SessionNotify(int refnum, const char *target, jack_session_even
 int JackEngine::SessionReply(int refnum)
 {
     JackClientInterface* client = fClientTable[refnum];
+    assert(client);
     char uuid_buf[JACK_UUID_SIZE];
     snprintf(uuid_buf, sizeof(uuid_buf), "%d", client->GetClientControl()->fSessionID);
     fSessionResult->fCommandList.push_back(JackSessionCommand(uuid_buf,
diff --git a/common/JackEngine.h b/common/JackEngine.h
index ebd3eb1..3ef1c41 100644
--- a/common/JackEngine.h
+++ b/common/JackEngine.h
@@ -74,7 +74,7 @@ class SERVER_EXPORT JackEngine : public JackLockAble
         bool GenerateUniqueName(char* name);
 
         int AllocateRefnum();
-        void ReleaseRefnum(int ref);
+        void ReleaseRefnum(int refnum);
 
         int ClientNotify(JackClientInterface* client, int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);
         
@@ -101,11 +101,10 @@ class SERVER_EXPORT JackEngine : public JackLockAble
 
         int Open();
         int Close();
-        
-        void ShutDown();
-
+      
         // Client management
         int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status);
+        
         int ClientExternalOpen(const char* name, int pid, int uuid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager);
         int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait);
 
@@ -114,6 +113,8 @@ class SERVER_EXPORT JackEngine : public JackLockAble
 
         int ClientActivate(int refnum, bool is_real_time);
         int ClientDeactivate(int refnum);
+        
+        void ClientKill(int refnum);
 
         int GetClientPID(const char* name);
         int GetClientRefNum(const char* name);
@@ -141,9 +142,9 @@ class SERVER_EXPORT JackEngine : public JackLockAble
         bool Process(jack_time_t cur_cycle_begin, jack_time_t prev_cycle_end);
 
         // Notifications
-        void NotifyXRun(jack_time_t callback_usecs, float delayed_usecs);
+        void NotifyDriverXRun();
+        void NotifyClientXRun(int refnum);
         void NotifyFailure(int code, const char* reason);
-        void NotifyXRun(int refnum);
         void NotifyGraphReorder();
         void NotifyBufferSize(jack_nframes_t buffer_size);
         void NotifySampleRate(jack_nframes_t sample_rate);
diff --git a/common/JackEngineControl.h b/common/JackEngineControl.h
index f6d32f4..7101b9c 100644
--- a/common/JackEngineControl.h
+++ b/common/JackEngineControl.h
@@ -70,11 +70,11 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
     bool fVerbose;
 
     // CPU Load
-    jack_time_t  fPrevCycleTime;
-    jack_time_t  fCurCycleTime;
-    jack_time_t  fSpareUsecs;
-    jack_time_t  fMaxUsecs;
-    jack_time_t  fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
+    jack_time_t fPrevCycleTime;
+    jack_time_t fCurCycleTime;
+    jack_time_t fSpareUsecs;
+    jack_time_t fMaxUsecs;
+    jack_time_t fRollingClientUsecs[JACK_ENGINE_ROLLING_COUNT];
     unsigned int fRollingClientUsecsCnt;
     int	fRollingClientUsecsIndex;
     int	fRollingInterval;
diff --git a/common/JackError.cpp b/common/JackError.cpp
index 6b386f5..39a67ed 100644
--- a/common/JackError.cpp
+++ b/common/JackError.cpp
@@ -59,12 +59,13 @@ void jack_log_function(int level, const char *message)
 
 static void jack_format_and_log(int level, const char *prefix, const char *fmt, va_list ap)
 {
-    char buffer[300];
+    char buffer[256];
     size_t len;
     jack_log_function_t log_function;
 
     if (prefix != NULL) {
         len = strlen(prefix);
+        assert(len < 256);
         memcpy(buffer, prefix, len);
     } else {
         len = 0;
diff --git a/common/JackFilters.h b/common/JackFilters.h
index 6b5f0d3..e245d58 100644
--- a/common/JackFilters.h
+++ b/common/JackFilters.h
@@ -46,8 +46,9 @@ namespace Jack
 
         JackFilter()
         {
-            for (int i = 0; i < MAX_SIZE; i++)
+            for (int i = 0; i < MAX_SIZE; i++) {
                 fTable[i] = 0;
+            }
         }
 
         void AddValue(jack_time_t val)
@@ -59,8 +60,9 @@ namespace Jack
         jack_time_t GetVal()
         {
             jack_time_t mean = 0;
-            for (int i = 0; i < MAX_SIZE; i++)
+            for (int i = 0; i < MAX_SIZE; i++) {
                 mean += fTable[i];
+            }
             return mean / MAX_SIZE;
         }
 
diff --git a/common/JackGenericClientChannel.h b/common/JackGenericClientChannel.h
index e866fee..fb12591 100644
--- a/common/JackGenericClientChannel.h
+++ b/common/JackGenericClientChannel.h
@@ -57,8 +57,6 @@ class JackGenericClientChannel : public detail::JackClientChannelInterface
 
         void ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status, int* result, int open);
         void ClientOpen(const char* name, int pid, int uuid, int* shared_engine, int* shared_client, int* shared_graph, int* result);
-        void ClientOpen(const char* name, int* ref, int uuid, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, int* result)
-        {}
         void ClientClose(int refnum, int* result);
 
         void ClientActivate(int refnum, int is_real_time, int* result);
diff --git a/common/JackGlobals.cpp b/common/JackGlobals.cpp
index b3f8eee..1047d16 100644
--- a/common/JackGlobals.cpp
+++ b/common/JackGlobals.cpp
@@ -34,6 +34,7 @@ jack_tls_key JackGlobals::fKeyLogFunction;
 static bool fKeyLogFunctionInitialized = jack_tls_allocate_key(&JackGlobals::fKeyLogFunction);
 
 JackMutex* JackGlobals::fOpenMutex = new JackMutex();
+JackMutex* JackGlobals::fSynchroMutex = new JackMutex();
 volatile bool JackGlobals::fServerRunning = false;
 JackClient* JackGlobals::fClientTable[CLIENT_NUM] = {};
 
@@ -61,7 +62,13 @@ void JackGlobals::CheckContext(const char* name)
         JackGlobals::fStream = new std::ofstream(provstr, std::ios_base::ate);
         JackGlobals::fStream->is_open();
     }
+#ifdef PTHREAD_WIN32 /* Added by JE - 10-10-2011 */
+    (*fStream) << "JACK API call : " << name << ", calling thread : " << pthread_self().p << std::endl;
+#elif defined(WIN32) && !defined(__CYGWIN__)
+    (*fStream) << "JACK API call : " << name << ", calling thread : " << GetCurrentThread() << std::endl;
+#else
     (*fStream) << "JACK API call : " << name << ", calling thread : " << pthread_self() << std::endl;
+#endif
 }
 
 #else
diff --git a/common/JackGlobals.h b/common/JackGlobals.h
index 3c87c6b..5d7c242 100644
--- a/common/JackGlobals.h
+++ b/common/JackGlobals.h
@@ -41,8 +41,9 @@ struct JackGlobals {
     static jack_tls_key fNotificationThread;
     static jack_tls_key fKeyLogFunction;
     static JackMutex* fOpenMutex;
+    static JackMutex* fSynchroMutex;
     static volatile bool fServerRunning;
-    static JackClient* fClientTable[];
+    static JackClient* fClientTable[CLIENT_NUM];
     static bool fVerbose;
 #ifndef WIN32
     static jack_thread_creator_t fJackThreadCreator;
diff --git a/common/JackInternalClient.cpp b/common/JackInternalClient.cpp
index df0cad1..16a87fd 100644
--- a/common/JackInternalClient.cpp
+++ b/common/JackInternalClient.cpp
@@ -68,6 +68,14 @@ int JackInternalClient::Open(const char* server_name, const char* name, int uuid
     int result;
     char name_res[JACK_CLIENT_NAME_SIZE + 1];
     jack_log("JackInternalClient::Open name = %s", name);
+    
+    if (strlen(name) >= JACK_CLIENT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK client name.\n"
+                   "Please use %lu characters or less",
+                   name,
+                   JACK_CLIENT_NAME_SIZE - 1);
+        return -1; 
+    }
 
     strncpy(fServerName, server_name, sizeof(fServerName));
 
@@ -102,10 +110,10 @@ error:
     return -1;
 }
 
-void JackInternalClient::ShutDown()
+void JackInternalClient::ShutDown(const char* message)
 {
     jack_log("JackInternalClient::ShutDown");
-    JackClient::ShutDown();
+    JackClient::ShutDown(message);
 }
 
 JackGraphManager* JackInternalClient::GetGraphManager() const
diff --git a/common/JackInternalClient.h b/common/JackInternalClient.h
index e47066c..2c2b6aa 100644
--- a/common/JackInternalClient.h
+++ b/common/JackInternalClient.h
@@ -47,7 +47,7 @@ class JackInternalClient : public JackClient
         virtual ~JackInternalClient();
 
         int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status);
-        void ShutDown();
+        void ShutDown(const char* message);
 
         JackGraphManager* GetGraphManager() const;
         JackEngineControl* GetEngineControl() const;
diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp
index 72b0564..a02175d 100644
--- a/common/JackLibClient.cpp
+++ b/common/JackLibClient.cpp
@@ -62,11 +62,11 @@ ShutDown is called:
 (Not needed since the synch object used (Sema of Fifo will fails when server quits... see ShutDown))
 */
 
-void JackLibClient::ShutDown()
+void JackLibClient::ShutDown(const char* message)
 {
     jack_log("JackLibClient::ShutDown");
     JackGlobals::fServerRunning = false;
-    JackClient::ShutDown();
+    JackClient::ShutDown(message);
 }
 
 JackLibClient::JackLibClient(JackSynchro* table): JackClient(table)
@@ -84,8 +84,17 @@ JackLibClient::~JackLibClient()
 int JackLibClient::Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status)
 {
     int shared_engine, shared_client, shared_graph, result;
+    bool res;
     jack_log("JackLibClient::Open name = %s", name);
-
+  
+    if (strlen(name) >= JACK_CLIENT_NAME_SIZE) {
+        jack_error("\"%s\" is too long to be used as a JACK client name.\n"
+                   "Please use %lu characters or less",
+                   name,
+                   JACK_CLIENT_NAME_SIZE - 1);
+        return -1; 
+    }
+    
     strncpy(fServerName, server_name, sizeof(fServerName));
 
     // Open server/client channel
@@ -122,7 +131,11 @@ int JackLibClient::Open(const char* server_name, const char* name, int uuid, jac
     SetupDriverSync(false);
 
     // Connect shared synchro : the synchro must be usable in I/O mode when several clients live in the same process
-    if (!fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName)) {
+    assert(JackGlobals::fSynchroMutex);
+    JackGlobals::fSynchroMutex->Lock();
+    res = fSynchroTable[GetClientControl()->fRefNum].Connect(name_res, fServerName);
+    JackGlobals::fSynchroMutex->Unlock();
+    if (!res) {
         jack_error("Cannot ConnectSemaphore %s client", name_res);
         goto error;
     }
@@ -145,6 +158,8 @@ error:
 int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2)
 {
     int res = 0;
+    assert(JackGlobals::fSynchroMutex);
+    JackGlobals::fSynchroMutex->Lock();
 
     // Done all time
     switch (notify) {
@@ -157,11 +172,13 @@ int JackLibClient::ClientNotifyImp(int refnum, const char* name, int notify, int
 
         case kRemoveClient:
             jack_log("JackClient::RemoveClient name = %s, ref = %ld ", name, refnum);
-            if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0)
+            if (GetClientControl() && strcmp(GetClientControl()->fName, name) != 0) {
                 res = fSynchroTable[refnum].Disconnect() ? 0 : -1;
+            }
             break;
     }
 
+    JackGlobals::fSynchroMutex->Unlock();
     return res;
 }
 
diff --git a/common/JackLibClient.h b/common/JackLibClient.h
index 5e78b6f..0486fc8 100644
--- a/common/JackLibClient.h
+++ b/common/JackLibClient.h
@@ -45,7 +45,7 @@ class JackLibClient : public JackClient
         virtual ~JackLibClient();
 
         int Open(const char* server_name, const char* name, int uuid, jack_options_t options, jack_status_t* status);
-        void ShutDown();
+        void ShutDown(const char* message);
 
         int ClientNotifyImp(int refnum, const char* name, int notify, int sync, const char* message, int value1, int value2);
 
diff --git a/common/JackLibGlobals.h b/common/JackLibGlobals.h
index 6d77e46..2b2e02d 100644
--- a/common/JackLibGlobals.h
+++ b/common/JackLibGlobals.h
@@ -108,7 +108,7 @@ struct JackLibGlobals
                     jack_error("Cleanup client ref = %d", i);
                     client->Close();
                     delete client;
-                    JackGlobals::fClientTable[CLIENT_NUM] = NULL;
+                    JackGlobals::fClientTable[i] = NULL;
                 }
             }
 
diff --git a/common/JackLockedEngine.h b/common/JackLockedEngine.h
index a1dc807..309b837 100644
--- a/common/JackLockedEngine.h
+++ b/common/JackLockedEngine.h
@@ -103,15 +103,7 @@ class SERVER_EXPORT JackLockedEngine
             return fEngine.Close();
             CATCH_EXCEPTION_RETURN
         }
-        
-        void ShutDown()
-        {
-            // No lock needed
-            TRY_CALL
-            fEngine.ShutDown();
-            CATCH_EXCEPTION
-        }
-
+ 
         // Client management
         int ClientCheck(const char* name, int uuid, char* name_res, int protocol, int options, int* status)
         {
@@ -164,6 +156,13 @@ class SERVER_EXPORT JackLockedEngine
             return (fEngine.CheckClient(refnum)) ? fEngine.ClientDeactivate(refnum) : -1;
             CATCH_EXCEPTION_RETURN
         }
+        void ClientKill(int refnum)
+        {
+            TRY_CALL
+            JackLock lock(&fEngine);
+            fEngine.ClientKill(refnum);
+            CATCH_EXCEPTION
+        }
 
         // Internal client management
         int GetInternalClientName(int int_ref, char* name_res)
@@ -259,16 +258,18 @@ class SERVER_EXPORT JackLockedEngine
         }
 
         // Notifications
-        void NotifyXRun(jack_time_t cur_cycle_begin, float delayed_usecs)
+        void NotifyDriverXRun()
         {
-            // RT : no lock
-            fEngine.NotifyXRun(cur_cycle_begin, delayed_usecs);
+            // Coming from the driver in RT : no lock
+            fEngine.NotifyDriverXRun();
         }
 
-        void NotifyXRun(int refnum)
+        void NotifyClientXRun(int refnum)
         {
-            // RT : no lock
-            fEngine.NotifyXRun(refnum);
+            TRY_CALL
+            JackLock lock(&fEngine);
+            fEngine.NotifyClientXRun(refnum);
+            CATCH_EXCEPTION
         }
 
         void NotifyGraphReorder()
diff --git a/common/JackNetDriver.cpp b/common/JackNetDriver.cpp
index 12019ba..02b2033 100644
--- a/common/JackNetDriver.cpp
+++ b/common/JackNetDriver.cpp
@@ -286,7 +286,7 @@ namespace Jack
             //port latency
             port = fGraphManager->GetPort(port_index);
             port->SetAlias(alias);
-            range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize);
+            range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize));
             port->SetLatencyRange(JackPlaybackLatency, &range);
             fPlaybackPortList[audio_port_index] = port_index;
             jack_log("JackNetDriver::AllocPorts() fPlaybackPortList[%d] audio_port_index = %ld fPortLatency = %ld", audio_port_index, port_index, port->GetLatency());
@@ -321,7 +321,7 @@ namespace Jack
 
             //port latency
             port = fGraphManager->GetPort(port_index);
-            range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + (fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize);
+            range.min = range.max = (fParams.fNetworkLatency * fEngineControl->fBufferSize + ((fEngineControl->fSyncMode) ? 0 : fEngineControl->fBufferSize));
             port->SetLatencyRange(JackPlaybackLatency, &range);
             fMidiPlaybackPortList[midi_port_index] = port_index;
             jack_log("JackNetDriver::AllocPorts() fMidiPlaybackPortList[%d] midi_port_index = %ld fPortLatency = %ld", midi_port_index, port_index, port->GetLatency());
diff --git a/common/JackNetInterface.cpp b/common/JackNetInterface.cpp
index 6a04550..3ad42b1 100644
--- a/common/JackNetInterface.cpp
+++ b/common/JackNetInterface.cpp
@@ -632,7 +632,7 @@ namespace Jack
     bool JackNetSlaveInterface::InitConnection(int time_out_sec)
     {
         jack_log("JackNetSlaveInterface::InitConnection()");
-        uint try_count = (time_out_sec > 0) ? ((1000000 * time_out_sec) / SLAVE_INIT_TIMEOUT) : LONG_MAX;
+        uint try_count = (time_out_sec > 0) ? ((1000000 * time_out_sec) / SLAVE_INIT_TIMEOUT) : UINT_MAX;
 
         // set the parameters to send
         strcpy(fParams.fPacketType, "params");
diff --git a/common/JackNetManager.cpp b/common/JackNetManager.cpp
index 9364eb4..23b8fd0 100644
--- a/common/JackNetManager.cpp
+++ b/common/JackNetManager.cpp
@@ -513,7 +513,7 @@ namespace Jack
             return res;
         } else if (res == NET_PACKET_ERROR) {
             // Well not a real XRun...
-            JackServerGlobals::fInstance->GetEngine()->NotifyXRun(GetMicroSeconds(), 0);
+            JackServerGlobals::fInstance->GetEngine()->NotifyClientXRun(ALL_CLIENTS);
         }
 
 #ifdef JACK_MONITOR
@@ -640,15 +640,15 @@ namespace Jack
     int JackNetMasterManager::SyncCallback(jack_transport_state_t state, jack_position_t* pos)
     {
         //check if each slave is ready to roll
-        int ret = 1;
+        int res = 1;
         master_list_it_t it;
         for (it = fMasterList.begin(); it != fMasterList.end(); it++) {
             if (!(*it)->IsSlaveReadyToRoll()) {
-                ret = 0;
+                res = 0;
             }
         }
-        jack_log("JackNetMasterManager::SyncCallback returns '%s'", (ret) ? "true" : "false");
-        return ret;
+        jack_log("JackNetMasterManager::SyncCallback returns '%s'", (res) ? "true" : "false");
+        return res;
     }
 
     void* JackNetMasterManager::NetManagerThread(void* arg)
diff --git a/common/JackNetTool.h b/common/JackNetTool.h
index c622ace..5d4559a 100644
--- a/common/JackNetTool.h
+++ b/common/JackNetTool.h
@@ -324,9 +324,6 @@ namespace Jack
             virtual int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num) = 0;
             virtual int RenderToNetwork(int sub_cycle, uint32_t port_num) = 0;
 
-            virtual void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size) {}
-            virtual void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle, size_t copy_size) {}
-
             virtual int ActivePortsToNetwork(char* net_buffer);
             virtual void ActivePortsFromNetwork(char* net_buffer, uint32_t port_num);
 
@@ -340,6 +337,10 @@ namespace Jack
             int fPacketSize;
 
             void UpdateParams(int active_ports);
+        
+        
+            void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle);
+            void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle);
 
         public:
 
@@ -357,9 +358,6 @@ namespace Jack
             int RenderFromNetwork(int cycle, int sub_cycle, uint32_t port_num);
             int RenderToNetwork(int sub_cycle, uint32_t port_num);
 
-            void RenderFromNetwork(char* net_buffer, int active_port, int sub_cycle);
-            void RenderToNetwork(char* net_buffer, int active_port, int sub_cycle);
-
     };
 
 #if HAVE_CELT
diff --git a/common/JackNotification.h b/common/JackNotification.h
index 673ab83..74b9df4 100644
--- a/common/JackNotification.h
+++ b/common/JackNotification.h
@@ -47,7 +47,7 @@ enum NotificationType {
     kQUIT = 16,
     kSessionCallback = 17,
     kLatencyCallback = 18,
-    kMaxNotification
+    kMaxNotification = 64  // To keep some room in JackClientControl fCallback table
 };
 
 } // end of namespace
diff --git a/common/JackRequest.h b/common/JackRequest.h
index 206454a..56c203a 100644
--- a/common/JackRequest.h
+++ b/common/JackRequest.h
@@ -408,7 +408,7 @@ struct JackPortRegisterRequest : public JackRequest
 {
 
     int fRefNum;
-    char fName[JACK_PORT_NAME_SIZE + 1];
+    char fName[JACK_PORT_NAME_SIZE + 1];   // port short name
     char fPortType[JACK_PORT_TYPE_SIZE + 1];
     unsigned int fFlags;
     unsigned int fBufferSize;
@@ -517,8 +517,8 @@ struct JackPortConnectNameRequest : public JackRequest
 {
 
     int fRefNum;
-    char fSrc[JACK_PORT_NAME_SIZE + 1];
-    char fDst[JACK_PORT_NAME_SIZE + 1];
+    char fSrc[REAL_JACK_PORT_NAME_SIZE + 1];    // port full name
+    char fDst[REAL_JACK_PORT_NAME_SIZE + 1];    // port full name
 
     JackPortConnectNameRequest()
     {}
@@ -559,8 +559,8 @@ struct JackPortDisconnectNameRequest : public JackRequest
 {
 
     int fRefNum;
-    char fSrc[JACK_PORT_NAME_SIZE + 1];
-    char fDst[JACK_PORT_NAME_SIZE + 1];
+    char fSrc[REAL_JACK_PORT_NAME_SIZE + 1];    // port full name
+    char fDst[REAL_JACK_PORT_NAME_SIZE + 1];    // port full name
 
     JackPortDisconnectNameRequest()
     {}
@@ -678,7 +678,7 @@ struct JackPortRenameRequest : public JackRequest
 
     int fRefNum;
     jack_port_id_t fPort;
-    char fName[JACK_PORT_NAME_SIZE + 1];
+    char fName[JACK_PORT_NAME_SIZE + 1];   // port short name
 
     JackPortRenameRequest()
     {}
@@ -1194,7 +1194,7 @@ struct JackClientNotificationRequest : public JackRequest
 struct JackSessionCommand
 {
     char fUUID[JACK_UUID_SIZE];
-    char fClientName[JACK_CLIENT_NAME_SIZE+1];
+    char fClientName[JACK_CLIENT_NAME_SIZE + 1];
     char fCommand[JACK_SESSION_COMMAND_SIZE];
     jack_session_flags_t fFlags;
 
diff --git a/common/JackServer.cpp b/common/JackServer.cpp
index b7e7639..ddcadb2 100644
--- a/common/JackServer.cpp
+++ b/common/JackServer.cpp
@@ -37,6 +37,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 namespace Jack
 {
 
+//----------------
+// Server control 
+//----------------
+
 JackServer::JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, const char* server_name)
 {
     if (rt) {
@@ -53,8 +57,7 @@ JackServer::JackServer(bool sync, bool temporary, int timeout, bool rt, int prio
     // regular freewheel driver because the freewheel driver needs to run in
     // threaded mode when freewheel mode is active and needs to run as a slave
     // when freewheel mode isn't active.
-    JackFreewheelDriver *freewheelDriver =
-        new JackFreewheelDriver(fEngine, GetSynchroTable());
+    JackFreewheelDriver* freewheelDriver = new JackFreewheelDriver(fEngine, GetSynchroTable());
     fThreadedFreewheelDriver = new JackThreadedDriver(freewheelDriver);
 
     fFreewheelDriver = freewheelDriver;
@@ -87,7 +90,7 @@ int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params)
         goto fail_close1;
     }
 
-    if (fChannel.Open(fEngineControl->fServerName, this) < 0) {
+    if (fRequestChannel.Open(fEngineControl->fServerName, this) < 0) {
         jack_error("Server channel open error");
         goto fail_close2;
     }
@@ -121,7 +124,7 @@ fail_close4:
     fEngine->Close();
 
 fail_close3:
-    fChannel.Close();
+    fRequestChannel.Close();
 
 fail_close2:
     fAudioDriver->Close();
@@ -134,7 +137,7 @@ fail_close1:
 int JackServer::Close()
 {
     jack_log("JackServer::Close");
-    fChannel.Close();
+    fRequestChannel.Close();
     fAudioDriver->Detach();
     fAudioDriver->Close();
     fFreewheelDriver->Close();
@@ -145,6 +148,38 @@ int JackServer::Close()
     return 0;
 }
 
+int JackServer::Start()
+{
+    jack_log("JackServer::Start");
+    if (fAudioDriver->Start() < 0) {
+        return -1;
+    }
+    return fRequestChannel.Start();
+}
+
+int JackServer::Stop()
+{
+    jack_log("JackServer::Stop");
+    int res = (fFreewheel) ? fThreadedFreewheelDriver->Stop() : fAudioDriver->Stop();
+    
+    fEngine->NotifyQuit();
+    fRequestChannel.Stop();
+    fEngine->NotifyFailure(JackFailure, JACK_SERVER_FAILURE);
+    
+    return res;
+}
+
+bool JackServer::IsRunning()
+{
+    jack_log("JackServer::IsRunning");
+    assert(fAudioDriver);
+    return fAudioDriver->IsRunning();
+}
+
+//------------------
+// Internal clients 
+//------------------
+
 int JackServer::InternalClientLoad1(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int uuid, int* status)
 {
     JackLoadableInternalClient* client = new JackLoadableInternalClient1(JackServerGlobals::fInstance, GetSynchroTable(), objet_data);
@@ -165,7 +200,7 @@ int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const
     *status = 0;
 
     // Client object is internally kept in JackEngine
-    if ((client->Init(so_name) < 0) || (client->Open(JACK_DEFAULT_SERVER_NAME, client_name,  uuid, (jack_options_t)options, (jack_status_t*)status) < 0)) {
+    if ((client->Init(so_name) < 0) || (client->Open(JackTools::DefaultServerName(), client_name,  uuid, (jack_options_t)options, (jack_status_t*)status) < 0)) {
         delete client;
         int my_status1 = *status | JackFailure;
         *status = (jack_status_t)my_status1;
@@ -177,36 +212,9 @@ int JackServer::InternalClientLoadAux(JackLoadableInternalClient* client, const
     }
  }
 
-int JackServer::Start()
-{
-    jack_log("JackServer::Start");
-    if (fAudioDriver->Start() < 0) {
-        return -1;
-    }
-    return fChannel.Start();
-}
-
-int JackServer::Stop()
-{
-    jack_log("JackServer::Stop");
-    fEngine->NotifyQuit();
-    fChannel.Stop();
-    
-    fEngine->ShutDown();
-
-    if (fFreewheel) {
-        return fThreadedFreewheelDriver->Stop();
-    } else {
-        return fAudioDriver->Stop();
-    }
-}
-
-bool JackServer::IsRunning()
-{
-    jack_log("JackServer::IsRunning");
-    assert(fAudioDriver);
-    return fAudioDriver->IsRunning();
-}
+//---------------------------
+// From request thread : API 
+//---------------------------
 
 int JackServer::SetBufferSize(jack_nframes_t buffer_size)
 {
@@ -284,7 +292,10 @@ int JackServer::SetFreewheel(bool onoff)
     }
 }
 
+//---------------------------
 // Coming from the RT thread
+//---------------------------
+
 void JackServer::Notify(int refnum, int notify, int value)
 {
     switch (notify) {
@@ -294,25 +305,14 @@ void JackServer::Notify(int refnum, int notify, int value)
             break;
 
         case kXRunCallback:
-            fEngine->NotifyXRun(refnum);
+            fEngine->NotifyClientXRun(refnum);
             break;
     }
 }
 
-void JackServer::ClientKill(int refnum)
-{
-    jack_log("JackServer::ClientKill ref = %ld", refnum);
-    if (fEngine->ClientDeactivate(refnum) < 0) {
-        jack_error("JackServer::ClientKill ref = %ld cannot be removed from the graph !!", refnum);
-    }
-    if (fEngine->ClientExternalClose(refnum) < 0) {
-        jack_error("JackServer::ClientKill ref = %ld cannot be closed", refnum);
-    }
-}
-
-//----------------------
+//--------------------
 // Backend management
-//----------------------
+//--------------------
 
 JackDriverInfo* JackServer::AddSlave(jack_driver_desc_t* driver_desc, JSList* driver_params)
 {
diff --git a/common/JackServer.h b/common/JackServer.h
index 0403272..245b2d9 100644
--- a/common/JackServer.h
+++ b/common/JackServer.h
@@ -55,7 +55,7 @@ class SERVER_EXPORT JackServer
         JackLockedEngine* fEngine;
         JackEngineControl* fEngineControl;
         JackGraphManager* fGraphManager;
-        JackServerChannel fChannel;
+        JackServerChannel fRequestChannel;
         JackConnectionManager fConnectionState;
         JackSynchro fSynchroTable[CLIENT_NUM];
         bool fFreewheel;
@@ -67,23 +67,26 @@ class SERVER_EXPORT JackServer
         JackServer(bool sync, bool temporary, int timeout, bool rt, int priority, int port_max, bool verbose, jack_timer_type_t clock, const char* server_name);
         ~JackServer();
 
+        // Server control
         int Open(jack_driver_desc_t* driver_desc, JSList* driver_params);
         int Close();
 
         int Start();
         int Stop();
+        
         bool IsRunning();
 
         // RT thread
         void Notify(int refnum, int notify, int value);
 
-        // Command thread : API
+        // From request thread : API 
         int SetBufferSize(jack_nframes_t buffer_size);
         int SetFreewheel(bool onoff);
+        
+        // Internals clients
         int InternalClientLoad1(const char* client_name, const char* so_name, const char* objet_data, int options, int* int_ref, int uuid, int* status);
         int InternalClientLoad2(const char* client_name, const char* so_name, const JSList * parameters, int options, int* int_ref, int uuid, int* status);
-        void ClientKill(int refnum);
-
+   
         // Transport management
         int ReleaseTimebase(int refnum);
         int SetTimebaseCallback(int refnum, int conditional);
diff --git a/common/JackServerGlobals.cpp b/common/JackServerGlobals.cpp
index 21feb7f..4a21bff 100644
--- a/common/JackServerGlobals.cpp
+++ b/common/JackServerGlobals.cpp
@@ -31,7 +31,6 @@ namespace Jack
 
 JackServer* JackServerGlobals::fInstance;
 unsigned int JackServerGlobals::fUserCount;
-int JackServerGlobals::fRTNotificationSocket;
 std::map<std::string, JackDriverInfo*> JackServerGlobals::fSlavesList;
 std::map<std::string, int> JackServerGlobals::fInternalsList;
 
@@ -115,7 +114,7 @@ bool JackServerGlobals::Init()
     int loopback = 0;
     int sync = 0;
     int rc, i;
-    int ret;
+    int res;
     int replace_registry = 0;
 
     FILE* fp = 0;
@@ -175,11 +174,11 @@ bool JackServerGlobals::Init()
 
         argc = 0;
         if (fp) {
-            ret = fscanf(fp, "%s", buffer);
-            while (ret != 0 && ret != EOF) {
+            res = fscanf(fp, "%s", buffer);
+            while (res != 0 && res != EOF) {
                 argv[argc] = (char*)malloc(64);
                 strcpy(argv[argc], buffer);
-                ret = fscanf(fp, "%s", buffer);
+                res = fscanf(fp, "%s", buffer);
                 argc++;
             }
             fclose(fp);
@@ -305,8 +304,9 @@ bool JackServerGlobals::Init()
         }
 
 #ifndef WIN32
-        if (server_name == NULL)
+        if (server_name == NULL) {
             server_name = (char*)JackTools::DefaultServerName();
+        }
 #endif
 
         rc = jack_register_server(server_name, false);
@@ -328,8 +328,9 @@ bool JackServerGlobals::Init()
         jack_cleanup_shm();
         JackTools::CleanupFiles(server_name);
 
-        if (!realtime && client_timeout == 0)
+        if (!realtime && client_timeout == 0) {
             client_timeout = 500; /* 0.5 sec; usable when non realtime. */
+        }
 
         for (i = 0; i < argc; i++) {
             free(argv[i]);
@@ -377,14 +378,16 @@ bool JackServerGlobals::Init()
         }
     }
 
-    if (master_driver_params)
+    if (master_driver_params) {
         jack_free_driver_params(master_driver_params);
+    }
     return true;
 
 error:
     jack_log("JackServerGlobals Init error");
-    if (master_driver_params)
+    if (master_driver_params) {
         jack_free_driver_params(master_driver_params);
+    }
     Destroy();
     return false;
 }
diff --git a/common/JackServerGlobals.h b/common/JackServerGlobals.h
index 69b8979..a98596d 100644
--- a/common/JackServerGlobals.h
+++ b/common/JackServerGlobals.h
@@ -39,7 +39,6 @@ struct SERVER_EXPORT JackServerGlobals
 {
     static JackServer* fInstance;
     static unsigned int fUserCount;
-    static int fRTNotificationSocket;  // For debugging purpose
     static std::map<std::string, JackDriverInfo*> fSlavesList;
     static std::map<std::string, int> fInternalsList;
 
diff --git a/common/JackSynchro.h b/common/JackSynchro.h
index 0518001..3c9a8d5 100644
--- a/common/JackSynchro.h
+++ b/common/JackSynchro.h
@@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 #ifndef __JackSynchro__
 #define __JackSynchro__
 
-#define SYNC_MAX_NAME_SIZE 256
+#include "JackConstants.h"
 
 namespace Jack
 {
@@ -40,9 +40,6 @@ class JackSynchro
         char fName[SYNC_MAX_NAME_SIZE];
         bool fFlush; // If true, signal are "flushed" : used for drivers that do no consume the signal
 
-        void BuildName(const char* name, const char* server_name, char* res)
-        {}
-
     public:
 
         JackSynchro(): fFlush(false)
diff --git a/common/JackTools.cpp b/common/JackTools.cpp
index 58ca9b1..9da9a39 100644
--- a/common/JackTools.cpp
+++ b/common/JackTools.cpp
@@ -79,8 +79,9 @@ namespace Jack {
     const char* JackTools::DefaultServerName()
     {
         const char* server_name;
-        if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL)
+        if ((server_name = getenv("JACK_DEFAULT_SERVER")) == NULL) {
             server_name = JACK_DEFAULT_SERVER_NAME;
+        }
         return server_name;
     }
 
@@ -226,10 +227,11 @@ namespace Jack {
     {
         size_t i;
         for (i = 0; i < strlen(name); i++) {
-            if ((name[i] == '/') || (name[i] == '\\'))
+            if ((name[i] == '/') || (name[i] == '\\')) {
                 new_name[i] = '_';
-            else
+            } else {
                 new_name[i] = name[i];
+            }
         }
         new_name[i] = '\0';
     }
diff --git a/common/JackTransportEngine.cpp b/common/JackTransportEngine.cpp
index fdcea0c..5c0fa8d 100644
--- a/common/JackTransportEngine.cpp
+++ b/common/JackTransportEngine.cpp
@@ -194,7 +194,7 @@ void JackTransportEngine::CycleEnd(JackClientInterface** table, jack_nframes_t f
                 fTransportState = JackTransportStopped;
                 MakeAllStopping(table);
             } else if (fPendingPos) {
-                jack_log("transport starting ==> starting frame = %d"), ReadCurrentState()->frame;
+                jack_log("transport starting ==> starting frame = %d", ReadCurrentState()->frame);
                 fTransportState = JackTransportStarting;
                 MakeAllStartingLocating(table);
                 SyncTimeout(frame_rate, buffer_size);
diff --git a/common/JackTypes.h b/common/JackTypes.h
index b4bad8d..04f186e 100644
--- a/common/JackTypes.h
+++ b/common/JackTypes.h
@@ -21,6 +21,7 @@
 #ifndef __JackTypes__
 #define __JackTypes__
 
+#include "types.h"
 #include "JackCompilerDeps.h"
 
 typedef unsigned short UInt16;
@@ -34,12 +35,6 @@ typedef signed long   SInt32;
 
 #include "JackTypes_os.h"
 
-/**
- * Type used to represent the value of free running
- * monotonic clock with units of microseconds.
- */
-typedef uint64_t jack_time_t;
-
 typedef uint16_t jack_int_t;  // Internal type for ports and refnum
 
 typedef enum {
diff --git a/common/Jackdmp.cpp b/common/Jackdmp.cpp
index 2aec190..640955d 100644
--- a/common/Jackdmp.cpp
+++ b/common/Jackdmp.cpp
@@ -1,6 +1,6 @@
 /*
 Copyright (C) 2001 Paul Davis
-Copyright (C) 2004-2008 Grame
+Copyright (C) 2004-2013 Grame
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
@@ -31,7 +31,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #include "types.h"
 #include "jack.h"
 #include "control.h"
-
 #include "JackConstants.h"
 #include "JackPlatformPlug.h"
 
@@ -41,7 +40,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #endif
 
 /*
-This is a simple port of the old jackdmp.cpp file to use the new Jack 2.0 control API. Available options for the server
+This is a simple port of the old jackdmp.cpp file to use the new jack2 control API. Available options for the server
 are "hard-coded" in the source. A much better approach would be to use the control API to:
 - dynamically retrieve available server parameters and then prepare to parse them
 - get available drivers and their possible parameters, then prepare to parse them.
@@ -88,51 +87,12 @@ static void copyright(FILE* file)
 {
     fprintf(file, "jackdmp " VERSION "\n"
             "Copyright 2001-2005 Paul Davis and others.\n"
-            "Copyright 2004-2012 Grame.\n"
+            "Copyright 2004-2013 Grame.\n"
             "jackdmp comes with ABSOLUTELY NO WARRANTY\n"
             "This is free software, and you are welcome to redistribute it\n"
             "under certain conditions; see the file COPYING for details\n");
 }
 
-static void usage(FILE* file)
-{
-    fprintf(file, "\n"
-            "usage: jackdmp [ --no-realtime OR -r ]\n"
-            "               [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n"
-            "      (the two previous arguments are mutually exclusive. The default is --realtime)\n"
-            "               [ --name OR -n server-name ]\n"
-            "               [ --timeout OR -t client-timeout-in-msecs ]\n"
-            "               [ --loopback OR -L loopback-port-number ]\n"
-            "               [ --port-max OR -p maximum-number-of-ports]\n"
-            "               [ --slave-backend OR -X slave-backend-name ]\n"
-            "               [ --internal-client OR -I internal-client-name ]\n"
-            "               [ --verbose OR -v ]\n"
-#ifdef __linux__
-            "               [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]\n"
-#endif
-            "               [ --replace-registry ]\n"
-            "               [ --silent OR -s ]\n"
-            "               [ --sync OR -S ]\n"
-            "               [ --temporary OR -T ]\n"
-            "               [ --version OR -V ]\n"
-            "         -d master-backend-name [ ... master-backend args ... ]\n"
-#ifdef __APPLE__
-            "               Available master backends may include: coreaudio, dummy, net or netone.\n\n"
-#endif
-#ifdef WIN32
-            "               Available master backends may include: portaudio, dummy, net or netone.\n\n"
-#endif
-#ifdef __linux__
-            "               Available master backends may include: alsa, dummy, freebob, firewire, net or netone.\n\n"
-#endif
-#if defined(__sun__) || defined(sun)
-            "               Available master backends may include: boomer, oss, dummy or net.\n\n"
-#endif
-            "       jackdmp -d master-backend-name --help\n"
-            "             to display options for each master backend\n\n");
-}
-
-// To put in the control.h interface ??
 static jackctl_driver_t * jackctl_server_get_driver(jackctl_server_t *server, const char *driver_name)
 {
     const JSList * node_ptr = jackctl_server_get_drivers_list(server);
@@ -173,6 +133,65 @@ static jackctl_parameter_t * jackctl_get_parameter(const JSList * parameters_lis
     return NULL;
 }
 
+static void print_server_drivers(jackctl_server_t *server, FILE* file)
+{
+    const JSList * node_ptr = jackctl_server_get_drivers_list(server);
+
+    fprintf(file, "Available backends:\n");
+    
+    while (node_ptr) {
+        jackctl_driver_t* driver = (jackctl_driver_t *)node_ptr->data;
+        fprintf(file, "      %s (%s)\n", jackctl_driver_get_name(driver), (jackctl_driver_get_type(driver) == JackMaster) ? "master" : "slave");
+        node_ptr = jack_slist_next(node_ptr);
+    }
+    fprintf(file, "\n");
+}
+
+static void print_server_internals(jackctl_server_t *server, FILE* file)
+{
+    const JSList * node_ptr = jackctl_server_get_internals_list(server);
+
+    fprintf(file, "Available internals:\n");
+    
+    while (node_ptr) {
+        jackctl_internal_t* internal = (jackctl_internal_t *)node_ptr->data;
+        fprintf(file, "      %s\n", jackctl_internal_get_name(internal));
+        node_ptr = jack_slist_next(node_ptr);
+    }
+    fprintf(file, "\n");
+}
+
+static void usage(FILE* file, jackctl_server_t *server)
+{
+    fprintf(file, "\n"
+            "Usage: jackdmp [ --no-realtime OR -r ]\n"
+            "               [ --realtime OR -R [ --realtime-priority OR -P priority ] ]\n"
+            "      (the two previous arguments are mutually exclusive. The default is --realtime)\n"
+            "               [ --name OR -n server-name ]\n"
+            "               [ --timeout OR -t client-timeout-in-msecs ]\n"
+            "               [ --loopback OR -L loopback-port-number ]\n"
+            "               [ --port-max OR -p maximum-number-of-ports]\n"
+            "               [ --slave-backend OR -X slave-backend-name ]\n"
+            "               [ --internal-client OR -I internal-client-name ]\n"
+            "               [ --verbose OR -v ]\n"
+#ifdef __linux__
+            "               [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]\n"
+#endif
+            "               [ --replace-registry ]\n"
+            "               [ --silent OR -s ]\n"
+            "               [ --sync OR -S ]\n"
+            "               [ --temporary OR -T ]\n"
+            "               [ --version OR -V ]\n"
+            "         -d master-backend-name [ ... master-backend args ... ]\n"
+            "       jackdmp -d master-backend-name --help\n"
+            "             to display options for each master backend\n\n");
+    
+    if (server) {
+        print_server_drivers(server, file);
+        print_server_internals(server, file);
+    }
+}
+
 // Prototype to be found in libjackserver
 extern "C" void silent_jack_error_callback(const char *desc);
 
@@ -270,7 +289,7 @@ int main(int argc, char** argv)
                         value.ui = JACK_TIMER_SYSTEM_CLOCK;
                         jackctl_parameter_set_value(param, &value);
                     } else {
-                        usage(stdout);
+                        usage(stdout, NULL);
                         goto destroy_server;
                     }
                 }
@@ -379,7 +398,7 @@ int main(int argc, char** argv)
                 /*fallthru*/
 
             case 'h':
-                usage(stdout);
+                usage(stdout, server_ctl);
                 goto destroy_server;
         }
     }
@@ -400,7 +419,7 @@ int main(int argc, char** argv)
     }
 
     if (!master_driver_name) {
-        usage(stderr);
+        usage(stderr, NULL);
         goto destroy_server;
     }
 
@@ -524,15 +543,17 @@ int main(int argc, char** argv)
     // Slave drivers
     for (it = slaves_list.begin(); it != slaves_list.end(); it++) {
         jackctl_driver_t * slave_driver_ctl = jackctl_server_get_driver(server_ctl, *it);
-        if (slave_driver_ctl)
+        if (slave_driver_ctl) {
             jackctl_server_remove_slave(server_ctl, slave_driver_ctl);
+        }
     }
 
     // Internal clients
     for (it = internals_list.begin(); it != internals_list.end(); it++) {
         jackctl_internal_t * internal_driver_ctl = jackctl_server_get_internal(server_ctl, *it);
-        if (internal_driver_ctl)
+        if (internal_driver_ctl) {
             jackctl_server_unload_internal(server_ctl, internal_driver_ctl);
+        }
     }
     jackctl_server_close(server_ctl);
 
diff --git a/common/jack/systemdeps.h b/common/jack/systemdeps.h
index 3c3c064..b4a1472 100644
--- a/common/jack/systemdeps.h
+++ b/common/jack/systemdeps.h
@@ -52,9 +52,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
         #else
             #define PRE_PACKED_STRUCTURE
             #define POST_PACKED_STRUCTURE
-        #endif
+        #endif /* _MSC_VER */
 
-    #endif
+    #endif /* __GNUC__ */
 
 #endif
 
@@ -101,7 +101,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
         typedef pthread_t jack_native_thread_t;
     #endif
 
-#endif // WIN32 && !__CYGWIN__ && !GNU_WIN32 */
+#endif /* WIN32 && !__CYGWIN__ && !GNU_WIN32 */
 
 #if defined(__APPLE__) || defined(__linux__) || defined(__sun__) || defined(sun) || defined(__unix__) || defined(__CYGWIN__) || defined(GNU_WIN32)
 
@@ -118,6 +118,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
          */
         typedef pthread_t jack_native_thread_t;
 
-    #endif /* __APPLE__ || __linux__ || __sun__ || sun */
+#endif /* __APPLE__ || __linux__ || __sun__ || sun */
 
-#endif
+#if defined(__arm__)
+    #undef POST_PACKED_STRUCTURE
+    #define POST_PACKED_STRUCTURE
+#endif /* __arm__ */
+
+#endif /* __jack_systemdeps_h__ */
diff --git a/common/wscript b/common/wscript
index c3894a5..36423d3 100644
--- a/common/wscript
+++ b/common/wscript
@@ -226,7 +226,7 @@ def build(bld):
     clientlib.defines = 'HAVE_CONFIG_H'
     clientlib.use = uselib
     clientlib.install_path = '${LIBDIR}'
-    if bld.env['BUILD_JACKDBUS'] == True and bld.env['BUILD_JACKD'] == False:
+    if bld.env['AUTOSTART_METHOD'] == "dbus":
         clientlib.use.append('DBUS-1')
     clientlib.includes = includes
     clientlib.name         = 'clientlib'
diff --git a/dbus/audio_reserve.c b/dbus/audio_reserve.c
index aee00af..c915ba5 100644
--- a/dbus/audio_reserve.c
+++ b/dbus/audio_reserve.c
@@ -76,6 +76,8 @@ SERVER_EXPORT bool audio_acquire(const char * device_name)
 
     assert(gReserveCount < DEVICE_MAX);
 
+    dbus_error_init(&error);
+
     if ((ret= rd_acquire(
                  &gReservedDevice[gReserveCount].reserved_device,
                  gConnection,
@@ -86,6 +88,7 @@ SERVER_EXPORT bool audio_acquire(const char * device_name)
                  &error)) < 0) {
 
         jack_error("Failed to acquire device name : %s error : %s", device_name, (error.message ? error.message : strerror(-ret)));
+        dbus_error_free(&error);
         return false;
     }
 
diff --git a/dbus/controller.c b/dbus/controller.c
index cada1f0..f4ed839 100644
--- a/dbus/controller.c
+++ b/dbus/controller.c
@@ -377,6 +377,8 @@ on_device_acquire(const char * device_name)
     int ret;
     DBusError error;
 
+    dbus_error_init(&error);
+
     ret = rd_acquire(
         &g_reserved_device[g_device_count].reserved_device,
         g_connection,
@@ -388,6 +390,7 @@ on_device_acquire(const char * device_name)
     if (ret  < 0)
     {
         jack_error("Failed to acquire device name : %s error : %s", device_name, (error.message ? error.message : strerror(-ret)));
+        dbus_error_free(&error);
         return false;
     }
 
diff --git a/dbus/reserve.c b/dbus/reserve.c
index 88e91b2..cae77e6 100644
--- a/dbus/reserve.c
+++ b/dbus/reserve.c
@@ -31,6 +31,11 @@
 #include <stdint.h>
 
 #include "reserve.h"
+#include "jack/control.h"
+
+#define RESERVE_ERROR_NO_MEMORY            "org.freedesktop.ReserveDevice1.Error.NoMemory"
+#define RESERVE_ERROR_PROTOCOL_VIOLATION   "org.freedesktop.ReserveDevice1.Error.Protocol"
+#define RESERVE_ERROR_RELEASE_DENIED       "org.freedesktop.ReserveDevice1.Error.ReleaseDenied"
 
 struct rd_device {
 	int ref;
@@ -371,34 +376,51 @@ int rd_acquire(
 	dbus_bool_t good;
     vtable.message_function = object_handler;
 
-	if (!error)
+	if (!error) {
 		error = &_error;
+		dbus_error_init(error);
+	}
 
-	dbus_error_init(error);
-
-	if (!_d)
-		return -EINVAL;
+	if (!_d) {
+		assert(0);
+		r = -EINVAL;
+		goto fail;
+	}
 
-	if (!connection)
-		return -EINVAL;
+	if (!connection) {
+		assert(0);
+		r = -EINVAL;
+		goto fail;
+	}
 
-	if (!device_name)
-		return -EINVAL;
+	if (!device_name) {
+		assert(0);
+		r = -EINVAL;
+		goto fail;
+	}
 
-	if (!request_cb && priority != INT32_MAX)
-		return -EINVAL;
+	if (!request_cb && priority != INT32_MAX) {
+		assert(0);
+		r = -EINVAL;
+		goto fail;
+	}
 
-	if (!(d = (rd_device *)calloc(sizeof(rd_device), 1)))
-		return -ENOMEM;
+	if (!(d = (rd_device *)calloc(sizeof(rd_device), 1))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot allocate memory for rd_device struct");
+		r = -ENOMEM;
+		goto fail;
+	}
 
 	d->ref = 1;
 
 	if (!(d->device_name = strdup(device_name))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot duplicate device name string");
 		r = -ENOMEM;
 		goto fail;
 	}
 
 	if (!(d->application_name = strdup(application_name))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot duplicate application name string");
 		r = -ENOMEM;
 		goto fail;
 	}
@@ -408,12 +430,14 @@ int rd_acquire(
 	d->request_cb = request_cb;
 
 	if (!(d->service_name = (char*)malloc(sizeof(SERVICE_PREFIX) + strlen(device_name)))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot allocate memory for service name string");
 		r = -ENOMEM;
 		goto fail;
 	}
 	sprintf(d->service_name, SERVICE_PREFIX "%s", d->device_name);
 
 	if (!(d->object_path = (char*)malloc(sizeof(OBJECT_PREFIX) + strlen(device_name)))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot allocate memory for object path string");
 		r = -ENOMEM;
 		goto fail;
 	}
@@ -425,20 +449,28 @@ int rd_acquire(
 		     DBUS_NAME_FLAG_DO_NOT_QUEUE|
 		     (priority < INT32_MAX ? DBUS_NAME_FLAG_ALLOW_REPLACEMENT : 0),
 		     error)) < 0) {
+		jack_error("dbus_bus_request_name() failed. (1)");
 		r = -EIO;
 		goto fail;
 	}
 
-	if (k == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER || k == DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER)
+	switch (k) {
+	case DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER:
+	case DBUS_REQUEST_NAME_REPLY_ALREADY_OWNER:
 		goto success;
-
-	if (k != DBUS_REQUEST_NAME_REPLY_EXISTS) {
+	case DBUS_REQUEST_NAME_REPLY_EXISTS:
+		break;
+	case DBUS_REQUEST_NAME_REPLY_IN_QUEUE : /* DBUS_NAME_FLAG_DO_NOT_QUEUE was specified */
+	default:								/* unknown reply returned */
+		jack_error("request name reply with unexpected value %d.", k);
+		assert(0);
 		r = -EIO;
 		goto fail;
 	}
 
 	if (priority <= INT32_MIN) {
 		r = -EBUSY;
+		dbus_set_error(error, RESERVE_ERROR_RELEASE_DENIED, "Device reservation request with priority %"PRIi32" denied for \"%s\"", priority, device_name);
 		goto fail;
 	}
 
@@ -447,6 +479,7 @@ int rd_acquire(
 		      d->object_path,
 		      "org.freedesktop.ReserveDevice1",
 		      "RequestRelease"))) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot allocate memory for RequestRelease method call");
 		r = -ENOMEM;
 		goto fail;
 	}
@@ -455,6 +488,7 @@ int rd_acquire(
 		    m,
 		    DBUS_TYPE_INT32, &d->priority,
 		    DBUS_TYPE_INVALID)) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot append args for RequestRelease method call");
 		r = -ENOMEM;
 		goto fail;
 	}
@@ -469,10 +503,12 @@ int rd_acquire(
 		    dbus_error_has_name(error, DBUS_ERROR_UNKNOWN_METHOD) ||
 		    dbus_error_has_name(error, DBUS_ERROR_NO_REPLY)) {
 			/* This must be treated as denied. */
+			jack_info("Device reservation request with priority %"PRIi32" denied for \"%s\": %s (%s)", priority, device_name, error->name, error->message);
 			r = -EBUSY;
 			goto fail;
 		}
 
+		jack_error("dbus_connection_send_with_reply_and_block(RequestRelease) failed.");
 		r = -EIO;
 		goto fail;
 	}
@@ -482,11 +518,13 @@ int rd_acquire(
 		    error,
 		    DBUS_TYPE_BOOLEAN, &good,
 		    DBUS_TYPE_INVALID)) {
+		jack_error("RequestRelease() reply is invalid.");
 		r = -EIO;
 		goto fail;
 	}
 
 	if (!good) {
+        dbus_set_error(error, RESERVE_ERROR_RELEASE_DENIED, "Device reservation request with priority %"PRIi32" denied for \"%s\" via RequestRelease()", priority, device_name);
 		r = -EBUSY;
 		goto fail;
 	}
@@ -498,11 +536,14 @@ int rd_acquire(
 		     (priority < INT32_MAX ? DBUS_NAME_FLAG_ALLOW_REPLACEMENT : 0)|
 		     DBUS_NAME_FLAG_REPLACE_EXISTING,
 		     error)) < 0) {
+		jack_error("dbus_bus_request_name() failed. (2)");
 		r = -EIO;
 		goto fail;
 	}
 
 	if (k != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
+        /* this is racy, another contender may have acquired the device */
+		dbus_set_error(error, RESERVE_ERROR_PROTOCOL_VIOLATION, "request name reply is not DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER but %d.", k);
 		r = -EIO;
 		goto fail;
 	}
@@ -510,11 +551,13 @@ int rd_acquire(
 success:
 	d->owning = 1;
 
-	if (!(dbus_connection_register_object_path(
+	if (!(dbus_connection_try_register_object_path(
 		      d->connection,
 		      d->object_path,
 		      &vtable,
-		      d))) {
+		      d,
+		      error))) {
+		jack_error("cannot register object path \"%s\": %s", d->object_path, error->message);
 		r = -ENOMEM;
 		goto fail;
 	}
@@ -526,6 +569,7 @@ success:
 		    filter_handler,
 		    d,
 		    NULL)) {
+		dbus_set_error(error, RESERVE_ERROR_NO_MEMORY, "Cannot add filter");
 		r = -ENOMEM;
 		goto fail;
 	}
diff --git a/doxyfile b/doxyfile
index ba2e12a..ac302d6 100644
--- a/doxyfile
+++ b/doxyfile
@@ -31,7 +31,7 @@ PROJECT_NAME           = "Jack2"
 # This could be handy for archiving the generated documentation or
 # if some version control system is used.
 
-PROJECT_NUMBER         = 1.9.9
+PROJECT_NUMBER         = 1.9.10
 
 # The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
 # base path where the generated documentation will be put.
diff --git a/example-clients/metro.c b/example-clients/metro.c
index 1742a59..8240b40 100644
--- a/example-clients/metro.c
+++ b/example-clients/metro.c
@@ -98,7 +98,7 @@ process_audio (jack_nframes_t nframes)
     jack_nframes_t cur_time = jack_frame_time(client);
     jack_time_t cur_micro_time = jack_get_time();
 
-    printf("jack_frame_timed %lld  micro %lld delta %d\n", cur_time, (cur_micro_time - last_micro_time), cur_time - last_time);
+    printf("jack_frame_time %lld micro %lld delta %d\n", cur_time, (cur_micro_time - last_micro_time), cur_time - last_time);
     last_time = cur_time;
     last_micro_time = cur_micro_time;
     */
diff --git a/example-clients/wscript b/example-clients/wscript
index e4ed4f3..de4b033 100644
--- a/example-clients/wscript
+++ b/example-clients/wscript
@@ -65,7 +65,7 @@ def build(bld):
         os_incdir = ['../solaris', '../posix']
     for example_program, example_program_source in list(example_programs.items()):
         if example_program == 'jack_server_control':
-            use = ['serverlib']
+            use = ['serverlib', 'STDC++']
         elif example_program == 'jack_net_slave':
             if not bld.env['BUILD_NETLIB']:
                 continue
diff --git a/linux/JackLinuxTime.c b/linux/JackLinuxTime.c
index 3c3a9c2..53606fa 100644
--- a/linux/JackLinuxTime.c
+++ b/linux/JackLinuxTime.c
@@ -140,7 +140,7 @@ static jack_time_t jack_get_mhz (void)
 	if (f == 0)
 	{
 		perror("can't open /proc/cpuinfo\n");
-		exit(1);
+		exit(1);    // TODO : should be remplaced by an exception
 	}
 
 	for (;;)
@@ -150,9 +150,8 @@ static jack_time_t jack_get_mhz (void)
 		char buf[1000];
 
 		if (fgets(buf, sizeof(buf), f) == NULL) {
-			jack_error ("FATAL: cannot locate cpu MHz in "
-				    "/proc/cpuinfo\n");
-			exit(1);
+			jack_error ("FATAL: cannot locate cpu MHz in /proc/cpuinfo\n");
+			exit(1);    // TODO : should be remplaced by an exception
 		}
 
 #if defined(__powerpc__)
@@ -225,42 +224,42 @@ SERVER_EXPORT void EndTime()
 
 void SetClockSource(jack_timer_type_t source)
 {
-        jack_log("Clock source : %s", ClockSourceName(source));
+    jack_log("Clock source : %s", ClockSourceName(source));
 
 	switch (source)
 	{
-	case JACK_TIMER_CYCLE_COUNTER:
-		_jack_get_microseconds = jack_get_microseconds_from_cycles;
-		break;
-
-	case JACK_TIMER_HPET:
-		if (jack_hpet_init () == 0) {
-			_jack_get_microseconds = jack_get_microseconds_from_hpet;
-		} else {
-			_jack_get_microseconds = jack_get_microseconds_from_system;
-		}
-		break;
-
-	case JACK_TIMER_SYSTEM_CLOCK:
-	default:
-		_jack_get_microseconds = jack_get_microseconds_from_system;
-		break;
+        case JACK_TIMER_CYCLE_COUNTER:
+            _jack_get_microseconds = jack_get_microseconds_from_cycles;
+            break;
+
+        case JACK_TIMER_HPET:
+            if (jack_hpet_init () == 0) {
+                _jack_get_microseconds = jack_get_microseconds_from_hpet;
+            } else {
+                _jack_get_microseconds = jack_get_microseconds_from_system;
+            }
+            break;
+
+        case JACK_TIMER_SYSTEM_CLOCK:
+            default:
+            _jack_get_microseconds = jack_get_microseconds_from_system;
+            break;
 	}
 }
 
 const char* ClockSourceName(jack_timer_type_t source)
 {
 	switch (source) {
-	case JACK_TIMER_CYCLE_COUNTER:
-		return "cycle counter";
-	case JACK_TIMER_HPET:
-		return "hpet";
-	case JACK_TIMER_SYSTEM_CLOCK:
-#ifdef HAVE_CLOCK_GETTIME
-		return "system clock via clock_gettime";
-#else
-		return "system clock via gettimeofday";
-#endif
+        case JACK_TIMER_CYCLE_COUNTER:
+            return "cycle counter";
+        case JACK_TIMER_HPET:
+            return "hpet";
+        case JACK_TIMER_SYSTEM_CLOCK:
+        #ifdef HAVE_CLOCK_GETTIME
+            return "system clock via clock_gettime";
+        #else
+            return "system clock via gettimeofday";
+        #endif
 	}
 
 	/* what is wrong with gcc ? */
diff --git a/linux/alsa/JackAlsaDriver.cpp b/linux/alsa/JackAlsaDriver.cpp
index 805b4d2..bfed2f1 100644
--- a/linux/alsa/JackAlsaDriver.cpp
+++ b/linux/alsa/JackAlsaDriver.cpp
@@ -31,7 +31,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/time.h>
-#include <regex.h>
 #include <string.h>
 
 #include "JackAlsaDriver.h"
@@ -172,30 +171,31 @@ int JackAlsaDriver::Detach()
     return JackAudioDriver::Detach();
 }
 
-static char* get_control_device_name(const char * device_name)
+extern "C" char* get_control_device_name(const char * device_name)
 {
     char * ctl_name;
-    regex_t expression;
+    const char * comma;
 
-    regcomp(&expression, "(plug)?hw:[0-9](,[0-9])?", REG_ICASE | REG_EXTENDED);
+    /* the user wants a hw or plughw device, the ctl name
+     * should be hw:x where x is the card identification.
+     * We skip the subdevice suffix that starts with comma */
 
-    if (!regexec(&expression, device_name, 0, NULL, 0)) {
-        /* the user wants a hw or plughw device, the ctl name
-         * should be hw:x where x is the card number */
-
-        char tmp[5];
-        strncpy(tmp, strstr(device_name, "hw"), 4);
-        tmp[4] = '\0';
-        jack_info("control device %s",tmp);
-        ctl_name = strdup(tmp);
-    } else {
-        ctl_name = strdup(device_name);
+    if (strncasecmp(device_name, "plughw:", 7) == 0) {
+        /* skip the "plug" prefix" */
+        device_name += 4;
     }
 
-    regfree(&expression);
-
-    if (ctl_name == NULL) {
-        jack_error("strdup(\"%s\") failed.", ctl_name);
+    comma = strchr(device_name, ',');
+    if (comma == NULL) {
+        ctl_name = strdup(device_name);
+        if (ctl_name == NULL) {
+            jack_error("strdup(\"%s\") failed.", device_name);
+        }
+    } else {
+        ctl_name = strndup(device_name, comma - device_name);
+        if (ctl_name == NULL) {
+            jack_error("strndup(\"%s\", %u) failed.", device_name, (unsigned int)(comma - device_name));
+        }
     }
 
     return ctl_name;
@@ -278,16 +278,22 @@ int JackAlsaDriver::Open(jack_nframes_t nframes,
         int playback_card = card_to_num(playback_driver_name);
         char audio_name[32];
 
-        snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card);
-        if (!JackServerGlobals::on_device_acquire(audio_name)) {
-            jack_error("Audio device %s cannot be acquired...", capture_driver_name);
-            return -1;
+        if (capture_card >= 0) {
+            snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card);
+            if (!JackServerGlobals::on_device_acquire(audio_name)) {
+                jack_error("Audio device %s cannot be acquired...", capture_driver_name);
+                return -1;
+            }
         }
 
-        if (playback_card != capture_card) {
+        if (playback_card >= 0 && playback_card != capture_card) {
             snprintf(audio_name, sizeof(audio_name), "Audio%d", playback_card);
             if (!JackServerGlobals::on_device_acquire(audio_name)) {
                 jack_error("Audio device %s cannot be acquired...", playback_driver_name);
+                if (capture_card >= 0) {
+                    snprintf(audio_name, sizeof(audio_name), "Audio%d", capture_card);
+                    JackServerGlobals::on_device_release(audio_name);
+                }
                 return -1;
             }
         }
diff --git a/linux/alsa/JackAlsaDriver.h b/linux/alsa/JackAlsaDriver.h
index a88d4a0..c62ff54 100644
--- a/linux/alsa/JackAlsaDriver.h
+++ b/linux/alsa/JackAlsaDriver.h
@@ -39,15 +39,13 @@ class JackAlsaDriver : public JackAudioDriver
     private:
 
         jack_driver_t* fDriver;
-        int fReservedCaptureDevice;
-        int fReservedPlaybackDevice;
 
         void UpdateLatencies();
 
     public:
 
         JackAlsaDriver(const char* name, const char* alias, JackLockedEngine* engine, JackSynchro* table)
-		: JackAudioDriver(name, alias, engine, table),fDriver(NULL),fReservedCaptureDevice(-1),fReservedPlaybackDevice(-1)
+		: JackAudioDriver(name, alias, engine, table),fDriver(NULL)
         {}
         virtual ~JackAlsaDriver()
         {}
diff --git a/linux/alsa/alsa_driver.c b/linux/alsa/alsa_driver.c
index 8e588e9..e14458b 100644
--- a/linux/alsa/alsa_driver.c
+++ b/linux/alsa/alsa_driver.c
@@ -32,7 +32,6 @@
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/time.h>
-#include <regex.h>
 #include <string.h>
 
 #include "alsa_driver.h"
@@ -137,30 +136,18 @@ alsa_driver_check_capabilities (alsa_driver_t *driver)
 	return 0;
 }
 
+char* get_control_device_name(const char * device_name);
+
 static int
 alsa_driver_check_card_type (alsa_driver_t *driver)
 {
 	int err;
 	snd_ctl_card_info_t *card_info;
 	char * ctl_name;
-	regex_t expression;
 
 	snd_ctl_card_info_alloca (&card_info);
 
-	regcomp(&expression,"(plug)?hw:[0-9](,[0-9])?",REG_ICASE|REG_EXTENDED);
-
-       	if (!regexec(&expression,driver->alsa_name_playback,0,NULL,0)) {
-		/* the user wants a hw or plughw device, the ctl name
-		 * should be hw:x where x is the card number */
-
-		char tmp[5];
-		strncpy(tmp,strcasestr(driver->alsa_name_playback,"hw"),4);
-		tmp[4]='\0';
-		jack_info("control device %s",tmp);
-		ctl_name = strdup(tmp);
-	} else {
-		ctl_name = strdup(driver->alsa_name_playback);
-	}
+	ctl_name = get_control_device_name(driver->alsa_name_playback);
 
 	// XXX: I don't know the "right" way to do this. Which to use
 	// driver->alsa_name_playback or driver->alsa_name_capture.
@@ -175,7 +162,6 @@ alsa_driver_check_card_type (alsa_driver_t *driver)
 
 	driver->alsa_driver = strdup(snd_ctl_card_info_get_driver (card_info));
 
-	regfree(&expression);
 	free(ctl_name);
 
 	return alsa_driver_check_capabilities (driver);
diff --git a/posix/JackCompilerDeps_os.h b/posix/JackCompilerDeps_os.h
index c1c17cd..591db5c 100644
--- a/posix/JackCompilerDeps_os.h
+++ b/posix/JackCompilerDeps_os.h
@@ -23,19 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 #include "JackConstants.h"
 
 #if __GNUC__
-    #define PRE_PACKED_STRUCTURE
-
-	#ifndef POST_PACKED_STRUCTURE
-        /* POST_PACKED_STRUCTURE needs to be a macro which
-        expands into a compiler directive. The directive must
-        tell the compiler to arrange the preceding structure
-        declaration so that it is packed on byte-boundaries rather
-        than use the natural alignment of the processor and/or
-        compiler.
-        */
-        #define POST_PACKED_STRUCTURE __attribute__((__packed__))
-    #endif
-    
+
     #define MEM_ALIGN(x,y) x __attribute__((aligned(y)))
     #define LIB_EXPORT __attribute__((visibility("default")))
     #ifdef SERVER_SIDE
@@ -53,9 +41,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     #define LIB_EXPORT
     #define SERVER_EXPORT
 
-    /* Add other things here for non-gcc platforms for PRE and POST_PACKED_STRUCTURE */
-    #define PRE_PACKED_STRUCTURE
-    #define POST_PACKED_STRUCTURE
+    /* Add other things here for non-gcc platforms */
 #endif
 
 #endif
diff --git a/posix/JackFifo.cpp b/posix/JackFifo.cpp
index be13a5d..a8816b6 100644
--- a/posix/JackFifo.cpp
+++ b/posix/JackFifo.cpp
@@ -30,9 +30,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 namespace Jack
 {
 
-void JackFifo::BuildName(const char* client_name, const char* server_name, char* res)
+void JackFifo::BuildName(const char* client_name, const char* server_name, char* res, int size)
 {
-    char ext_client_name[JACK_CLIENT_NAME_SIZE + 1];
+    char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
     JackTools::RewriteName(client_name, ext_client_name);
     sprintf(res, "%s/jack_fifo.%d_%s_%s", jack_client_dir, JackTools::GetUID(), server_name, ext_client_name);
 }
@@ -126,7 +126,7 @@ bool JackFifo::TimedWait(long usec)
 bool JackFifo::Allocate(const char* name, const char* server_name, int value)
 {
     struct stat statbuf;
-    BuildName(name, server_name, fName);
+    BuildName(name, server_name, fName, sizeof(fName));
     jack_log("JackFifo::Allocate name = %s", fName);
 
     if (stat(fName, &statbuf) < 0) {
@@ -159,7 +159,7 @@ bool JackFifo::Allocate(const char* name, const char* server_name, int value)
 // Client side
 bool JackFifo::ConnectAux(const char* name, const char* server_name, int access)
 {
-    BuildName(name, server_name, fName);
+    BuildName(name, server_name, fName, sizeof(fName));
     jack_log("JackFifo::ConnectAux name = %s", fName);
 
     // Temporary...
diff --git a/posix/JackPosixMutex.cpp b/posix/JackPosixMutex.cpp
index 12f76f5..72ecd8e 100644
--- a/posix/JackPosixMutex.cpp
+++ b/posix/JackPosixMutex.cpp
@@ -51,7 +51,6 @@ namespace Jack
                 return false;
             }
         } else {
-            jack_error("JackBasePosixMutex::Lock mutex already locked by thread = %d", current_thread);
             return false;
         }
     }
@@ -69,7 +68,6 @@ namespace Jack
                 return false;
             }
         } else {
-            jack_error("JackBasePosixMutex::Trylock mutex already locked by thread = %d", current_thread);
             return false;
         }
     }
@@ -86,7 +84,6 @@ namespace Jack
                 return false;
             }
         } else {
-            jack_error("JackBasePosixMutex::Unlock mutex not locked by thread = %d owner %d", pthread_self(), fOwner);
             return false;
         }
     }
diff --git a/posix/JackPosixSemaphore.cpp b/posix/JackPosixSemaphore.cpp
index 63e0e8f..f915ef7 100644
--- a/posix/JackPosixSemaphore.cpp
+++ b/posix/JackPosixSemaphore.cpp
@@ -30,7 +30,7 @@ namespace Jack
 
 void JackPosixSemaphore::BuildName(const char* client_name, const char* server_name, char* res, int size)
 {
-    char ext_client_name[JACK_CLIENT_NAME_SIZE + 1];
+    char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
     JackTools::RewriteName(client_name, ext_client_name);
     snprintf(res, size, "jack_sem.%d_%s_%s", JackTools::GetUID(), server_name, ext_client_name);
 }
@@ -94,8 +94,9 @@ bool JackPosixSemaphore::Wait()
 
     while ((res = sem_wait(fSemaphore) < 0)) {
         jack_error("JackPosixSemaphore::Wait name = %s err = %s", fName, strerror(errno));
-        if (errno != EINTR)
+        if (errno != EINTR) {
             break;
+        }
     }
     return (res == 0);
 }
@@ -122,8 +123,9 @@ bool JackPosixSemaphore::TimedWait(long usec)
         jack_error("JackPosixSemaphore::TimedWait err = %s", strerror(errno));
         jack_log("JackPosixSemaphore::TimedWait now : %ld %ld ", now.tv_sec, now.tv_usec);
         jack_log("JackPosixSemaphore::TimedWait next : %ld %ld ", time.tv_sec, time.tv_nsec/1000);
-        if (errno != EINTR)
+        if (errno != EINTR) {
             break;
+        }
     }
     return (res == 0);
 }
diff --git a/posix/JackPosixServerLaunch.cpp b/posix/JackPosixServerLaunch.cpp
index 81836de..9129ec7 100644
--- a/posix/JackPosixServerLaunch.cpp
+++ b/posix/JackPosixServerLaunch.cpp
@@ -17,6 +17,11 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 
 */
+#if !defined(WIN32) || defined(__CYGWIN__)
+
+#ifdef PTHREAD_WIN32        // Added by JE - 13-02-2010
+#include <ptw32/pthread.h>  // Makes sure we #include the ptw32 version for
+#endif                      // consistency - even though we won't need it !
 
 #include "JackConstants.h"
 #include "JackChannel.h"
@@ -73,7 +78,7 @@ static int start_server_dbus(const char* server_name)
     return 0;
 }
 
-#else
+#elif defined(USE_CLASSIC_AUTOLAUNCH)
 
 /* Exec the JACK server in this process.  Does not return. */
 static void start_server_classic_aux(const char* server_name)
@@ -88,7 +93,7 @@ static void start_server_classic_aux(const char* server_name)
     char** argv = 0;
     int i = 0;
     int good = 0;
-    int ret;
+    int res;
 
     snprintf(filename, 255, "%s/.jackdrc", getenv("HOME"));
     fp = fopen(filename, "r");
@@ -103,11 +108,11 @@ static void start_server_classic_aux(const char* server_name)
 
     if (fp) {
         arguments[0] = '\0';
-        ret = fscanf(fp, "%s", buffer);
+        res = fscanf(fp, "%s", buffer);
         while (ret != 0 && ret != EOF) {
             strcat(arguments, buffer);
             strcat(arguments, " ");
-            ret = fscanf(fp, "%s", buffer);
+            res = fscanf(fp, "%s", buffer);
         }
         if (strlen(arguments) > 0) {
             good = 1;
@@ -199,8 +204,11 @@ static int start_server(const char* server_name, jack_options_t options)
 
 #if defined(USE_LIBDBUS_AUTOLAUNCH)
     return start_server_dbus(server_name);
-#else
+#elif defined(USE_CLASSIC_AUTOLAUNCH)
     return start_server_classic(server_name);
+#else
+    fprintf(stderr, "Automatic start of JACK server is disabled at configure time\n");
+    return 1;
 #endif
 }
 
@@ -239,3 +247,4 @@ int try_start_server(jack_varargs_t* va, jack_options_t options, jack_status_t*
     return 0;
 }
 
+#endif  // !defined(WIN32) || defined(__CYGWIN__)
diff --git a/posix/JackSocket.cpp b/posix/JackSocket.cpp
index 1f50bbe..ae0f5a0 100644
--- a/posix/JackSocket.cpp
+++ b/posix/JackSocket.cpp
@@ -29,11 +29,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 namespace Jack
 {
 
-static void BuildName(const char* client_name, char* res, const char* dir, int which)
+static void BuildName(const char* client_name, char* res, const char* dir, int which, int size)
 {
-    char ext_client_name[JACK_CLIENT_NAME_SIZE + 1];
+    char ext_client_name[SYNC_MAX_NAME_SIZE + 1];
     JackTools::RewriteName(client_name, ext_client_name);
-    sprintf(res, "%s/jack_%s_%d_%d", dir, ext_client_name, JackTools::GetUID(), which);
+    snprintf(res, size, "%s/jack_%s_%d_%d", dir, ext_client_name, JackTools::GetUID(), which);
 }
 
 JackClientSocket::JackClientSocket(int socket): JackClientRequestInterface(), fSocket(socket),fTimeOut(0)
@@ -119,7 +119,7 @@ int JackClientSocket::Connect(const char* dir, const char* name, int which) // A
     }
 
     addr.sun_family = AF_UNIX;
-    BuildName(name, addr.sun_path, dir, which);
+    BuildName(name, addr.sun_path, dir, which, sizeof(addr.sun_path));
     jack_log("JackClientSocket::Connect : addr.sun_path %s", addr.sun_path);
 
     if (connect(fSocket, (struct sockaddr*)&addr, sizeof(addr)) < 0) {
@@ -253,9 +253,10 @@ int JackServerSocket::Bind(const char* dir, const char* name, int which) // A re
     }
 
     addr.sun_family = AF_UNIX;
-    BuildName(name, fName, dir, which);
+    // Socket name has to be kept in fName to be "unlinked".
+    BuildName(name, fName, dir, which, sizeof(addr.sun_path));
     strncpy(addr.sun_path, fName, sizeof(addr.sun_path) - 1);
-
+   
     jack_log("JackServerSocket::Bind : addr.sun_path %s", addr.sun_path);
     unlink(fName); // Security...
 
diff --git a/posix/JackSocketClientChannel.cpp b/posix/JackSocketClientChannel.cpp
index 08dbaa7..bb3f9c6 100644
--- a/posix/JackSocketClientChannel.cpp
+++ b/posix/JackSocketClientChannel.cpp
@@ -146,7 +146,7 @@ bool JackSocketClientChannel::Execute()
 
 error:
     fNotificationSocket->Close();
-    fClient->ShutDown();
+    fClient->ShutDown(JACK_SERVER_FAILURE);
     return false;
 }
 
diff --git a/posix/JackSocketServerChannel.cpp b/posix/JackSocketServerChannel.cpp
index dcc1aa5..eccb5ff 100644
--- a/posix/JackSocketServerChannel.cpp
+++ b/posix/JackSocketServerChannel.cpp
@@ -170,13 +170,13 @@ void JackSocketServerChannel::ClientKill(int fd)
     int refnum = elem.first;
     assert(socket);
     
+    jack_log("JackSocketServerChannel::ClientKill ref = %d fd = %d", refnum, fd);
     if (refnum == -1) {  // Should never happen... correspond to a client that started the socket but never opened...
         jack_log("Client was not opened : probably correspond to server_check");
     } else {
-        fServer->ClientKill(refnum);
+        fServer->GetEngine()->ClientKill(refnum);
     }
-
-    jack_log("JackSocketServerChannel::ClientKill ref = %d fd = %d", refnum, fd);
+   
     fSocketTable.erase(fd);
     socket->Close();
     delete socket;
diff --git a/posix/JackSocketServerNotifyChannel.cpp b/posix/JackSocketServerNotifyChannel.cpp
index 5f4b603..4904b6e 100644
--- a/posix/JackSocketServerNotifyChannel.cpp
+++ b/posix/JackSocketServerNotifyChannel.cpp
@@ -34,7 +34,6 @@ int JackSocketServerNotifyChannel::Open(const char* server_name)
         return -1;
     } else {
         fRequestSocket.SetNonBlocking(true);
-        JackServerGlobals::fRTNotificationSocket = fRequestSocket.GetFd();
         return 0;
     }
 }
diff --git a/posix/JackTypes_os.h b/posix/JackTypes_os.h
index 896d91e..01e6c9b 100644
--- a/posix/JackTypes_os.h
+++ b/posix/JackTypes_os.h
@@ -26,8 +26,6 @@
 typedef unsigned long long UInt64;
 typedef pthread_key_t jack_tls_key;
 
-typedef pthread_t jack_native_thread_t;
-
 typedef int (*jack_thread_creator_t)(pthread_t*, const pthread_attr_t*, void* (*function)(void*), void* arg);
 
 #endif
diff --git a/tests/test.cpp b/tests/test.cpp
index ceb0b89..750d152 100644
--- a/tests/test.cpp
+++ b/tests/test.cpp
@@ -433,8 +433,7 @@ static int _process (jack_nframes_t nframes)
 	jack_default_audio_sample_t *in, *out;
 	in = (jack_default_audio_sample_t *)jack_port_get_buffer (input_port1, nframes);
 	out = (jack_default_audio_sample_t *)jack_port_get_buffer (output_port1, nframes);
-	memcpy (out, in,
-		sizeof (jack_default_audio_sample_t) * nframes);
+	memcpy (out, in, sizeof (jack_default_audio_sample_t) * nframes);
 	return 0;
 }
 
@@ -719,7 +718,6 @@ int main (int argc, char *argv[])
         }
     }
 
-
     /**
      * try to register another one with the same name...
      *
@@ -745,6 +743,26 @@ int main (int argc, char *argv[])
     } else {
         printf("!!! ERROR !!! Jackd server automatic renaming feature does not work!\n");
     }
+    
+    /**
+     * try to register a client with maximum possible client name size
+     *
+     */
+    char client_name3[jack_client_name_size()];
+    // "jack_client_name_size" - 1 effective characters
+    for (int i = 0; i < jack_client_name_size() - 1; i++) {
+        client_name3[i] = 'A';
+    }
+    // And last one is the terminating '0'
+    client_name3[jack_client_name_size()] = 0; 
+    Log("trying to register a new jackd client with maximum possible client name size...\n", client_name3);
+    client2 = jack_client_open(client_name3, jack_options, &status, server_name);
+    if (client2 != NULL) {
+        Log ("valid : a client with maximum possible client name size can be opened\n");
+		jack_client_close(client2);
+    } else {
+        printf("!!! ERROR !!! opening a client with maximum possible client name size does not work!\n");
+    }
 
     /**
      * testing client name...
@@ -753,27 +771,31 @@ int main (int argc, char *argv[])
      */
     Log("Testing name...");
     client_name2 = jack_get_client_name(client1);
-    if (strcmp(client_name1, client_name2) == 0)
+    if (strcmp(client_name1, client_name2) == 0) {
         Log(" ok\n");
-    else
+    } else {
         printf("\n!!! ERROR !!! name returned different from the one given : %s\n", client_name2);
+    }
 
     /**
      * Test RT mode...
      * verify if the real time mode returned by jack match the optional argument defined when launching jack_test*/
-    if (jack_is_realtime(client1) == RT)
+    if (jack_is_realtime(client1) == RT) {
         Log("Jackd is in realtime mode (RT = %i).\n", RT);
-    else
+    } else {
         printf("!!! ERROR !!! Jackd is in a non-expected realtime mode (RT = %i).\n", RT);
+    }
 
     /**
      * Register all callbacks...
      *
      */
-    if (jack_set_thread_init_callback(client1, Jack_Thread_Init_Callback, 0) != 0)
+    if (jack_set_thread_init_callback(client1, Jack_Thread_Init_Callback, 0) != 0) {
         printf("!!! ERROR !!! while calling jack_set_thread_init_callback()...\n");
-    if (jack_set_freewheel_callback(client1, Jack_Freewheel_Callback, 0) != 0 )
+    }
+    if (jack_set_freewheel_callback(client1, Jack_Freewheel_Callback, 0) != 0 ) {
         printf("\n!!! ERROR !!! while calling jack_set_freewheel_callback()...\n");
+    }
 
 
     if (jack_set_process_callback(client1, process1, 0) != 0) {
@@ -782,8 +804,9 @@ int main (int argc, char *argv[])
 
     jack_on_shutdown(client1, jack_shutdown, 0);
 
-    if (jack_on_info_shutdown)
+    if (jack_on_info_shutdown) {
         jack_on_info_shutdown(client1, jack_info_shutdown, 0);
+    }
 
     if (jack_set_buffer_size_callback(client1, Jack_Update_Buffer_Size, 0) != 0) {
         printf("Error when calling buffer_size_callback !\n");
@@ -826,7 +849,7 @@ int main (int argc, char *argv[])
     sprintf (filename, "framefile-%i.dat", cur_buffer_size);
     file = fopen(filename, "w");
     if (file == NULL) {
-        fprintf(stderr, "Erreur dans l'ouverture du fichier log framefile.dat");
+        fprintf(stderr, "Error when opening framefile.dat log file");
         exit(-1);
     }
 
@@ -910,6 +933,29 @@ int main (int argc, char *argv[])
     } else {
         printf("error : port_set_name function can't be tested...\n");
     }
+    
+    /**
+     * Verify if a port can be registered with maximum port name size (that is "short name")
+     *
+     */
+    int short_port_size_max = jack_port_name_size() - jack_client_name_size() - 1;  // Port is of shape: "client_name:port_name"
+    char port_name3[short_port_size_max];
+    // "short_port_size_max" - 1 effective characters
+    for (int i = 0; i < short_port_size_max - 1; i++) {
+        port_name3[i] = 'A';
+    }
+    // And last one is the terminating '0'
+    port_name3[short_port_size_max] = 0;
+    jack_port_t * test_max_port = jack_port_register(client1, port_name3,
+                                      JACK_DEFAULT_AUDIO_TYPE,
+                                      JackPortIsOutput, 0);
+   
+    if (test_max_port != NULL) {
+        Log ("valid : a port with maximum possible port name size can be registered\n");
+		jack_port_unregister(client1, test_max_port);
+    } else {
+        printf("!!! ERROR !!! registering a port with maximum possible port name size does not work!\n");
+    }
 
     port_callback_reg = 0;	// number of port registration received by the callback
 
@@ -923,22 +969,22 @@ int main (int argc, char *argv[])
     }
 
     /**
-     * Test if portrename callback have been called.
+     * Test if port rename callback have been called.
      *
      */
     jack_port_set_name (output_port1, "renamed-port#");
     jack_sleep(1 * 1000);
 
-    if (port_rename_clbk == 0)
+    if (port_rename_clbk == 0) {
         printf("!!! ERROR !!! Jack_Port_Rename_Callback was not called !!.\n");
-
+    }
 
     /**
-     * Test if portregistration callback have been called.
+     * Test if port registration callback have been called.
      *
      */
 
-    jack_sleep(1 * 1000);
+    jack_sleep(1 * 1000); // To hope all port registration and reorder callback have been received...
 
     if (1 == port_callback_reg) {
         Log("%i ports have been successfully created, and %i callback reg ports have been received... ok\n", 1, port_callback_reg);
@@ -950,8 +996,9 @@ int main (int argc, char *argv[])
      * Test if init callback initThread have been called.
      *
      */
-    if (init_clbk == 0)
+    if (init_clbk == 0) {
         printf("!!! ERROR !!! Jack_Thread_Init_Callback was not called !!.\n");
+    }
 
     jack_sleep(10 * 1000); // test see the clock in the graph at the begining...
 
@@ -978,14 +1025,15 @@ int main (int argc, char *argv[])
         printf("\n!!! ERROR !!! RT mode is always activated while freewheel mode is applied !\n");
         t_error = 1;
     }
-    if (activated == 0)
+    if (activated == 0) {
         printf("!!! ERROR !!! Freewheel mode doesn't activate audio callback !!\n");
+    }
 
     jack_set_freewheel(client1, 0);
     jack_sleep(7 * 1000);
 
-	if (jack_is_realtime(client1) == 1) {}
-    else {
+	if (jack_is_realtime(client1) == 1) {
+    } else {
         printf("\n!!! ERROR !!! freewheel mode fail to reactivate RT mode when exiting !\n");
         t_error = 1;
     }
@@ -1152,7 +1200,7 @@ int main (int argc, char *argv[])
         } else {
             // Connect created input to PHY output
             a = 0;
-            while (outports[a] != NULL) {
+            while (outports && outports[a] != NULL) {
                 if (jack_connect(client1, outports[a], jack_port_name(input_port1))) {
                     printf ("error : cannot connect input PHY port to client port %s\n", jack_port_name(input_port1));
                 } else {
@@ -1161,7 +1209,7 @@ int main (int argc, char *argv[])
                 a++;
             }
             // Try one time to "overconnect" 2 ports (the latest created)...
-            if (test_link == 0) {
+            if (test_link == 0 && outports && ((a - 1) > 0) && outports[a - 1]) {
                 if (jack_connect(client1, outports[a - 1], jack_port_name(input_port1)) == EEXIST) {
                     // cannot over-connect input PHY port to client port. ok.
                     test_link = 1;
@@ -1180,7 +1228,7 @@ int main (int argc, char *argv[])
         } else {
             // Connect created input to PHY output
             a = 0;
-            while (inports[a] != NULL) {
+            while (inports && inports[a] != NULL) {
                 if (jack_connect(client1, jack_port_name(output_port1), inports[a])) {
                     printf ("error : cannot connect input PHY port %s to client port %s\n", inports[a], jack_port_name(output_port1));
                 } else {
@@ -1189,7 +1237,7 @@ int main (int argc, char *argv[])
                 a++;
             }
             // Try one time to "overconnect" 2 ports (the latest created)...
-            if (test_link == 0) {
+            if (test_link == 0 && inports && ((a - 1) > 0) && inports[a - 1]) {
                 if (jack_connect(client1, jack_port_name(output_port1), inports[a - 1]) == EEXIST) {
                     // cannot over-connect output PHY port to client port. ok.
                     test_link = 1;
@@ -1269,6 +1317,8 @@ int main (int argc, char *argv[])
         }
         a++;
     }
+    
+    jack_sleep(1 * 1000); // To hope all port registration and reorder callback have been received...
 
     // Check port registration callback again
     if (j == port_callback_reg) {
@@ -1303,10 +1353,21 @@ int main (int argc, char *argv[])
         exit(1);
     }
 
-	// Check client registration callback
-	jack_sleep(1000);
-	if (client_register == 0)
-		printf("!!! ERROR !!! Client registration callback not called!\n");
+    // Check client registration callback after jack_client_new
+    jack_sleep(2000);
+    if (client_register == 0) {
+        printf("!!! ERROR !!! Client registration callback not called for an opened client !\n");
+    }
+        
+    // Check client registration callback after jack_client_close
+    jack_client_close(client2);
+    jack_sleep(2000);
+    if (client_register == 1) {
+        printf("!!! ERROR !!! Client registration callback not called for a closed client!\n");
+    }
+    
+    // Open client2 again...
+    client2 = jack_client_new(client_name2);
 
     /**
      * Register callback for this client.
@@ -1348,8 +1409,8 @@ int main (int argc, char *argv[])
     process2_activated = -1;
     process1_activated = -1;
     if (jack_activate(client2) < 0) {
-        printf ("Fatal error : cannot activate client2\n");
-        exit (1);
+        printf("Fatal error : cannot activate client2\n");
+        exit(1);
     }
 
     /**
@@ -1435,8 +1496,7 @@ int main (int argc, char *argv[])
     t_error = 0;
     inports = jack_get_ports(client1, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
     connexions1 = NULL;
-    assert(inports != NULL);
-    if (inports[0] != NULL) {
+    if (inports && inports[0] != NULL) {
         connexions1 = jack_port_get_connections (jack_port_by_name(client1, inports[0]));
         connexions2 = jack_port_get_all_connections(client1, jack_port_by_name(client1, inports[0]));
     }
@@ -1679,7 +1739,7 @@ int main (int argc, char *argv[])
         Log("Checking renaming of an unregistered port... ok\n");
     }
     inports = jack_get_ports(client1, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
-    if (jack_port_set_name(jack_port_by_name(client1, inports[0]), "new_name") == 0 ) {
+    if (inports && jack_port_set_name(jack_port_by_name(client1, inports[0]), "new_name") == 0 ) {
         printf("!!! WARNING !!! A PHYSICAL port can be renamed successfully !\n");
     } else {
         Log("Checking renaming of an unregistered port... ok\n");
@@ -1709,7 +1769,7 @@ int main (int argc, char *argv[])
 
     inports = jack_get_ports(client1, NULL, NULL, JackPortIsPhysical | JackPortIsInput);
     outports = jack_get_ports(client1, NULL, NULL, JackPortIsPhysical | JackPortIsOutput);
-    if (inports[0] != NULL) {
+    if (inports && outports && inports[0] != NULL &&  outports[0] != NULL) {
         output_ext_latency = jack_port_get_latency (jack_port_by_name(client1, inports[0]));  // from client to out driver (which has "inputs" ports..)
 		input_ext_latency = jack_port_get_latency (jack_port_by_name(client1, outports[0]));  // from in driver (which has "output" ports..) to client
         if (output_ext_latency != jack_port_get_total_latency(client1, jack_port_by_name(client1, inports[0]))) {
@@ -1814,8 +1874,9 @@ int main (int argc, char *argv[])
             jack_transport_stop(client1);
             Log("Transport state : %i\n", ts);
         }
-        if (jack_set_sync_callback(client2, Jack_Sync_Callback, 0) != 0)
+        if (jack_set_sync_callback(client2, Jack_Sync_Callback, 0) != 0) {
             printf("error while calling set_sync_callback...\n");
+        }
 
         Log("starting transport...\n");
 
@@ -1880,8 +1941,9 @@ int main (int argc, char *argv[])
             ts = jack_transport_query(client2, &pos);
         }
 
-        if (sync_called == 0)
+        if (sync_called == 0) {
             Log("!!! ERROR !!! starting a slow-sync client does not work correctly\n");
+        }
 
         Log("Sync callback have been called %i times.\n", sync_called);
         display_transport_state();
@@ -2006,7 +2068,6 @@ int main (int argc, char *argv[])
 	jack_set_process_callback(client1, process5, client1);
 	jack_activate(client1);
 	jack_sleep(3 * 1000);
-    
 
 	/**
      * Checking alternate thread model
@@ -2065,8 +2126,8 @@ int main (int argc, char *argv[])
     sprintf (filename, "framegraph-%i.gnu", cur_buffer_size);
     file = fopen(filename, "w");
     if (file == NULL) {
-        fprintf(stderr, "Erreur dans l'ouverture du fichier");
-        exit( -1);
+        fprintf(stderr, "Error while opening file");
+        exit(-1);
     }
     fprintf(file, "reset\n");
     fprintf(file, "set terminal png transparent nocrop enhanced\n");
diff --git a/wscript b/wscript
index c2fb95c..02d59c3 100644
--- a/wscript
+++ b/wscript
@@ -13,7 +13,7 @@ import re
 import Logs
 import sys
 
-VERSION='1.9.9'
+VERSION='1.9.10'
 APPNAME='jack'
 JACK_API_VERSION = '0.1.0'
 
@@ -76,6 +76,7 @@ def options(opt):
     opt.add_option('--firewire', action='store_true', default=False, help='Enable FireWire driver (FFADO)')
     opt.add_option('--freebob', action='store_true', default=False, help='Enable FreeBob driver')
     opt.add_option('--alsa', action='store_true', default=False, help='Enable ALSA driver')
+    opt.add_option('--autostart', type='string', default="default", help='Autostart method. Possible values: "default", "classic", "dbus", "none"')
     opt.sub_options('dbus')
 
 def configure(conf):
@@ -178,6 +179,8 @@ def configure(conf):
         if conf.check_cc(header_name='opus/opus_custom.h', mandatory=False):
             conf.define('HAVE_OPUS', 1)
             conf.env['WITH_OPUS'] = True
+        else:
+            conf.define('HAVE_OPUS', 0)
 
 
     conf.env['LIB_PTHREAD'] = ['pthread']
@@ -214,6 +217,27 @@ def configure(conf):
         conf.env.append_unique('CFLAGS', '-g')
         conf.env.append_unique('LINKFLAGS', '-g')
 
+    if not Options.options.autostart in ["default", "classic", "dbus", "none"]:
+        conf.fatal("Invalid autostart value \"" + Options.options.autostart + "\"")
+
+    if Options.options.autostart == "default":
+        if conf.env['BUILD_JACKDBUS'] == True and conf.env['BUILD_JACKD'] == False:
+            conf.env['AUTOSTART_METHOD'] = "dbus"
+        else:
+            conf.env['AUTOSTART_METHOD'] = "classic"
+    else:
+        conf.env['AUTOSTART_METHOD'] = Options.options.autostart
+
+    if conf.env['AUTOSTART_METHOD'] == "dbus" and not conf.env['BUILD_JACKDBUS']:
+        conf.fatal("D-Bus autostart mode was specified but jackdbus will not be built")
+    if conf.env['AUTOSTART_METHOD'] == "classic" and not conf.env['BUILD_JACKD']:
+        conf.fatal("Classic autostart mode was specified but jackd will not be built")
+
+    if conf.env['AUTOSTART_METHOD'] == "dbus":
+        conf.define('USE_LIBDBUS_AUTOLAUNCH', 1)
+    elif conf.env['AUTOSTART_METHOD'] == "classic":
+        conf.define('USE_CLASSIC_AUTOLAUNCH', 1)
+
     conf.define('CLIENT_NUM', Options.options.clients)
     conf.define('PORT_NUM_FOR_CLIENT', Options.options.application_ports)
 
@@ -224,8 +248,6 @@ def configure(conf):
     conf.define('JACKMP', 1)
     if conf.env['BUILD_JACKDBUS'] == True:
         conf.define('JACK_DBUS', 1)
-        if conf.env['BUILD_JACKD'] == False:
-            conf.define('USE_LIBDBUS_AUTOLAUNCH', 1)
     if conf.env['BUILD_WITH_PROFILE'] == True:
         conf.define('JACK_MONITOR', 1)
     conf.write_config_header('config.h', remove=False)
@@ -277,6 +299,7 @@ def configure(conf):
 
     display_feature('Build standard JACK (jackd)', conf.env['BUILD_JACKD'])
     display_feature('Build D-Bus JACK (jackdbus)', conf.env['BUILD_JACKDBUS'])
+    display_msg('Autostart method', conf.env['AUTOSTART_METHOD'])
 
     if conf.env['BUILD_JACKDBUS'] and conf.env['BUILD_JACKD']:
         print(Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues:' + Logs.colors.NORMAL)
@@ -335,10 +358,10 @@ def build(bld):
             bld.add_subdirs('dbus')
 
     if bld.env['BUILD_DOXYGEN_DOCS'] == True:
-        share_dir = bld.env.get_destdir() + bld.env['PREFIX'] + '/share/jack-audio-connection-kit'
         html_docs_source_dir = "build/default/html"
-        html_docs_install_dir = share_dir + '/reference/html/'
-        if Options.commands['install']:
+        if bld.cmd == 'install':
+            share_dir = bld.options.destdir + bld.env['PREFIX'] + '/share/jack-audio-connection-kit'
+            html_docs_install_dir = share_dir + '/reference/html/'
             if os.path.isdir(html_docs_install_dir):
                 Logs.pprint('CYAN', "Removing old doxygen documentation installation...")
                 shutil.rmtree(html_docs_install_dir)
@@ -346,17 +369,17 @@ def build(bld):
             Logs.pprint('CYAN', "Installing doxygen documentation...")
             shutil.copytree(html_docs_source_dir, html_docs_install_dir)
             Logs.pprint('CYAN', "Installing doxygen documentation done.")
-        elif Options.commands['uninstall']:
+        elif bld.cmd =='uninstall':
             Logs.pprint('CYAN', "Uninstalling doxygen documentation...")
             if os.path.isdir(share_dir):
                 shutil.rmtree(share_dir)
             Logs.pprint('CYAN', "Uninstalling doxygen documentation done.")
-        elif Options.commands['clean']:
+        elif bld.cmd =='clean':
             if os.access(html_docs_source_dir, os.R_OK):
                 Logs.pprint('CYAN', "Removing doxygen generated documentation...")
                 shutil.rmtree(html_docs_source_dir)
                 Logs.pprint('CYAN', "Removing doxygen generated documentation done.")
-        elif Options.commands['build']:
+        elif bld.cmd =='build':
             if not os.access(html_docs_source_dir, os.R_OK):
                 os.popen("doxygen").read()
             else:

-- 
jackd2 packaging



More information about the pkg-multimedia-commits mailing list