[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