[SCM] jackd2/upstream: Merge

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


The following commit has been merged in the upstream branch:
commit f230da9aca72c3db1dd22bee15bf06bd281c1429
Author: Adrian Knoth <adi at drcomp.erfurt.thur.de>
Date:   Sun Jan 27 21:16:06 2013 +0100

    Merge

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/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/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/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/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 9818f71..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"
@@ -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;
@@ -242,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");

-- 
jackd2 packaging



More information about the pkg-multimedia-commits mailing list