summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog15
-rw-r--r--common/JackAudioAdapterInterface.cpp24
-rw-r--r--common/JackDebugClient.cpp2
-rw-r--r--common/JackDriver.cpp2
-rw-r--r--common/JackEngine.cpp87
-rw-r--r--common/JackEngine.h10
-rw-r--r--common/JackEngineControl.cpp3
-rw-r--r--common/JackEngineControl.h2
-rw-r--r--common/JackEngineProfiling.cpp75
-rw-r--r--common/JackLibClient.cpp3
-rw-r--r--common/JackLockedEngine.h82
-rw-r--r--common/JackMutex.h6
-rw-r--r--common/JackNetOneDriver.cpp2
-rw-r--r--common/jack/jack.h214
-rw-r--r--common/jack/midiport.h22
-rw-r--r--common/jack/thread.h17
-rw-r--r--common/jack/transport.h25
-rw-r--r--common/jack/weakjack.h52
-rw-r--r--common/jack/weakmacros.h61
-rw-r--r--common/netjack.c35
-rw-r--r--common/netjack_packet.c7
-rw-r--r--common/ringbuffer.c4
-rw-r--r--common/shm.c123
-rw-r--r--common/shm.h22
-rw-r--r--dbus/wscript16
-rw-r--r--example-clients/alsa_in.c4
-rw-r--r--example-clients/alsa_out.c4
-rwxr-xr-xexample-clients/jack_control4
-rw-r--r--example-clients/netsource.c6
-rw-r--r--example-clients/wscript7
-rw-r--r--linux/firewire/JackFFADODriver.cpp8
-rw-r--r--linux/wscript2
-rw-r--r--macosx/JackMachServerChannel.cpp5
-rw-r--r--macosx/JackMachServerNotifyChannel.cpp4
-rw-r--r--macosx/coreaudio/JackCoreAudioDriver.cpp14
-rw-r--r--posix/JackPosixMutex.h6
-rw-r--r--windows/JackRouter/JackRouter.cpp840
-rw-r--r--windows/JackRouter/JackRouter.def9
-rw-r--r--windows/JackRouter/JackRouter.dsp163
-rw-r--r--windows/JackRouter/JackRouter.dsw29
-rw-r--r--windows/JackRouter/JackRouter.h174
-rw-r--r--windows/JackRouter/Psapi.Libbin0 -> 7230 bytes
-rw-r--r--windows/JackRouter/README3
-rw-r--r--windows/JackRouter/profport.cpp315
-rw-r--r--windows/JackRouter/profport.h37
-rw-r--r--windows/JackRouter/psapi.dllbin0 -> 23040 bytes
-rw-r--r--windows/JackRouter/psapi.h95
-rw-r--r--windows/JackRouter/resource.h15
-rw-r--r--windows/JackRouter/resource.rc109
-rw-r--r--windows/Setup/JackRouter.dllbin32768 -> 32768 bytes
-rw-r--r--windows/Setup/jack.ci2
-rw-r--r--windows/jack_netsource.cbp223
-rw-r--r--windows/jack_netsource.rc48
-rw-r--r--wscript8
54 files changed, 2500 insertions, 545 deletions
diff --git a/ChangeLog b/ChangeLog
index b4f3608b..91292e25 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -3,6 +3,7 @@
---------------------------
Dmitry Baikov
+Gabriel M. Beddingfield
Steven Chamberlain
Thom Johansen
Thibault LeMeur
@@ -21,12 +22,24 @@ Torben Hohn
Paul Davis
Peter L Jones
Devin Anderson
-Josh Green
+Josh Green
+Mario Lang
---------------------------
Jackdmp changes log
---------------------------
+2010-01-29 Gabriel M. Beddingfield <gabriel@teuton.org>
+
+ * Change JackEngineProfiling and JackAudioAdapterInterface gnuplot scripts to output SVG instead of PDF.
+
+2009-12-15 Stephane Letz <letz@grame.fr>
+
+ * Shared memory manager was calling abort in case of fatal error, now return an error in caller.
+
+2009-12-13 Stephane Letz <letz@grame.fr>
+
+ * Mario Lang alsa_io time calculation overflow patch.
2009-12-10 Stephane Letz <letz@grame.fr>
diff --git a/common/JackAudioAdapterInterface.cpp b/common/JackAudioAdapterInterface.cpp
index dff17818..738363b6 100644
--- a/common/JackAudioAdapterInterface.cpp
+++ b/common/JackAudioAdapterInterface.cpp
@@ -68,8 +68,8 @@ namespace Jack
fprintf(file, buffer);
fprintf(file, "\n unset multiplot\n");
- fprintf(file, "set output 'AdapterTiming1.pdf\n");
- fprintf(file, "set terminal pdf\n");
+ fprintf(file, "set output 'AdapterTiming1.svg\n");
+ fprintf(file, "set terminal svg\n");
fprintf(file, "set multiplot\n");
fprintf(file, "set grid\n");
@@ -80,8 +80,10 @@ namespace Jack
fprintf(file, "plot ");
sprintf(buffer, "\"JackAudioAdapter.log\" using 2 title \"Consumer interrupt period\" with lines,");
fprintf(file, buffer);
- sprintf(buffer, "\"JackAudioAdapter.log\" using 3 title \"Producer interrupt period\" with lines");
+ sprintf(buffer, "\"JackAudioAdapter.log\" using 3 title \"Producer interrupt period\" with lines\n");
fprintf(file, buffer);
+ fprintf(file, "unset multiplot\n");
+ fprintf(file, "unset output\n");
fclose(file);
@@ -100,8 +102,8 @@ namespace Jack
fprintf(file, buffer);
fprintf(file, "\n unset multiplot\n");
- fprintf(file, "set output 'AdapterTiming2.pdf\n");
- fprintf(file, "set terminal pdf\n");
+ fprintf(file, "set output 'AdapterTiming2.svg\n");
+ fprintf(file, "set terminal svg\n");
fprintf(file, "set multiplot\n");
fprintf(file, "set grid\n");
@@ -112,8 +114,10 @@ namespace Jack
fprintf(file, "plot ");
sprintf(buffer, "\"JackAudioAdapter.log\" using 4 title \"Ratio 1\" with lines,");
fprintf(file, buffer);
- sprintf(buffer, "\"JackAudioAdapter.log\" using 5 title \"Ratio 2\" with lines");
+ sprintf(buffer, "\"JackAudioAdapter.log\" using 5 title \"Ratio 2\" with lines\n");
fprintf(file, buffer);
+ fprintf(file, "unset multiplot\n");
+ fprintf(file, "unset output\n");
fclose(file);
@@ -132,8 +136,8 @@ namespace Jack
fprintf(file, buffer);
fprintf(file, "\n unset multiplot\n");
- fprintf(file, "set output 'AdapterTiming3.pdf\n");
- fprintf(file, "set terminal pdf\n");
+ fprintf(file, "set output 'AdapterTiming3.svg\n");
+ fprintf(file, "set terminal svg\n");
fprintf(file, "set multiplot\n");
fprintf(file, "set grid\n");
@@ -144,8 +148,10 @@ namespace Jack
fprintf(file, "plot ");
sprintf(buffer, "\"JackAudioAdapter.log\" using 6 title \"Frames position in consumer ringbuffer\" with lines,");
fprintf(file, buffer);
- sprintf(buffer, "\"JackAudioAdapter.log\" using 7 title \"Frames position in producer ringbuffer\" with lines");
+ sprintf(buffer, "\"JackAudioAdapter.log\" using 7 title \"Frames position in producer ringbuffer\" with lines\n");
fprintf(file, buffer);
+ fprintf(file, "unset multiplot\n");
+ fprintf(file, "unset output\n");
fclose(file);
}
diff --git a/common/JackDebugClient.cpp b/common/JackDebugClient.cpp
index df263779..6a90fcdc 100644
--- a/common/JackDebugClient.cpp
+++ b/common/JackDebugClient.cpp
@@ -121,7 +121,7 @@ void JackDebugClient::CheckClient(const char* function_name) const
*fStream << "!!! ERROR !!! : Accessing a client '" << fClientName << "' already closed " << "from " << function_name << endl;
*fStream << "This is likely to cause crash !'" << endl;
#ifdef __APPLE__
- Debugger();
+ // Debugger();
#endif
}
}
diff --git a/common/JackDriver.cpp b/common/JackDriver.cpp
index bab5db0f..a485d810 100644
--- a/common/JackDriver.cpp
+++ b/common/JackDriver.cpp
@@ -167,7 +167,7 @@ int JackDriver::Open(jack_nframes_t buffer_size,
int JackDriver::Close()
{
- if (fClientControl.fRefNum > 0) {
+ if (fClientControl.fRefNum >= 0) {
jack_log("JackDriver::Close");
fGraphManager->DirectDisconnect(fClientControl.fRefNum, fClientControl.fRefNum); // Disconnect driver from itself for sync
fClientControl.fActive = false;
diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp
index 6f104b4e..8c205975 100644
--- a/common/JackEngine.cpp
+++ b/common/JackEngine.cpp
@@ -35,8 +35,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack
{
-#define AssertRefnum(ref) assert(ref >= 0 && ref < CLIENT_NUM);
-
JackEngine::JackEngine(JackGraphManager* manager,
JackSynchro* table,
JackEngineControl* control)
@@ -213,28 +211,28 @@ void JackEngine::NotifyClient(int refnum, int event, int sync, const char* messa
JackClientInterface* client = fClientTable[refnum];
// The client may be notified by the RT thread while closing
- if (!client) {
- jack_log("JackEngine::NotifyClient: client not available anymore");
- } else if (client->GetClientControl()->fCallback[event]) {
- if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0)
- jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2);
- } else {
- jack_log("JackEngine::NotifyClient: no callback for event = %ld", event);
+ if (client) {
+
+ if (client && client->GetClientControl()->fCallback[event]) {
+ /*
+ Important for internal clients : unlock before calling the notification callbacks.
+ */
+ bool res = fMutex.Unlock();
+ if (client->ClientNotify(refnum, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0)
+ jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2);
+ if (res)
+ fMutex.Lock();
+
+ } else {
+ jack_log("JackEngine::NotifyClient: no callback for event = %ld", event);
+ }
}
}
-void JackEngine::NotifyClients(int event, int sync, const char* message, int value1, int value2)
+void JackEngine::NotifyClients(int event, int sync, const char* message, int value1, int value2)
{
for (int i = 0; i < CLIENT_NUM; i++) {
- JackClientInterface* client = fClientTable[i];
- if (client) {
- if (client->GetClientControl()->fCallback[event]) {
- if (client->ClientNotify(i, client->GetClientControl()->fName, event, sync, message, value1, value2) < 0)
- jack_error("NotifyClient fails name = %s event = %ld val1 = %ld val2 = %ld", client->GetClientControl()->fName, event, value1, value2);
- } else {
- jack_log("JackEngine::NotifyClients: no callback for event = %ld", event);
- }
- }
+ NotifyClient(i, event, sync, message, value1, value2);
}
}
@@ -274,8 +272,7 @@ void JackEngine::NotifyRemoveClient(const char* name, int refnum)
void JackEngine::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs)
{
// Use the audio thread => request thread communication channel
- fEngineControl->ResetFrameTime(callback_usecs);
- fEngineControl->NotifyXRun(delayed_usecs);
+ fEngineControl->NotifyXRun(callback_usecs, delayed_usecs);
fChannel.Notify(ALL_CLIENTS, kXRunCallback, 0);
}
@@ -348,14 +345,9 @@ void JackEngine::NotifyActivate(int refnum)
int JackEngine::GetInternalClientName(int refnum, char* name_res)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
- if (client) {
- strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE);
- return 0;
- } else {
- return -1;
- }
+ strncpy(name_res, client->GetClientControl()->fName, JACK_CLIENT_NAME_SIZE);
+ return 0;
}
int JackEngine::InternalClientHandle(const char* client_name, int* status, int* int_ref)
@@ -378,7 +370,6 @@ int JackEngine::InternalClientHandle(const char* client_name, int* status, int*
int JackEngine::InternalClientUnload(int refnum, int* status)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
if (client) {
int res = client->Close();
@@ -592,26 +583,19 @@ error:
// Used for external clients
int JackEngine::ClientExternalClose(int refnum)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
-
- if (client) {
- fEngineControl->fTransport.ResetTimebase(refnum);
- int res = ClientCloseAux(refnum, client, true);
- client->Close();
- delete client;
- return res;
- } else {
- return -1;
- }
+ fEngineControl->fTransport.ResetTimebase(refnum);
+ int res = ClientCloseAux(refnum, client, true);
+ client->Close();
+ delete client;
+ return res;
}
// Used for server internal clients or drivers when the RT thread is stopped
int JackEngine::ClientInternalClose(int refnum, bool wait)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
- return (client) ? ClientCloseAux(refnum, client, wait) : -1;
+ return ClientCloseAux(refnum, client, wait);
}
int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wait)
@@ -656,11 +640,9 @@ int JackEngine::ClientCloseAux(int refnum, JackClientInterface* client, bool wai
int JackEngine::ClientActivate(int refnum, bool is_real_time)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
- assert(fClientTable[refnum]);
-
jack_log("JackEngine::ClientActivate ref = %ld name = %s", refnum, client->GetClientControl()->fName);
+
if (is_real_time)
fGraphManager->Activate(refnum);
@@ -700,11 +682,7 @@ int JackEngine::ClientActivate(int refnum, bool is_real_time)
// May be called without client
int JackEngine::ClientDeactivate(int refnum)
{
- AssertRefnum(refnum);
JackClientInterface* client = fClientTable[refnum];
- if (client == NULL)
- return -1;
-
jack_log("JackEngine::ClientDeactivate ref = %ld name = %s", refnum, client->GetClientControl()->fName);
jack_int_t input_ports[PORT_NUM_FOR_CLIENT];
@@ -749,8 +727,6 @@ int JackEngine::ClientDeactivate(int refnum)
int JackEngine::PortRegister(int refnum, const char* name, const char *type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index)
{
jack_log("JackEngine::PortRegister ref = %ld name = %s type = %s flags = %d buffer_size = %d", refnum, name, type, flags, buffer_size);
- AssertRefnum(refnum);
- assert(fClientTable[refnum]);
JackClientInterface* client = fClientTable[refnum];
// Check if port name already exists
@@ -772,8 +748,6 @@ int JackEngine::PortRegister(int refnum, const char* name, const char *type, uns
int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index)
{
jack_log("JackEngine::PortUnRegister ref = %ld port_index = %ld", refnum, port_index);
- AssertRefnum(refnum);
- assert(fClientTable[refnum]);
JackClientInterface* client = fClientTable[refnum];
// Disconnect port ==> notification is sent
@@ -791,7 +765,6 @@ int JackEngine::PortUnRegister(int refnum, jack_port_id_t port_index)
int JackEngine::PortConnect(int refnum, const char* src, const char* dst)
{
jack_log("JackEngine::PortConnect src = %s dst = %s", src, dst);
- AssertRefnum(refnum);
jack_port_id_t port_src, port_dst;
return (fGraphManager->GetTwoPorts(src, dst, &port_src, &port_dst) < 0)
@@ -802,7 +775,6 @@ int JackEngine::PortConnect(int refnum, const char* src, const char* dst)
int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
jack_log("JackEngine::PortConnect src = %d dst = %d", src, dst);
- AssertRefnum(refnum);
JackClientInterface* client;
int ref;
@@ -838,7 +810,6 @@ int JackEngine::PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
int JackEngine::PortDisconnect(int refnum, const char* src, const char* dst)
{
jack_log("JackEngine::PortDisconnect src = %s dst = %s", src, dst);
- AssertRefnum(refnum);
jack_port_id_t port_src, port_dst;
return (fGraphManager->GetTwoPorts(src, dst, &port_src, &port_dst) < 0)
@@ -849,8 +820,7 @@ int JackEngine::PortDisconnect(int refnum, const char* src, const char* dst)
int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
jack_log("JackEngine::PortDisconnect src = %d dst = %d", src, dst);
- AssertRefnum(refnum);
-
+
if (dst == ALL_PORTS) {
jack_int_t connections[CONNECTION_NUM_FOR_PORT];
@@ -886,7 +856,6 @@ int JackEngine::PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t ds
int JackEngine::PortRename(int refnum, jack_port_id_t port, const char* name)
{
- AssertRefnum(refnum);
char old_name[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE];
strcpy(old_name, fGraphManager->GetPort(port)->GetName());
fGraphManager->GetPort(port)->SetName(name);
diff --git a/common/JackEngine.h b/common/JackEngine.h
index 3a4a24a9..945d7e9c 100644
--- a/common/JackEngine.h
+++ b/common/JackEngine.h
@@ -23,6 +23,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include "JackConstants.h"
#include "JackGraphManager.h"
#include "JackSynchro.h"
+#include "JackMutex.h"
#include "JackTransportEngine.h"
#include "JackPlatformPlug.h"
@@ -37,8 +38,10 @@ class JackExternalClient;
\brief Engine description.
*/
-class SERVER_EXPORT JackEngine
+class SERVER_EXPORT JackEngine : public JackLockAble
{
+ friend class JackLockedEngine;
+
private:
JackGraphManager* fGraphManager;
@@ -71,6 +74,11 @@ class SERVER_EXPORT JackEngine
void NotifyPortConnect(jack_port_id_t src, jack_port_id_t dst, bool onoff);
void NotifyPortRename(jack_port_id_t src, const char* old_name);
void NotifyActivate(int refnum);
+
+ bool CheckClient(int refnum)
+ {
+ return (refnum >= 0 && refnum < CLIENT_NUM && fClientTable[refnum] != NULL);
+ }
public:
diff --git a/common/JackEngineControl.cpp b/common/JackEngineControl.cpp
index 872dcd32..db13ae78 100644
--- a/common/JackEngineControl.cpp
+++ b/common/JackEngineControl.cpp
@@ -81,8 +81,9 @@ void JackEngineControl::ResetRollingUsecs()
fRollingInterval = int(floor((JACK_ENGINE_ROLLING_INTERVAL * 1000.f) / fPeriodUsecs));
}
-void JackEngineControl::NotifyXRun(float delayed_usecs)
+void JackEngineControl::NotifyXRun(jack_time_t callback_usecs, float delayed_usecs)
{
+ ResetFrameTime(callback_usecs);
fXrunDelayedUsecs = delayed_usecs;
if (delayed_usecs > fMaxDelayedUsecs)
fMaxDelayedUsecs = delayed_usecs;
diff --git a/common/JackEngineControl.h b/common/JackEngineControl.h
index 326e3b7f..3ba54b87 100644
--- a/common/JackEngineControl.h
+++ b/common/JackEngineControl.h
@@ -162,7 +162,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
}
// XRun
- void NotifyXRun(float delayed_usecs);
+ void NotifyXRun(jack_time_t callback_usecs, float delayed_usecs);
void ResetXRun()
{
fMaxDelayedUsecs = 0.f;
diff --git a/common/JackEngineProfiling.cpp b/common/JackEngineProfiling.cpp
index cfe5d636..4557fec9 100644
--- a/common/JackEngineProfiling.cpp
+++ b/common/JackEngineProfiling.cpp
@@ -95,7 +95,7 @@ JackEngineProfiling::~JackEngineProfiling()
std::ofstream fStream1("Timing1.plot", std::ios_base::ate);
if (!fStream1.is_open()) {
- jack_error("JackEngineProfiling::Save cannot open Timing1.log file");
+ jack_error("JackEngineProfiling::Save cannot open Timing1.plot file");
} else {
fStream1 << "set grid\n";
@@ -104,21 +104,22 @@ JackEngineProfiling::~JackEngineProfiling()
fStream1 << "set ylabel \"usec\"\n";
fStream1 << "plot \"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines \n";
- fStream1 << "set output 'Timing1.pdf\n";
- fStream1 << "set terminal pdf\n";
+ fStream1 << "set output 'Timing1.svg\n";
+ fStream1 << "set terminal svg\n";
fStream1 << "set grid\n";
fStream1 << "set title \"Audio driver timing\"\n";
fStream1 << "set xlabel \"audio cycles\"\n";
fStream1 << "set ylabel \"usec\"\n";
fStream1 << "plot \"JackEngineProfiling.log\" using 1 title \"Audio period\" with lines \n";
+ fStream1 << "unset output\n";
}
// Driver end date
std::ofstream fStream2("Timing2.plot", std::ios_base::ate);
if (!fStream2.is_open()) {
- jack_error("JackEngineProfiling::Save cannot open Timing2.log file");
+ jack_error("JackEngineProfiling::Save cannot open Timing2.plot file");
} else {
fStream2 << "set grid\n";
@@ -127,14 +128,15 @@ JackEngineProfiling::~JackEngineProfiling()
fStream2 << "set ylabel \"usec\"\n";
fStream2 << "plot \"JackEngineProfiling.log\" using 2 title \"Driver end date\" with lines \n";
- fStream2 << "set output 'Timing2.pdf\n";
- fStream2 << "set terminal pdf\n";
+ fStream2 << "set output 'Timing2.svg\n";
+ fStream2 << "set terminal svg\n";
fStream2 << "set grid\n";
fStream2 << "set title \"Driver end date\"\n";
fStream2 << "set xlabel \"audio cycles\"\n";
fStream2 << "set ylabel \"usec\"\n";
fStream2 << "plot \"JackEngineProfiling.log\" using 2 title \"Driver end date\" with lines \n";
+ fStream2 << "unset output\n";
}
// Clients end date
@@ -142,7 +144,7 @@ JackEngineProfiling::~JackEngineProfiling()
std::ofstream fStream3("Timing3.plot", std::ios_base::ate);
if (!fStream3.is_open()) {
- jack_error("JackEngineProfiling::Save cannot open Timing3.log file");
+ jack_error("JackEngineProfiling::Save cannot open Timing3.plot file");
} else {
fStream3 << "set multiplot\n";
@@ -170,8 +172,8 @@ JackEngineProfiling::~JackEngineProfiling()
}
fStream3 << "\n unset multiplot\n";
- fStream3 << "set output 'Timing3.pdf\n";
- fStream3 << "set terminal pdf\n";
+ fStream3 << "set output 'Timing3.svg\n";
+ fStream3 << "set terminal svg\n";
fStream3 << "set multiplot\n";
fStream3 << "set grid\n";
@@ -196,6 +198,8 @@ JackEngineProfiling::~JackEngineProfiling()
fStream3 << "\"JackEngineProfiling.log\" using " << ((i + 1) * 7) - 1 << " title \"" << fIntervalTable[i].fName << "\" with lines,";
}
}
+ fStream3 << "\nunset multiplot\n";
+ fStream3 << "unset output\n";
}
}
@@ -204,7 +208,7 @@ JackEngineProfiling::~JackEngineProfiling()
std::ofstream fStream4("Timing4.plot", std::ios_base::ate);
if (!fStream4.is_open()) {
- jack_error("JackEngineProfiling::Save cannot open Timing4.log file");
+ jack_error("JackEngineProfiling::Save cannot open Timing4.plot file");
} else {
fStream4 << "set multiplot\n";
@@ -222,8 +226,8 @@ JackEngineProfiling::~JackEngineProfiling()
}
fStream4 << "\n unset multiplot\n";
- fStream4 << "set output 'Timing4.pdf\n";
- fStream4 << "set terminal pdf\n";
+ fStream4 << "set output 'Timing4.svg\n";
+ fStream4 << "set terminal svg\n";
fStream4 << "set multiplot\n";
fStream4 << "set grid\n";
@@ -238,6 +242,8 @@ JackEngineProfiling::~JackEngineProfiling()
fStream4 << "\"JackEngineProfiling.log\" using " << ((i + 1) * 7) << " title \"" << fIntervalTable[i].fName << "\" with lines,";
}
}
+ fStream4 << "\nunset multiplot\n";
+ fStream4 << "unset output\n";
}
}
@@ -246,7 +252,7 @@ JackEngineProfiling::~JackEngineProfiling()
std::ofstream fStream5("Timing5.plot", std::ios_base::ate);
if (!fStream5.is_open()) {
- jack_error("JackEngineProfiling::Save cannot open Timing5.log file");
+ jack_error("JackEngineProfiling::Save cannot open Timing5.plot file");
} else {
fStream5 << "set multiplot\n";
@@ -264,8 +270,8 @@ JackEngineProfiling::~JackEngineProfiling()
}
fStream5 << "\n unset multiplot\n";
- fStream5 << "set output 'Timing5.pdf\n";
- fStream5 << "set terminal pdf\n";
+ fStream5 << "set output 'Timing5.svg\n";
+ fStream5 << "set terminal svg\n";
fStream5 << "set multiplot\n";
fStream5 << "set grid\n";
@@ -280,8 +286,47 @@ JackEngineProfiling::~JackEngineProfiling()
fStream5 << "\"JackEngineProfiling.log\" using " << ((i + 1) * 7) + 1 << " title \"" << fIntervalTable[i].fName << "\" with lines,";
}
}
+ fStream5 << "\nunset multiplot\n";
+ fStream5 << "unset output\n";
}
}
+
+ std::ofstream fStream6("Timings.html", std::ios_base::ate);
+ if (!fStream6.is_open()) {
+ jack_error("JackEngineProfiling::Save cannot open Timings.html file");
+ } else {
+ fStream6 << "<?xml version='1.0' encoding='utf-8'?>\n";
+ fStream6 << "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n";
+ fStream6 << "\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
+ fStream6 << "<html xmlns='http://www.w3.org/1999/xhtml' lang='en'>\n";
+ fStream6 << " <head>\n";
+ fStream6 << " <title>JACK engine profiling</title>\n";
+ fStream6 << " <!-- assuming that images are 600px wide -->\n";
+ fStream6 << " <style media='all' type='text/css'>\n";
+ fStream6 << " .center { margin-left:auto ; margin-right: auto; width: 650px; height: 550px }\n";
+ fStream6 << " </style>\n";
+ fStream6 << " </head>\n";
+ fStream6 << " <body>\n";
+ fStream6 << " <h2 style='text-align:center'>JACK engine profiling</h2>\n";
+ fStream6 << " <div class='center'><object class='center' type='image/svg+xml' data='Timing1.svg'>Timing1</object></div>";
+ fStream6 << " <div class='center'><object class='center' type='image/svg+xml' data='Timing2.svg'>Timing2</object></div>";
+ fStream6 << " <div class='center'><object class='center' type='image/svg+xml' data='Timing3.svg'>Timing3</object></div>";
+ fStream6 << " <div class='center'><object class='center' type='image/svg+xml' data='Timing4.svg'>Timing4</object></div>";
+ fStream6 << " <div class='center'><object class='center' type='image/svg+xml' data='Timing5.svg'>Timing5</object></div>";
+ fStream6 << " </body>\n";
+ fStream6 << "</html>\n";
+ }
+
+ std::ofstream fStream7("generate_timings", std::ios_base::ate);
+ if (!fStream7.is_open()) {
+ jack_error("JackEngineProfiling::Save cannot open generate_timings file");
+ } else {
+ fStream7 << "gnuplot -persist Timing1.plot \n";
+ fStream7 << "gnuplot -persist Timing2.plot\n";
+ fStream7 << "gnuplot -persist Timing3.plot\n";
+ fStream7 << "gnuplot -persist Timing4.plot\n";
+ fStream7 << "gnuplot -persist Timing5.plot\n";
+ }
}
bool JackEngineProfiling::CheckClient(const char* name, int cur_point)
diff --git a/common/JackLibClient.cpp b/common/JackLibClient.cpp
index 4c92e9e3..effdfc6f 100644
--- a/common/JackLibClient.cpp
+++ b/common/JackLibClient.cpp
@@ -103,6 +103,9 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_
} catch (int n) {
jack_error("Map shared memory segments exception %d", n);
goto error;
+ } catch (...) {
+ jack_error("Unknown error...");
+ goto error;
}
SetupDriverSync(false);
diff --git a/common/JackLockedEngine.h b/common/JackLockedEngine.h
index a9f044a8..827ab527 100644
--- a/common/JackLockedEngine.h
+++ b/common/JackLockedEngine.h
@@ -37,7 +37,6 @@ See : http://groups.google.com/group/comp.programming.threads/browse_thread/thre
catch (...) {
// Assuming thread cancellation, must rethrow
throw;
-
}
*/
@@ -62,11 +61,12 @@ catch (...) {
throw; \
} \
+
/*!
\brief Locked Engine, access to methods is serialized using a mutex.
*/
-class SERVER_EXPORT JackLockedEngine : public JackLockAble
+class SERVER_EXPORT JackLockedEngine
{
private:
@@ -99,21 +99,21 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int ClientCheck(const char* name, char* name_res, int protocol, int options, int* status)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.ClientCheck(name, name_res, protocol, options, status);
CATCH_EXCEPTION_RETURN
}
int ClientExternalOpen(const char* name, int pid, int* ref, int* shared_engine, int* shared_client, int* shared_graph_manager)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.ClientExternalOpen(name, pid, ref, shared_engine, shared_client, shared_graph_manager);
CATCH_EXCEPTION_RETURN
}
int ClientInternalOpen(const char* name, int* ref, JackEngineControl** shared_engine, JackGraphManager** shared_manager, JackClientInterface* client, bool wait)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.ClientInternalOpen(name, ref, shared_engine, shared_manager, client, wait);
CATCH_EXCEPTION_RETURN
}
@@ -121,30 +121,30 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int ClientExternalClose(int refnum)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.ClientExternalClose(refnum);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.ClientExternalClose(refnum) : - 1;
CATCH_EXCEPTION_RETURN
}
int ClientInternalClose(int refnum, bool wait)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.ClientInternalClose(refnum, wait);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.ClientInternalClose(refnum, wait) : -1;
CATCH_EXCEPTION_RETURN
}
int ClientActivate(int refnum, bool is_real_time)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.ClientActivate(refnum, is_real_time);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.ClientActivate(refnum, is_real_time) : -1;
CATCH_EXCEPTION_RETURN
}
int ClientDeactivate(int refnum)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.ClientDeactivate(refnum);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.ClientDeactivate(refnum) : -1;
CATCH_EXCEPTION_RETURN
}
@@ -152,21 +152,22 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int GetInternalClientName(int int_ref, char* name_res)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.GetInternalClientName(int_ref, name_res);
CATCH_EXCEPTION_RETURN
}
int InternalClientHandle(const char* client_name, int* status, int* int_ref)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.InternalClientHandle(client_name, status, int_ref);
CATCH_EXCEPTION_RETURN
}
int InternalClientUnload(int refnum, int* status)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
+ // Client is tested in fEngine.InternalClientUnload
return fEngine.InternalClientUnload(refnum, status);
CATCH_EXCEPTION_RETURN
}
@@ -175,53 +176,53 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int PortRegister(int refnum, const char* name, const char *type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortRegister(refnum, name, type, flags, buffer_size, port);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortRegister(refnum, name, type, flags, buffer_size, port) : -1;
CATCH_EXCEPTION_RETURN
}
int PortUnRegister(int refnum, jack_port_id_t port)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortUnRegister(refnum, port);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortUnRegister(refnum, port) : -1;
CATCH_EXCEPTION_RETURN
}
int PortConnect(int refnum, const char* src, const char* dst)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortConnect(refnum, src, dst);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortConnect(refnum, src, dst) : -1;
CATCH_EXCEPTION_RETURN
}
int PortDisconnect(int refnum, const char* src, const char* dst)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortDisconnect(refnum, src, dst);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortDisconnect(refnum, src, dst) : -1;
CATCH_EXCEPTION_RETURN
}
int PortConnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortConnect(refnum, src, dst);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortConnect(refnum, src, dst) : -1;
CATCH_EXCEPTION_RETURN
}
int PortDisconnect(int refnum, jack_port_id_t src, jack_port_id_t dst)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortDisconnect(refnum, src, dst);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortDisconnect(refnum, src, dst) : -1;
CATCH_EXCEPTION_RETURN
}
int PortRename(int refnum, jack_port_id_t port, const char* name)
{
TRY_CALL
- JackLock lock(this);
- return fEngine.PortRename(refnum, port, name);
+ JackLock lock(&fEngine);
+ return (fEngine.CheckClient(refnum)) ? fEngine.PortRename(refnum, port, name) : -1;
CATCH_EXCEPTION_RETURN
}
@@ -241,36 +242,35 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
void NotifyXRun(int refnum)
{
- TRY_CALL
- JackLock lock(this);
+ // RT : no lock
fEngine.NotifyXRun(refnum);
- CATCH_EXCEPTION
}
+
void NotifyGraphReorder()
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
fEngine.NotifyGraphReorder();
CATCH_EXCEPTION
}
void NotifyBufferSize(jack_nframes_t buffer_size)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
fEngine.NotifyBufferSize(buffer_size);
CATCH_EXCEPTION
}
void NotifySampleRate(jack_nframes_t sample_rate)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
fEngine.NotifySampleRate(sample_rate);
CATCH_EXCEPTION
}
void NotifyFreewheel(bool onoff)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
fEngine.NotifyFreewheel(onoff);
CATCH_EXCEPTION
}
@@ -278,7 +278,7 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
void NotifyFailure(int code, const char* reason)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
fEngine.NotifyFailure(code, reason);
CATCH_EXCEPTION
}
@@ -286,7 +286,7 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int GetClientPID(const char* name)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.GetClientPID(name);
CATCH_EXCEPTION_RETURN
}
@@ -294,7 +294,7 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
int GetClientRefNum(const char* name)
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.GetClientRefNum(name);
CATCH_EXCEPTION_RETURN
}
@@ -302,7 +302,7 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble
void NotifyQuit()
{
TRY_CALL
- JackLock lock(this);
+ JackLock lock(&fEngine);
return fEngine.NotifyQuit();
CATCH_EXCEPTION
}
diff --git a/common/JackMutex.h b/common/JackMutex.h
index e2472add..0a2600d7 100644
--- a/common/JackMutex.h
+++ b/common/JackMutex.h
@@ -36,11 +36,9 @@ namespace Jack
class JackLockAble
{
- private:
-
- JackMutex fMutex;
-
protected:
+
+ JackMutex fMutex;
JackLockAble()
{}
diff --git a/common/JackNetOneDriver.cpp b/common/JackNetOneDriver.cpp
index 5ee20a6d..3259b563 100644
--- a/common/JackNetOneDriver.cpp
+++ b/common/JackNetOneDriver.cpp
@@ -17,8 +17,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
-//#define HAVE_CELT 1
-
#ifdef WIN32
#include <malloc.h>
#endif
diff --git a/common/jack/jack.h b/common/jack/jack.h
index a5dc3aec..96800dcd 100644
--- a/common/jack/jack.h
+++ b/common/jack/jack.h
@@ -34,30 +34,20 @@ extern "C"
* Note: More documentation can be found in jack/types.h.
*/
-/*************************************************************
- * NOTE: JACK_WEAK_EXPORT ***MUST*** be used on every function
- * added to the JACK API after the 0.116.2 release.
- *************************************************************/
-
-#ifndef JACK_WEAK_EXPORT
-#ifdef __GNUC__
-/* JACK_WEAK_EXPORT needs to be a macro which
- expands into a compiler directive. If non-null, the directive
- must tell the compiler to arrange for weak linkage of
- the symbol it used with. For this to work full may
- require linker arguments in the client as well.
-*/
-#define JACK_WEAK_EXPORT __attribute__((weak))
-#else
-/* Add other things here for non-gcc platforms */
-#endif
-#endif
-
-/**
-* @defgroup ClientFunctions Creating & manipulating clients
-* @{
-*/
-
+ /*************************************************************
+ * NOTE: JACK_WEAK_EXPORT ***MUST*** be used on every function
+ * added to the JACK API after the 0.116.2 release.
+ *
+ * Functions that predate this release are marked with
+ * JACK_WEAK_OPTIONAL_EXPORT which can be defined at compile
+ * time in a variety of ways. The default definition is empty,
+ * so that these symbols get normal linkage. If you wish to
+ * use all JACK symbols with weak linkage, include
+ * <jack/weakjack.h> before jack.h.
+ *************************************************************/
+
+#include <jack/weakmacros.h>
+
/**
* Call this function to get version of the JACK, in form of several numbers
*
@@ -75,7 +65,7 @@ jack_get_version(
int *major_ptr,
int *minor_ptr,
int *micro_ptr,
- int *proto_ptr);
+ int *proto_ptr) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Call this function to get version of the JACK, in form of a string
@@ -84,7 +74,7 @@ jack_get_version(
*
*/
const char *
-jack_get_version_string();
+jack_get_version_string() JACK_OPTIONAL_WEAK_EXPORT;
/**
* Open an external client session with a JACK server. This interface
@@ -121,7 +111,7 @@ jack_get_version_string();
*/
jack_client_t * jack_client_open (const char *client_name,
jack_options_t options,
- jack_status_t *status, ...);
+ jack_status_t *status, ...) JACK_OPTIONAL_WEAK_EXPORT;
/**
* \bold THIS FUNCTION IS DEPRECATED AND SHOULD NOT BE USED IN
@@ -129,20 +119,20 @@ jack_client_t * jack_client_open (const char *client_name,
*
* @deprecated Please use jack_client_open().
*/
-jack_client_t * jack_client_new (const char *client_name);
+jack_client_t * jack_client_new (const char *client_name) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
* Disconnects an external client from a JACK server.
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_client_close (jack_client_t *client);
+int jack_client_close (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the maximum number of characters in a JACK client name
* including the final NULL character. This value is a constant.
*/
-int jack_client_name_size (void);
+int jack_client_name_size (void) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return pointer to actual client name. This is useful when @ref
@@ -150,7 +140,7 @@ int jack_client_name_size (void);
* JackNameNotUnique status was returned. In that case, the actual
* name will differ from the @a client_name requested.
*/
-char * jack_get_client_name (jack_client_t *client);
+char * jack_get_client_name (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Load an internal client into the Jack server.
@@ -175,14 +165,14 @@ char * jack_get_client_name (jack_client_t *client);
*/
int jack_internal_client_new (const char *client_name,
const char *load_name,
- const char *load_init);
+ const char *load_init) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
* Remove an internal client from a JACK server.
*
* @deprecated Please use jack_internal_client_load().
*/
-void jack_internal_client_close (const char *client_name);
+void jack_internal_client_close (const char *client_name) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
* Tell the Jack server that the program is ready to start processing
@@ -190,7 +180,7 @@ void jack_internal_client_close (const char *client_name);
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_activate (jack_client_t *client);
+int jack_activate (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the Jack server to remove this @a client from the process
@@ -199,18 +189,18 @@ int jack_activate (jack_client_t *client);
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_deactivate (jack_client_t *client);
+int jack_deactivate (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return pid of client. If not available, 0 will be returned.
*/
-int jack_get_client_pid (const char *name);
+int jack_get_client_pid (const char *name) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the pthread ID of the thread running the JACK client side
* code.
*/
-pthread_t jack_client_thread_id (jack_client_t *);
+pthread_t jack_client_thread_id (jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -221,7 +211,7 @@ pthread_t jack_client_thread_id (jack_client_t *);
*
* @return 1 if JACK is running realtime, 0 otherwise
*/
-int jack_is_realtime (jack_client_t *client);
+int jack_is_realtime (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @defgroup NonCallbackAPI The non-callback API
@@ -234,7 +224,7 @@ int jack_is_realtime (jack_client_t *client);
*
* @deprecated Please use jack_cycle_wait() and jack_cycle_signal() functions.
*/
-jack_nframes_t jack_thread_wait (jack_client_t*, int status);
+jack_nframes_t jack_thread_wait (jack_client_t*, int status) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Wait until this JACK client should process data.
@@ -243,7 +233,7 @@ jack_nframes_t jack_thread_wait (jack_client_t*, int status);
*
* @return the number of frames of data to process
*/
-jack_nframes_t jack_cycle_wait (jack_client_t* client);
+ jack_nframes_t jack_cycle_wait (jack_client_t* client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Signal next clients in the graph.
@@ -251,7 +241,7 @@ jack_nframes_t jack_cycle_wait (jack_client_t* client);
* @param client - pointer to a JACK client structure
* @param status - if non-zero, calling thread should exit
*/
-void jack_cycle_signal (jack_client_t* client, int status);
+void jack_cycle_signal (jack_client_t* client, int status) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the Jack server to call @a thread_callback in the RT thread.
@@ -269,7 +259,7 @@ void jack_cycle_signal (jack_client_t* client, int status);
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_set_process_thread(jack_client_t* client, JackThreadCallback thread_callback, void *arg);
+int jack_set_process_thread(jack_client_t* client, JackThreadCallback thread_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -294,7 +284,7 @@ int jack_set_process_thread(jack_client_t* client, JackThreadCallback thread_cal
*/
int jack_set_thread_init_callback (jack_client_t *client,
JackThreadInitCallback thread_init_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @param client pointer to JACK client structure.
@@ -346,7 +336,7 @@ void jack_on_shutdown (jack_client_t *client,
* jack_on_info_shutdown() will.
*/
void jack_on_info_shutdown (jack_client_t *client,
- JackInfoShutdownCallback shutdown_callback, void *arg);
+ JackInfoShutdownCallback shutdown_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the Jack server to call @a process_callback whenever there is
@@ -367,7 +357,7 @@ void jack_on_info_shutdown (jack_client_t *client,
*/
int jack_set_process_callback (jack_client_t *client,
JackProcessCallback process_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the Jack server to call @a freewheel_callback
@@ -387,7 +377,7 @@ int jack_set_process_callback (jack_client_t *client,
*/
int jack_set_freewheel_callback (jack_client_t *client,
JackFreewheelCallback freewheel_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell JACK to call @a bufsize_callback whenever the size of the the
@@ -410,7 +400,7 @@ int jack_set_freewheel_callback (jack_client_t *client,
*/
int jack_set_buffer_size_callback (jack_client_t *client,
JackBufferSizeCallback bufsize_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the Jack server to call @a srate_callback whenever the system
@@ -427,11 +417,11 @@ int jack_set_buffer_size_callback (jack_client_t *client,
*/
int jack_set_sample_rate_callback (jack_client_t *client,
JackSampleRateCallback srate_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
- * Tell the JACK server to call @a registration_callback whenever a
- * port is registered or unregistered, passing @a arg as a parameter.
+ * Tell the JACK server to call @a client_registration_callback whenever a
+ * client is registered or unregistered, passing @a arg as a parameter.
*
* All "notification events" are received in a seperated non RT thread,
* the code in the supplied function does not need to be
@@ -444,7 +434,7 @@ int jack_set_sample_rate_callback (jack_client_t *client,
*/
int jack_set_client_registration_callback (jack_client_t *,
JackClientRegistrationCallback
- registration_callback, void *arg);
+ registration_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the JACK server to call @a registration_callback whenever a
@@ -460,8 +450,8 @@ int jack_set_client_registration_callback (jack_client_t *,
* @return 0 on success, otherwise a non-zero error code
*/
int jack_set_port_registration_callback (jack_client_t *,
- JackPortRegistrationCallback
- registration_callback, void *arg);
+ JackPortRegistrationCallback
+ registration_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the JACK server to call @a connect_callback whenever a
@@ -477,8 +467,8 @@ int jack_set_client_registration_callback (jack_client_t *,
* @return 0 on success, otherwise a non-zero error code
*/
int jack_set_port_connect_callback (jack_client_t *,
- JackPortConnectCallback
- connect_callback, void *arg);
+ JackPortConnectCallback
+ connect_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the JACK server to call @a rename_callback whenever a
@@ -494,8 +484,8 @@ int jack_set_port_connect_callback (jack_client_t *,
* @return 0 on success, otherwise a non-zero error code
*/
int jack_set_port_rename_callback (jack_client_t *,
- JackPortRenameCallback
- rename_callback, void *arg);
+ JackPortRenameCallback
+ rename_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the JACK server to call @a graph_callback whenever the
@@ -512,7 +502,7 @@ int jack_set_port_rename_callback (jack_client_t *,
*/
int jack_set_graph_order_callback (jack_client_t *,
JackGraphOrderCallback graph_callback,
- void *);
+ void *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Tell the JACK server to call @a xrun_callback whenever there is a
@@ -528,7 +518,7 @@ int jack_set_graph_order_callback (jack_client_t *,
* @return 0 on success, otherwise a non-zero error code
*/
int jack_set_xrun_callback (jack_client_t *,
- JackXRunCallback xrun_callback, void *arg);
+ JackXRunCallback xrun_callback, void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -561,7 +551,7 @@ int jack_set_xrun_callback (jack_client_t *,
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_set_freewheel(jack_client_t* client, int onoff);
+int jack_set_freewheel(jack_client_t* client, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Change the buffer size passed to the @a process_callback.
@@ -578,13 +568,13 @@ int jack_set_freewheel(jack_client_t* client, int onoff);
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes);
+int jack_set_buffer_size (jack_client_t *client, jack_nframes_t nframes) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the sample rate of the jack system, as set by the user when
* jackd was started.
*/
-jack_nframes_t jack_get_sample_rate (jack_client_t *);
+jack_nframes_t jack_get_sample_rate (jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the current maximum size that will ever be passed to the @a
@@ -595,7 +585,7 @@ jack_nframes_t jack_get_sample_rate (jack_client_t *);
*
* @see jack_set_buffer_size_callback()
*/
-jack_nframes_t jack_get_buffer_size (jack_client_t *);
+jack_nframes_t jack_get_buffer_size (jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Old-style interface to become the timebase for the entire JACK
@@ -607,7 +597,7 @@ jack_nframes_t jack_get_buffer_size (jack_client_t *);
*
* @return ENOSYS, function not implemented.
*/
-int jack_engine_takeover_timebase (jack_client_t *);
+int jack_engine_takeover_timebase (jack_client_t *) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
* @return the current CPU load estimated by JACK. This is a running
@@ -615,7 +605,7 @@ int jack_engine_takeover_timebase (jack_client_t *);
* all clients as a percentage of the real time available per cycle
* determined by the buffer size and sample rate.
*/
-float jack_cpu_load (jack_client_t *client);
+float jack_cpu_load (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -654,7 +644,7 @@ jack_port_t * jack_port_register (jack_client_t *client,
const char *port_name,
const char *port_type,
unsigned long flags,
- unsigned long buffer_size);
+ unsigned long buffer_size) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Remove the port from the client, disconnecting any existing
@@ -662,7 +652,7 @@ jack_port_t * jack_port_register (jack_client_t *client,
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_port_unregister (jack_client_t *, jack_port_t *);
+int jack_port_unregister (jack_client_t *, jack_port_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* This returns a pointer to the memory area associated with the
@@ -683,7 +673,7 @@ int jack_port_unregister (jack_client_t *, jack_port_t *);
* Caching output ports is DEPRECATED in Jack 2.0, due to some new optimization (like "pipelining").
* Port buffers have to be retrieved in each callback for proper functionning.
*/
-void * jack_port_get_buffer (jack_port_t *, jack_nframes_t);
+void * jack_port_get_buffer (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the full name of the jack_port_t (including the @a
@@ -691,7 +681,7 @@ void * jack_port_get_buffer (jack_port_t *, jack_nframes_t);
*
* @see jack_port_name_size().
*/
-const char * jack_port_name (const jack_port_t *port);
+const char * jack_port_name (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the short name of the jack_port_t (not including the @a
@@ -699,35 +689,35 @@ const char * jack_port_name (const jack_port_t *port);
*
* @see jack_port_name_size().
*/
-const char * jack_port_short_name (const jack_port_t *port);
+const char * jack_port_short_name (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the @ref JackPortFlags of the jack_port_t.
*/
-int jack_port_flags (const jack_port_t *port);
+int jack_port_flags (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the @a port type, at most jack_port_type_size() characters
* including a final NULL.
*/
-const char * jack_port_type (const jack_port_t *port);
+const char * jack_port_type (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the @a port type id.
*/
-jack_port_type_id_t jack_port_type_id (const jack_port_t *port);
+jack_port_type_id_t jack_port_type_id (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return TRUE if the jack_port_t belongs to the jack_client_t.
*/
-int jack_port_is_mine (const jack_client_t *, const jack_port_t *port);
+int jack_port_is_mine (const jack_client_t *, const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return number of connections to or from @a port.
*
* @pre The calling client must own @a port.
*/
-int jack_port_connected (const jack_port_t *port);
+int jack_port_connected (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return TRUE if the locally-owned @a port is @b directly connected
@@ -736,7 +726,7 @@ int jack_port_connected (const jack_port_t *port);
* @see jack_port_name_size()
*/
int jack_port_connected_to (const jack_port_t *port,
- const char *port_name);
+ const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return a null-terminated array of full port names to which the @a
@@ -749,7 +739,7 @@ int jack_port_connected_to (const jack_port_t *port,
*
* @see jack_port_name_size(), jack_port_get_all_connections()
*/
-const char ** jack_port_get_connections (const jack_port_t *port);
+const char ** jack_port_get_connections (const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return a null-terminated array of full port names to which the @a
@@ -771,7 +761,7 @@ const char ** jack_port_get_connections (const jack_port_t *port);
* @see jack_port_name_size()
*/
const char ** jack_port_get_all_connections (const jack_client_t *client,
- const jack_port_t *port);
+ const jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
*
@@ -780,7 +770,7 @@ const char ** jack_port_get_all_connections (const jack_client_t *client,
* turned out to serve essentially no purpose in real-life
* JACK clients.
*/
-int jack_port_tie (jack_port_t *src, jack_port_t *dst);
+int jack_port_tie (jack_port_t *src, jack_port_t *dst) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
*
@@ -789,7 +779,7 @@ int jack_port_tie (jack_port_t *src, jack_port_t *dst);
* turned out to serve essentially no purpose in real-life
* JACK clients.
*/
-int jack_port_untie (jack_port_t *port);
+int jack_port_untie (jack_port_t *port) JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT;
/**
* @return the time (in frames) between data being available or
@@ -801,7 +791,7 @@ int jack_port_untie (jack_port_t *port);
* connector and the corresponding frames being readable from the
* port.
*/
-jack_nframes_t jack_port_get_latency (jack_port_t *port);
+jack_nframes_t jack_port_get_latency (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* The maximum of the sum of the latencies in every
@@ -809,7 +799,7 @@ jack_nframes_t jack_port_get_latency (jack_port_t *port);
* ports with the @ref JackPortIsTerminal flag set.
*/
jack_nframes_t jack_port_get_total_latency (jack_client_t *,
- jack_port_t *port);
+ jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* The port latency is zero by default. Clients that control
@@ -821,7 +811,7 @@ jack_nframes_t jack_port_get_total_latency (jack_client_t *,
* to an external digital converter, the latency setting should
* include both buffering by the audio interface *and* the converter.
*/
-void jack_port_set_latency (jack_port_t *, jack_nframes_t);
+void jack_port_set_latency (jack_port_t *, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Request a complete recomputation of a port's total latency. This
@@ -834,7 +824,7 @@ void jack_port_set_latency (jack_port_t *, jack_nframes_t);
* @return zero for successful execution of the request. non-zero
* otherwise.
*/
-int jack_recompute_total_latency (jack_client_t*, jack_port_t* port);
+int jack_recompute_total_latency (jack_client_t*, jack_port_t* port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Request a complete recomputation of all port latencies. This
@@ -849,7 +839,7 @@ int jack_recompute_total_latency (jack_client_t*, jack_port_t* port);
* @return zero for successful execution of the request. non-zero
* otherwise.
*/
-int jack_recompute_total_latencies (jack_client_t*);
+ int jack_recompute_total_latencies (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Modify a port's short name. May be called at any time. If the
@@ -858,7 +848,7 @@ int jack_recompute_total_latencies (jack_client_t*);
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_port_set_name (jack_port_t *port, const char *port_name);
+int jack_port_set_name (jack_port_t *port, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Set @a alias as an alias for @a port. May be called at any time.
@@ -873,7 +863,7 @@ int jack_port_set_name (jack_port_t *port, const char *port_name);
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_port_set_alias (jack_port_t *port, const char *alias);
+int jack_port_set_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Remove @a alias as an alias for @a port. May be called at any time.
@@ -883,20 +873,20 @@ int jack_port_set_alias (jack_port_t *port, const char *alias);
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_port_unset_alias (jack_port_t *port, const char *alias);
+int jack_port_unset_alias (jack_port_t *port, const char *alias) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Get any aliases known for @port.
*
* @return the number of aliases discovered for the port
*/
-int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]);
+int jack_port_get_aliases (const jack_port_t *port, char* const aliases[2]) JACK_OPTIONAL_WEAK_EXPORT;
/**
* If @ref JackPortCanMonitor is set for this @a port, turn input
* monitoring on or off. Otherwise, do nothing.
*/
-int jack_port_request_monitor (jack_port_t *port, int onoff);
+int jack_port_request_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
/**
* If @ref JackPortCanMonitor is set for this @a port_name, turn input
@@ -907,7 +897,7 @@ int jack_port_request_monitor (jack_port_t *port, int onoff);
* @see jack_port_name_size()
*/
int jack_port_request_monitor_by_name (jack_client_t *client,
- const char *port_name, int onoff);
+ const char *port_name, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
/**
* If @ref JackPortCanMonitor is set for a port, this function turns
@@ -916,12 +906,12 @@ int jack_port_request_monitor_by_name (jack_client_t *client,
*
* @return 0 on success, otherwise a non-zero error code
*/
-int jack_port_ensure_monitor (jack_port_t *port, int onoff);
+int jack_port_ensure_monitor (jack_port_t *port, int onoff) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return TRUE if input monitoring has been requested for @a port.
*/
-int jack_port_monitoring_input (jack_port_t *port);
+int jack_port_monitoring_input (jack_port_t *port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Establish a connection between two ports.
@@ -942,7 +932,7 @@ int jack_port_monitoring_input (jack_port_t *port);
*/
int jack_connect (jack_client_t *,
const char *source_port,
- const char *destination_port);
+ const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Remove a connection between two ports.
@@ -959,7 +949,7 @@ int jack_connect (jack_client_t *,
*/
int jack_disconnect (jack_client_t *,
const char *source_port,
- const char *destination_port);
+ const char *destination_port) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Perform the same function as jack_disconnect() using port handles
@@ -970,7 +960,7 @@ int jack_disconnect (jack_client_t *,
* while generic connection clients (e.g. patchbays) would use
* jack_disconnect().
*/
-int jack_port_disconnect (jack_client_t *, jack_port_t *);
+int jack_port_disconnect (jack_client_t *, jack_port_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the maximum number of characters in a full JACK port name
@@ -980,13 +970,13 @@ int jack_port_disconnect (jack_client_t *, jack_port_t *);
* with a colon (:) followed by its short name and a NULL
* character.
*/
-int jack_port_name_size(void);
+int jack_port_name_size(void) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the maximum number of characters in a JACK port type name
* including the final NULL character. This value is a constant.
*/
-int jack_port_type_size(void);
+int jack_port_type_size(void) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -1014,20 +1004,20 @@ int jack_port_type_size(void);
const char ** jack_get_ports (jack_client_t *,
const char *port_name_pattern,
const char *type_name_pattern,
- unsigned long flags);
+ unsigned long flags) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return address of the jack_port_t named @a port_name.
*
* @see jack_port_name_size()
*/
-jack_port_t * jack_port_by_name (jack_client_t *, const char *port_name);
+jack_port_t * jack_port_by_name (jack_client_t *, const char *port_name) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return address of the jack_port_t of a @a port_id.
*/
jack_port_t * jack_port_by_id (jack_client_t *client,
- jack_port_id_t port_id);
+ jack_port_id_t port_id) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -1044,7 +1034,7 @@ jack_port_t * jack_port_by_id (jack_client_t *client,
* @return the estimated time in frames that has passed since the JACK
* server began the current process cycle.
*/
-jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *);
+jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the estimated current time in frames.
@@ -1052,7 +1042,7 @@ jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *);
* callback). The return value can be compared with the value of
* jack_last_frame_time to relate time in other threads to JACK time.
*/
-jack_nframes_t jack_frame_time (const jack_client_t *);
+jack_nframes_t jack_frame_time (const jack_client_t *) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the precise time at the start of the current process cycle.
@@ -1068,17 +1058,17 @@ jack_nframes_t jack_frame_time (const jack_client_t *);
* If an xrun occurs, clients must check this value again, as time
* may have advanced in a non-linear way (e.g. cycles may have been skipped).
*/
-jack_nframes_t jack_last_frame_time (const jack_client_t *client);
+jack_nframes_t jack_last_frame_time (const jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the estimated time in microseconds of the specified frame time
*/
-jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t);
+jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return the estimated time in frames for the specified system time.
*/
-jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t);
+jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @return return JACK's current system time in microseconds,
@@ -1086,7 +1076,7 @@ jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t);
*
* The value returned is guaranteed to be monotonic, but not linear.
*/
-jack_time_t jack_get_time();
+jack_time_t jack_get_time() JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -1103,7 +1093,7 @@ jack_time_t jack_get_time();
*
* @param msg error message text (no newline at end).
*/
-extern void (*jack_error_callback)(const char *msg);
+extern void (*jack_error_callback)(const char *msg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Set the @ref jack_error_callback for error message display.
@@ -1112,7 +1102,7 @@ extern void (*jack_error_callback)(const char *msg);
* The JACK library provides two built-in callbacks for this purpose:
* default_jack_error_callback() and silent_jack_error_callback().
*/
-void jack_set_error_function (void (*func)(const char *));
+void jack_set_error_function (void (*func)(const char *)) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Display JACK info message.
@@ -1122,7 +1112,7 @@ void jack_set_error_function (void (*func)(const char *));
*
* @param msg info message text (no newline at end).
*/
-extern void (*jack_info_callback)(const char *msg);
+extern void (*jack_info_callback)(const char *msg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Set the @ref jack_info_callback for info message display.
@@ -1131,7 +1121,7 @@ extern void (*jack_info_callback)(const char *msg);
* The JACK library provides two built-in callbacks for this purpose:
* default_jack_info_callback() and silent_jack_info_callback().
*/
-void jack_set_info_function (void (*func)(const char *));
+void jack_set_info_function (void (*func)(const char *)) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
@@ -1142,7 +1132,7 @@ void jack_set_info_function (void (*func)(const char *));
* Developers are strongly encouraged to use this function instead of the standard "free" function in new code.
*
*/
-void jack_free(void* ptr);
+void jack_free(void* ptr) JACK_OPTIONAL_WEAK_EXPORT;
#ifdef __cplusplus
diff --git a/common/jack/midiport.h b/common/jack/midiport.h
index da0b940d..fd620b8d 100644
--- a/common/jack/midiport.h
+++ b/common/jack/midiport.h
@@ -27,7 +27,7 @@ extern "C" {
#include <jack/types.h>
#include <stdlib.h>
-
+#include <jack/weakmacros.h>
/** Type for raw event data contained in @ref jack_midi_event_t. */
typedef unsigned char jack_midi_data_t;
@@ -53,7 +53,7 @@ typedef struct _jack_midi_event
* @return number of events inside @a port_buffer
*/
jack_nframes_t
-jack_midi_get_event_count(void* port_buffer);
+jack_midi_get_event_count(void* port_buffer) JACK_OPTIONAL_WEAK_EXPORT;
/** Get a MIDI event from an event port buffer.
@@ -70,7 +70,7 @@ jack_midi_get_event_count(void* port_buffer);
int
jack_midi_event_get(jack_midi_event_t *event,
void *port_buffer,
- jack_nframes_t event_index);
+ jack_nframes_t event_index) JACK_OPTIONAL_WEAK_EXPORT;
/** Clear an event buffer.
@@ -82,7 +82,7 @@ jack_midi_event_get(jack_midi_event_t *event,
* @param port_buffer Port buffer to clear (must be an output port buffer).
*/
void
-jack_midi_clear_buffer(void *port_buffer);
+jack_midi_clear_buffer(void *port_buffer) JACK_OPTIONAL_WEAK_EXPORT;
/** Get the size of the largest event that can be stored by the port.
@@ -93,7 +93,7 @@ jack_midi_clear_buffer(void *port_buffer);
* @param port_buffer Port buffer to check size of.
*/
size_t
-jack_midi_max_event_size(void* port_buffer);
+jack_midi_max_event_size(void* port_buffer) JACK_OPTIONAL_WEAK_EXPORT;
/** Allocate space for an event to be written to an event port buffer.
@@ -112,9 +112,9 @@ jack_midi_max_event_size(void* port_buffer);
* NULL on error (ie not enough space).
*/
jack_midi_data_t*
-jack_midi_event_reserve(void *port_buffer,
+jack_midi_event_reserve(void *port_buffer,
jack_nframes_t time,
- size_t data_size);
+ size_t data_size) JACK_OPTIONAL_WEAK_EXPORT;
/** Write an event into an event port buffer.
@@ -130,10 +130,10 @@ jack_midi_event_reserve(void *port_buffer,
* @return 0 on success, ENOBUFS if there's not enough space in buffer for event.
*/
int
-jack_midi_event_write(void *port_buffer,
- jack_nframes_t time,
+jack_midi_event_write(void *port_buffer,
+ jack_nframes_t time,
const jack_midi_data_t *data,
- size_t data_size);
+ size_t data_size) JACK_OPTIONAL_WEAK_EXPORT;
/** Get the number of events that could not be written to @a port_buffer.
@@ -145,7 +145,7 @@ jack_midi_event_write(void *port_buffer,
* @returns Number of events that could not be written to @a port_buffer.
*/
jack_nframes_t
-jack_midi_get_lost_event_count(void *port_buffer);
+jack_midi_get_lost_event_count(void *port_buffer) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
diff --git a/common/jack/thread.h b/common/jack/thread.h
index 48adf084..5d002afa 100644
--- a/common/jack/thread.h
+++ b/common/jack/thread.h
@@ -26,6 +26,7 @@ extern "C"
#endif
#include <jack/systemdeps.h>
+#include <jack/weakmacros.h>
/** @file thread.h
*
@@ -45,7 +46,7 @@ extern "C"
* Otherwise returns -1.
*/
-int jack_client_real_time_priority (jack_client_t*);
+int jack_client_real_time_priority (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT;
/**
* @returns if JACK is running with realtime scheduling, this returns
@@ -53,7 +54,7 @@ int jack_client_real_time_priority (jack_client_t*);
* is subject to realtime scheduling. Otherwise returns -1.
*/
-int jack_client_max_real_time_priority (jack_client_t*);
+int jack_client_max_real_time_priority (jack_client_t*) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Attempt to enable realtime scheduling for a thread. On some
@@ -65,7 +66,7 @@ int jack_client_max_real_time_priority (jack_client_t*);
* @returns 0, if successful; EPERM, if the calling process lacks
* required realtime privileges; otherwise some other error number.
*/
-int jack_acquire_real_time_scheduling (pthread_t thread, int priority);
+int jack_acquire_real_time_scheduling (pthread_t thread, int priority) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Create a thread for JACK or one of its clients. The thread is
@@ -88,7 +89,7 @@ int jack_client_create_thread (jack_client_t* client,
int priority,
int realtime, /* boolean */
void *(*start_routine)(void*),
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Drop realtime scheduling for a thread.
@@ -97,7 +98,7 @@ int jack_client_create_thread (jack_client_t* client,
*
* @returns 0, if successful; otherwise an error number.
*/
-int jack_drop_real_time_scheduling (pthread_t thread);
+int jack_drop_real_time_scheduling (pthread_t thread) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Stop the thread, waiting for the thread handler to terminate.
@@ -106,7 +107,7 @@ int jack_drop_real_time_scheduling (pthread_t thread);
*
* @returns 0, if successful; otherwise an error number.
*/
-int jack_client_stop_thread(jack_client_t* client, pthread_t thread);
+int jack_client_stop_thread(jack_client_t* client, pthread_t thread) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Cancel the thread then waits for the thread handler to terminate.
@@ -115,7 +116,7 @@ int jack_client_stop_thread(jack_client_t* client, pthread_t thread);
*
* @returns 0, if successful; otherwise an error number.
*/
- int jack_client_kill_thread(jack_client_t* client, pthread_t thread);
+ int jack_client_kill_thread(jack_client_t* client, pthread_t thread) JACK_OPTIONAL_WEAK_EXPORT;
#ifndef WIN32
@@ -142,7 +143,7 @@ int jack_client_stop_thread(jack_client_t* client, pthread_t thread);
* @param creator a function that creates a new thread
*
*/
-void jack_set_thread_creator (jack_thread_creator_t creator);
+void jack_set_thread_creator (jack_thread_creator_t creator) JACK_OPTIONAL_WEAK_EXPORT;
#endif
diff --git a/common/jack/transport.h b/common/jack/transport.h
index 67bcaa2a..e8ba8cbb 100644
--- a/common/jack/transport.h
+++ b/common/jack/transport.h
@@ -26,6 +26,7 @@ extern "C" {
#endif
#include <jack/types.h>
+#include <jack/weakmacros.h>
/**
* @defgroup TransportControl Transport and Timebase control
@@ -48,7 +49,7 @@ extern "C" {
*
* @return 0 on success, otherwise a non-zero error code.
*/
-int jack_release_timebase (jack_client_t *client);
+int jack_release_timebase (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Register (or unregister) as a slow-sync client, one that cannot
@@ -72,7 +73,7 @@ int jack_release_timebase (jack_client_t *client);
*/
int jack_set_sync_callback (jack_client_t *client,
JackSyncCallback sync_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Set the timeout value for slow-sync clients.
@@ -92,7 +93,7 @@ int jack_set_sync_callback (jack_client_t *client,
* @return 0 on success, otherwise a non-zero error code.
*/
int jack_set_sync_timeout (jack_client_t *client,
- jack_time_t timeout);
+ jack_time_t timeout) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Register as timebase master for the JACK subsystem.
@@ -122,7 +123,7 @@ int jack_set_sync_timeout (jack_client_t *client,
int jack_set_timebase_callback (jack_client_t *client,
int conditional,
JackTimebaseCallback timebase_callback,
- void *arg);
+ void *arg) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Reposition the transport to a new frame number.
@@ -141,7 +142,7 @@ int jack_set_timebase_callback (jack_client_t *client,
* @return 0 if valid request, non-zero otherwise.
*/
int jack_transport_locate (jack_client_t *client,
- jack_nframes_t frame);
+ jack_nframes_t frame) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Query the current transport state and position.
@@ -159,7 +160,7 @@ int jack_transport_locate (jack_client_t *client,
* @return Current transport state.
*/
jack_transport_state_t jack_transport_query (const jack_client_t *client,
- jack_position_t *pos);
+ jack_position_t *pos) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Return an estimate of the current transport frame,
@@ -168,7 +169,7 @@ jack_transport_state_t jack_transport_query (const jack_client_t *client,
*
* @param client the JACK client structure
*/
-jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client);
+jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Request a new transport position.
@@ -187,7 +188,7 @@ jack_nframes_t jack_get_current_transport_frame (const jack_client_t *client);
* @return 0 if valid request, EINVAL if position structure rejected.
*/
int jack_transport_reposition (jack_client_t *client,
- jack_position_t *pos);
+ jack_position_t *pos) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Start the JACK transport rolling.
@@ -200,7 +201,7 @@ int jack_transport_reposition (jack_client_t *client,
*
* @param client the JACK client structure.
*/
-void jack_transport_start (jack_client_t *client);
+void jack_transport_start (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Stop the JACK transport.
@@ -210,7 +211,7 @@ void jack_transport_start (jack_client_t *client);
*
* @param client the JACK client structure.
*/
-void jack_transport_stop (jack_client_t *client);
+void jack_transport_stop (jack_client_t *client) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Gets the current transport info structure (deprecated).
@@ -225,7 +226,7 @@ void jack_transport_stop (jack_client_t *client);
* @pre Must be called from the process thread.
*/
void jack_get_transport_info (jack_client_t *client,
- jack_transport_info_t *tinfo);
+ jack_transport_info_t *tinfo) JACK_OPTIONAL_WEAK_EXPORT;
/**
* Set the transport info structure (deprecated).
@@ -235,7 +236,7 @@ void jack_get_transport_info (jack_client_t *client,
* a ::JackTimebaseCallback.
*/
void jack_set_transport_info (jack_client_t *client,
- jack_transport_info_t *tinfo);
+ jack_transport_info_t *tinfo) JACK_OPTIONAL_WEAK_EXPORT;
/*@}*/
diff --git a/common/jack/weakjack.h b/common/jack/weakjack.h
new file mode 100644
index 00000000..11d2acaa
--- /dev/null
+++ b/common/jack/weakjack.h
@@ -0,0 +1,52 @@
+/*
+ Copyright (C) 2010 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __weakjack_h__
+#define __weakjack_h__
+
+#ifndef JACK_OPTIONAL_WEAK_EXPORT
+/* JACK_OPTIONAL_WEAK_EXPORT needs to be a macro which
+ expands into a compiler directive. If non-null, the directive
+ must tell the compiler to arrange for weak linkage of
+ the symbol it used with. For this to work fully may
+ require linker arguments for the client as well.
+*/
+#ifdef __GNUC__
+#define JACK_OPTIONAL_WEAK_EXPORT __attribute__((__weak__))
+#else
+/* Add other things here for non-gcc platforms */
+#endif
+#endif
+
+#ifndef JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT
+/* JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT needs to be a macro
+ which expands into a compiler directive. If non-null, the directive
+ must tell the compiler to arrange for weak linkage of the
+ symbol it is used with AND optionally to mark the symbol
+ as deprecated. For this to work fully may require
+ linker arguments for the client as well.
+*/
+#ifdef __GNUC__
+#define JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT __attribute__((__weak__,__deprecated__))
+#else
+/* Add other things here for non-gcc platforms */
+#endif
+#endif
+
+#endif /* weakjack */
diff --git a/common/jack/weakmacros.h b/common/jack/weakmacros.h
new file mode 100644
index 00000000..3db19d3f
--- /dev/null
+++ b/common/jack/weakmacros.h
@@ -0,0 +1,61 @@
+/*
+ Copyright (C) 2010 Paul Davis
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2.1 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+
+*/
+
+#ifndef __weakmacros_h__
+#define __weakmacros_h__
+
+/*************************************************************
+ * NOTE: JACK_WEAK_EXPORT ***MUST*** be used on every function
+ * added to the JACK API after the 0.116.2 release.
+ *
+ * Functions that predate this release are marked with
+ * JACK_WEAK_OPTIONAL_EXPORT which can be defined at compile
+ * time in a variety of ways. The default definition is empty,
+ * so that these symbols get normal linkage. If you wish to
+ * use all JACK symbols with weak linkage, include
+ * <jack/weakjack.h> before jack.h.
+ *************************************************************/
+
+#ifndef JACK_WEAK_EXPORT
+#ifdef __GNUC__
+/* JACK_WEAK_EXPORT needs to be a macro which
+ expands into a compiler directive. If non-null, the directive
+ must tell the compiler to arrange for weak linkage of
+ the symbol it used with. For this to work full may
+ require linker arguments in the client as well.
+*/
+#define JACK_WEAK_EXPORT __attribute__((weak))
+#else
+/* Add other things here for non-gcc platforms */
+#endif
+#endif
+
+#ifndef JACK_OPTIONAL_WEAK_EXPORT
+#define JACK_OPTIONAL_WEAK_EXPORT
+#endif
+
+#ifndef JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT
+#ifdef __GNUC__
+#define JACK_OPTIONAL_WEAK_DEPRECATED_EXPORT __attribute__((__deprecated__))
+#else
+/* Add other things here for non-gcc platforms */
+#endif /* __GNUC__ */
+#endif
+
+#endif /* __weakmacros_h__ */
diff --git a/common/netjack.c b/common/netjack.c
index eb5f36b7..a073c2cf 100644
--- a/common/netjack.c
+++ b/common/netjack.c
@@ -42,6 +42,7 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
#ifdef WIN32
#include <winsock.h>
#include <malloc.h>
+#define socklen_t int
#else
#include <sys/socket.h>
#include <netinet/in.h>
@@ -49,7 +50,9 @@ $Id: net_driver.c,v 1.17 2006/04/16 20:16:10 torbenh Exp $
#include "netjack.h"
-//#include "config.h"
+#ifdef __linux__
+#include "config.h"
+#endif
#if HAVE_SAMPLERATE
#include <samplerate.h>
@@ -92,7 +95,7 @@ int netjack_wait( netjack_driver_state_t *netj )
jacknet_packet_header *pkthdr;
if( !netj->next_deadline_valid ) {
- netj->next_deadline = jack_get_time() + netj->deadline_offset;
+ netj->next_deadline = jack_get_time() + netj->period_usecs;
netj->next_deadline_valid = 1;
}
@@ -165,7 +168,7 @@ int netjack_wait( netjack_driver_state_t *netj )
netj->packet_data_valid = 1;
int want_deadline;
- if( netj->jitter_val != 0 )
+ if( netj->jitter_val != 0 )
want_deadline = netj->jitter_val;
else if( netj->latency < 4 )
want_deadline = -netj->period_usecs/2;
@@ -174,23 +177,23 @@ int netjack_wait( netjack_driver_state_t *netj )
if( netj->deadline_goodness != MASTER_FREEWHEELS ) {
if( netj->deadline_goodness < want_deadline ) {
- netj->deadline_offset -= netj->period_usecs/100;
+ netj->next_deadline -= netj->period_usecs/100;
//jack_log( "goodness: %d, Adjust deadline: --- %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
}
if( netj->deadline_goodness > want_deadline ) {
- netj->deadline_offset += netj->period_usecs/100;
+ netj->next_deadline += netj->period_usecs/100;
//jack_log( "goodness: %d, Adjust deadline: +++ %d\n", netj->deadline_goodness, (int) netj->period_usecs*netj->latency/100 );
}
}
- if( netj->deadline_offset < (netj->period_usecs*70/100) ) {
- jack_error( "master is forcing deadline_offset to below 70%% of period_usecs... increase latency setting on master" );
- netj->deadline_offset = (netj->period_usecs*90/100);
- }
+// if( netj->next_deadline < (netj->period_usecs*70/100) ) {
+// jack_error( "master is forcing deadline_offset to below 70%% of period_usecs... increase latency setting on master" );
+// netj->deadline_offset = (netj->period_usecs*90/100);
+// }
- netj->next_deadline = jack_get_time() + netj->deadline_offset;
+ netj->next_deadline += netj->period_usecs;
} else {
netj->time_to_deadline = 0;
- netj->next_deadline = jack_get_time() + netj->deadline_offset;
+ netj->next_deadline += netj->period_usecs;
// bah... the packet is not there.
// either
// - it got lost.
@@ -581,7 +584,13 @@ netjack_startup( netjack_driver_state_t *netj )
struct sockaddr_in address;
// Now open the socket, and wait for the first packet to arrive...
netj->sockfd = socket (AF_INET, SOCK_DGRAM, 0);
+
#ifdef WIN32
+ u_long parm = 1;
+ DWORD bufsize = 262144;
+ //ioctlsocket( netj->sockfd, FIONBIO, &parm );
+ setsockopt( netj->sockfd, SOL_SOCKET, SO_RCVBUF, (char *)&bufsize, sizeof(bufsize) );
+ setsockopt( netj->sockfd, SOL_SOCKET, SO_SNDBUF, (char *)&bufsize, sizeof(bufsize) );
if (netj->sockfd == INVALID_SOCKET)
#else
if (netj->sockfd == -1)
@@ -705,7 +714,7 @@ netjack_startup( netjack_driver_state_t *netj )
netj->period_usecs =
(jack_time_t) floor ((((float) netj->period_size) / (float)netj->sample_rate)
* 1000000.0f);
-
+
if( netj->latency == 0 )
netj->deadline_offset = 50*netj->period_usecs;
else
@@ -716,7 +725,7 @@ netjack_startup( netjack_driver_state_t *netj )
// TODO: this is a hack. But i dont want to change the packet header.
netj->resample_factor = (netj->resample_factor * netj->period_size * 1024 / netj->sample_rate / 8)&(~1);
netj->resample_factor_up = (netj->resample_factor_up * netj->period_size * 1024 / netj->sample_rate / 8)&(~1);
-
+
netj->net_period_down = netj->resample_factor;
netj->net_period_up = netj->resample_factor_up;
} else {
diff --git a/common/netjack_packet.c b/common/netjack_packet.c
index 17a9b92e..dfe3b9e2 100644
--- a/common/netjack_packet.c
+++ b/common/netjack_packet.c
@@ -26,7 +26,9 @@
*
*/
-//#include "config.h"
+#ifdef __linux__
+#include "config.h"
+#endif
#ifdef __APPLE__
#define _DARWIN_C_SOURCE
@@ -52,6 +54,7 @@
#include <winsock2.h>
#define socklen_t int
#include <malloc.h>
+#define socklen_t int
#else
#include <sys/socket.h>
#include <netinet/in.h>
@@ -127,7 +130,7 @@ int get_sample_size (int bitdepth)
if (bitdepth == 16)
return sizeof (int16_t);
//JN: why? is this for buffer sizes before or after encoding?
- //JN: if the former, why not int16_t, if the latter, shouldn't it depend on -c N?
+ //JN: if the former, why not int16_t, if the latter, shouldn't it depend on -c N?
if( bitdepth == CELT_MODE )
return sizeof( unsigned char );
return sizeof (int32_t);
diff --git a/common/ringbuffer.c b/common/ringbuffer.c
index b60000c7..45ee27b3 100644
--- a/common/ringbuffer.c
+++ b/common/ringbuffer.c
@@ -70,7 +70,7 @@ jack_ringbuffer_create (size_t sz)
int power_of_two;
jack_ringbuffer_t *rb;
- if ((rb = malloc (sizeof (jack_ringbuffer_t))) == NULL) {
+ if ((rb = (jack_ringbuffer_t *) malloc (sizeof (jack_ringbuffer_t))) == NULL) {
return NULL;
}
@@ -81,7 +81,7 @@ jack_ringbuffer_create (size_t sz)
rb->size_mask -= 1;
rb->write_ptr = 0;
rb->read_ptr = 0;
- if ((rb->buf = malloc (rb->size)) == NULL) {
+ if ((rb->buf = (char *) malloc (rb->size)) == NULL) {
free (rb);
return NULL;
}
diff --git a/common/shm.c b/common/shm.c
index fdd3b151..e74a2134 100644
--- a/common/shm.c
+++ b/common/shm.c
@@ -18,23 +18,23 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
-
-/* This module provides a set of abstract shared memory interfaces
- * with support using both System V and POSIX shared memory
- * implementations. The code is divided into three sections:
- *
- * - common (interface-independent) code
- * - POSIX implementation
- * - System V implementation
- *
- * The implementation used is determined by whether USE_POSIX_SHM was
- * set in the ./configure step.
- */
+
+/* This module provides a set of abstract shared memory interfaces
+ * with support using both System V and POSIX shared memory
+ * implementations. The code is divided into three sections:
+ *
+ * - common (interface-independent) code
+ * - POSIX implementation
+ * - System V implementation
+ *
+ * The implementation used is determined by whether USE_POSIX_SHM was
+ * set in the ./configure step.
+ */
#include "JackConstants.h"
#ifdef WIN32
-#include <process.h>
+#include <process.h>
#include <stdio.h>
#else
@@ -145,23 +145,22 @@ static int semid = -1;
#ifdef WIN32
-static void
-semaphore_init () {}
+static int
+semaphore_init () {return 0;}
-static void
-semaphore_add (int value) {}
+static int
+semaphore_add (int value) {return 0;}
#else
/* all semaphore errors are fatal -- issue message, but do not return */
static void
semaphore_error (char *msg)
{
- jack_error ("Fatal JACK semaphore error: %s (%s)",
+ jack_error ("JACK semaphore error: %s (%s)",
msg, strerror (errno));
- abort ();
}
-static void
+static int
semaphore_init ()
{
key_t semkey = JACK_SEMAPHORE_KEY;
@@ -180,21 +179,26 @@ semaphore_init ()
sbuf.sem_op = 1;
sbuf.sem_flg = 0;
if (semop(semid, &sbuf, 1) == -1) {
- semaphore_error ("semop");
+ semaphore_error ("semop");
+ return -1;
}
} else if (errno == EEXIST) {
if ((semid = semget(semkey, 0, 0)) == -1) {
- semaphore_error ("semget");
+ semaphore_error ("semget");
+ return -1;
}
} else {
- semaphore_error ("semget creation");
+ semaphore_error ("semget creation");
+ return -1;
}
}
+
+ return 0;
}
-static inline void
+static inline int
semaphore_add (int value)
{
struct sembuf sbuf;
@@ -202,20 +206,26 @@ semaphore_add (int value)
sbuf.sem_num = 0;
sbuf.sem_op = value;
sbuf.sem_flg = SEM_UNDO;
+
if (semop(semid, &sbuf, 1) == -1) {
semaphore_error ("semop");
+ return -1;
}
+
+ return 0;
}
#endif
-static void
+static int
jack_shm_lock_registry (void)
{
- if (semid == -1)
- semaphore_init ();
+ if (semid == -1) {
+ if (semaphore_init () < 0)
+ return -1;
+ }
- semaphore_add (-1);
+ return semaphore_add (-1);
}
static void
@@ -297,7 +307,10 @@ jack_server_initialize_shm (int new_registry)
if (jack_shm_header)
return 0; /* already initialized */
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
rc = jack_access_registry (&registry_info);
@@ -353,7 +366,11 @@ jack_initialize_shm (const char *server_name)
jack_set_server_prefix (server_name);
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
+
if ((rc = jack_access_registry (&registry_info)) == 0) {
if ((rc = jack_shm_validate_registry ()) != 0) {
jack_error ("Incompatible shm registry, "
@@ -412,15 +429,20 @@ jack_release_shm_entry (jack_shm_registry_index_t index)
sizeof (jack_shm_registry[index].id));
}
-void
+int
jack_release_shm_info (jack_shm_registry_index_t index)
{
/* must NOT have the registry locked */
if (jack_shm_registry[index].allocator == GetPID()) {
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
jack_release_shm_entry (index);
jack_shm_unlock_registry ();
}
+
+ return 0;
}
/* Claim server_name for this process.
@@ -440,7 +462,10 @@ jack_register_server (const char *server_name, int new_registry)
if (jack_server_initialize_shm (new_registry))
return ENOMEM;
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
/* See if server_name already registered. Since server names
* are per-user, we register the unique server prefix string.
@@ -493,11 +518,14 @@ jack_register_server (const char *server_name, int new_registry)
}
/* release server_name registration */
-void
+int
jack_unregister_server (const char *server_name /* unused */)
{
int i;
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
for (i = 0; i < MAX_SERVERS; i++) {
if (jack_shm_header->server[i].pid == GetPID()) {
@@ -506,7 +534,8 @@ jack_unregister_server (const char *server_name /* unused */)
}
}
- jack_shm_unlock_registry ();
+ jack_shm_unlock_registry ();
+ return 0;
}
/* called for server startup and termination */
@@ -517,7 +546,10 @@ jack_cleanup_shm ()
int destroy;
jack_shm_info_t copy;
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
for (i = 0; i < MAX_SHM_ID; i++) {
jack_shm_registry_t* r;
@@ -741,7 +773,10 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si)
int rc = -1;
char name[SHM_NAME_MAX+1];
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
if ((registry = jack_get_free_shm_info ()) == NULL) {
jack_error ("shm registry full");
@@ -780,7 +815,7 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si)
close (shm_fd);
registry->size = size;
strncpy (registry->id, name, sizeof (registry->id));
- registry->allocator = getpid();
+ registry->allocator = GetPID();
si->index = registry->index;
si->ptr.attached_at = MAP_FAILED; /* not attached */
rc = 0; /* success */
@@ -936,7 +971,10 @@ jack_shmalloc (const char *shm_name, jack_shmsize_t size, jack_shm_info_t* si)
int rc = -1;
char name[SHM_NAME_MAX+1];
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
if ((registry = jack_get_free_shm_info ()) == NULL) {
jack_error ("shm registry full");
@@ -1133,7 +1171,10 @@ jack_shmalloc (const char* name_not_used, jack_shmsize_t size,
int rc = -1;
jack_shm_registry_t* registry;
- jack_shm_lock_registry ();
+ if (jack_shm_lock_registry () < 0) {
+ jack_error ("jack_shm_lock_registry fails...");
+ return -1;
+ }
if ((registry = jack_get_free_shm_info ())) {
diff --git a/common/shm.h b/common/shm.h
index 4a7d15c6..ed5a953f 100644
--- a/common/shm.h
+++ b/common/shm.h
@@ -115,33 +115,33 @@ extern "C"
* indicating where the shared memory has been
* attached to the address space.
*/
-
+
typedef struct _jack_shm_info {
jack_shm_registry_index_t index; /* offset into the registry */
uint32_t size;
union {
void *attached_at; /* address where attached */
- char ptr_size[8];
- } ptr; /* a "pointer" that has the same 8 bytes size when compling in 32 or 64 bits */
+ char ptr_size[8];
+ } ptr; /* a "pointer" that has the same 8 bytes size when compling in 32 or 64 bits */
}
POST_PACKED_STRUCTURE jack_shm_info_t;
/* utility functions used only within JACK */
-
+
void jack_shm_copy_from_registry (jack_shm_info_t*,
jack_shm_registry_index_t);
void jack_shm_copy_to_registry (jack_shm_info_t*,
jack_shm_registry_index_t*);
- void jack_release_shm_info (jack_shm_registry_index_t);
- char* jack_shm_addr (jack_shm_info_t* si);
+ int jack_release_shm_info (jack_shm_registry_index_t);
+ char* jack_shm_addr (jack_shm_info_t* si);
- // here begin the API
+ // here begin the API
int jack_register_server (const char *server_name, int new_registry);
- void jack_unregister_server (const char *server_name);
+ int jack_unregister_server (const char *server_name);
int jack_initialize_shm (const char *server_name);
- int jack_initialize_shm_server (void);
- int jack_initialize_shm_client (void);
+ int jack_initialize_shm_server (void);
+ int jack_initialize_shm_client (void);
int jack_cleanup_shm (void);
int jack_shmalloc (const char *shm_name, jack_shmsize_t size,
@@ -149,7 +149,7 @@ extern "C"
void jack_release_shm (jack_shm_info_t*);
void jack_destroy_shm (jack_shm_info_t*);
int jack_attach_shm (jack_shm_info_t*);
- int jack_attach_shm_read (jack_shm_info_t*);
+ int jack_attach_shm_read (jack_shm_info_t*);
int jack_resize_shm (jack_shm_info_t*, jack_shmsize_t size);
#ifdef __cplusplus
diff --git a/dbus/wscript b/dbus/wscript
index e23e67b0..a4066b57 100644
--- a/dbus/wscript
+++ b/dbus/wscript
@@ -10,11 +10,15 @@ def set_options(opt):
opt.add_option('--enable-pkg-config-dbus-service-dir', action='store_true', default=False, help='force D-Bus service install dir to be one returned by pkg-config')
def configure(conf):
- if not conf.check_cfg(package='dbus-1', atleast_version='1.0.0', args='--cflags --libs'):
+ conf.env['BUILD_JACKDBUS'] = False
+
+ if not conf.check_cfg(package='dbus-1', atleast_version='1.0.0', args='--cflags --libs') or not conf.is_defined('HAVE_DBUS_1'):
+ print Logs.colors.RED + 'WARNING !! jackdbus will not be built because libdbus-dev is missing' + Logs.colors.NORMAL
return
dbus_dir = conf.check_cfg(package='dbus-1', args='--variable=session_bus_services_dir')
if not dbus_dir:
+ print Logs.colors.RED + 'WARNING !! jackdbus will not be built because service dir is unknown' + Logs.colors.NORMAL
return
dbus_dir = dbus_dir.strip()
@@ -31,15 +35,13 @@ def configure(conf):
if conf.is_defined('HAVE_EXPAT'):
conf.env['LIB_EXPAT'] = ['expat']
+ else:
+ print Logs.colors.RED + 'WARNING !! jackdbus will not be built because of expat is missing' + Logs.colors.NORMAL
+ return
- conf.env['BUILD_JACKDBUS1'] = conf.is_defined('HAVE_EXPAT') and conf.is_defined('HAVE_DBUS_1')
-
+ conf.env['BUILD_JACKDBUS'] = True
def build(bld):
-
- if bld.env['BUILD_JACKDBUS1'] != True:
- return
-
obj = bld.new_task_gen('cc', 'program')
if bld.env['IS_LINUX']:
sysdeps_dbus_include = ['../linux', '../posix']
diff --git a/example-clients/alsa_in.c b/example-clients/alsa_in.c
index 2a8b78c3..a04271eb 100644
--- a/example-clients/alsa_in.c
+++ b/example-clients/alsa_in.c
@@ -184,7 +184,7 @@ static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_
}
/* set the buffer time */
- buffer_time = 1000000*period*nperiods/rate;
+ buffer_time = 1000000*(uint64_t)period*nperiods/rate;
err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);
if (err < 0) {
printf("Unable to set buffer time %i for playback: %s\n", 1000000*period*nperiods/rate, snd_strerror(err));
@@ -199,7 +199,7 @@ static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_
printf( "WARNING: buffer size does not match: (requested %d, got %d)\n", nperiods * period, (int) real_buffer_size );
}
/* set the period time */
- period_time = 1000000*period/rate;
+ period_time = 1000000*(uint64_t)period/rate;
err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);
if (err < 0) {
printf("Unable to set period time %i for playback: %s\n", 1000000*period/rate, snd_strerror(err));
diff --git a/example-clients/alsa_out.c b/example-clients/alsa_out.c
index 2d34cd13..852e978c 100644
--- a/example-clients/alsa_out.c
+++ b/example-clients/alsa_out.c
@@ -183,7 +183,7 @@ static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_
}
/* set the buffer time */
- buffer_time = 1000000*period*nperiods/rate;
+ buffer_time = 1000000*(uint64_t)period*nperiods/rate;
err = snd_pcm_hw_params_set_buffer_time_near(handle, params, &buffer_time, &dir);
if (err < 0) {
printf("Unable to set buffer time %i for playback: %s\n", 1000000*period*nperiods/rate, snd_strerror(err));
@@ -198,7 +198,7 @@ static int set_hwparams(snd_pcm_t *handle, snd_pcm_hw_params_t *params, snd_pcm_
printf( "WARNING: buffer size does not match: (requested %d, got %d)\n", nperiods * period, (int) real_buffer_size );
}
/* set the period time */
- period_time = 1000000*period/rate;
+ period_time = 1000000*(uint64_t)period/rate;
err = snd_pcm_hw_params_set_period_time_near(handle, params, &period_time, &dir);
if (err < 0) {
printf("Unable to set period time %i for playback: %s\n", 1000000*period/rate, snd_strerror(err));
diff --git a/example-clients/jack_control b/example-clients/jack_control
index c7b2dab5..1d06436b 100755
--- a/example-clients/jack_control
+++ b/example-clients/jack_control
@@ -106,9 +106,9 @@ def main():
print "Usage: %s [command] [command] ..." % os.path.basename(sys.argv[0])
print "Commands:"
print " exit - exit jack dbus service (stops jack server if currently running)"
- print " status - check whether jack server is started, return value is 0 if runing and 1 otherwise"
+ print " status - check whether jack server is started, return value is 0 if running and 1 otherwise"
print " start - start jack server if not currently started"
- print " stop - stop jack server if currenly started"
+ print " stop - stop jack server if currently started"
print " sm - switch master to currently selected driver"
print " dl - get list of available drivers"
print " dg - get currently selected driver"
diff --git a/example-clients/netsource.c b/example-clients/netsource.c
index 32b06fc2..d6d252c2 100644
--- a/example-clients/netsource.c
+++ b/example-clients/netsource.c
@@ -34,6 +34,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include <string.h>
#include <signal.h>
+#ifdef __linux__
+#include "config.h"
+#endif
+
#ifdef WIN32
#include <winsock2.h>
#define socklen_t int
@@ -754,7 +758,7 @@ main (int argc, char *argv[])
if (statecopy_netxruns != state_netxruns) {
statecopy_netxruns = state_netxruns;
printf ("%s: at frame %06d -> total netxruns %d (%d%%) queue time= %d\n",
- client_name,
+ client_name,
state_currentframe,
statecopy_netxruns,
100*statecopy_netxruns/state_currentframe,
diff --git a/example-clients/wscript b/example-clients/wscript
index 04cc9c4f..4cf08d15 100644
--- a/example-clients/wscript
+++ b/example-clients/wscript
@@ -49,10 +49,11 @@ def configure(conf):
e = conf.check_cc(lib='readline', define_name="HAVE_READLINE")
- if conf.is_defined('HAVE_READLINE'):
- conf.env['LIB_READLINE'] = ['readline']
+ # define_name="HAVE_READLINE" has no effect, LIB_READLINE is defined if readline is available
+ #if conf.is_defined('HAVE_READLINE'):
+ # conf.env['LIB_READLINE'] = ['readline']
- conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = conf.is_defined('HAVE_READLINE') and conf.is_defined('HAVE_NCURSES')
+ conf.env['BUILD_EXAMPLE_CLIENT_TRANSPORT'] = bool(conf.env['LIB_READLINE']) and bool(conf.env['LIB_NCURSES'])
conf.env['BUILD_EXAMPLE_CLIENT_REC'] = conf.is_defined('HAVE_SNDFILE')
diff --git a/linux/firewire/JackFFADODriver.cpp b/linux/firewire/JackFFADODriver.cpp
index 7c05370a..88d9baf7 100644
--- a/linux/firewire/JackFFADODriver.cpp
+++ b/linux/firewire/JackFFADODriver.cpp
@@ -429,7 +429,7 @@ int JackFFADODriver::Attach()
driver->capture_channels[chn].stream_type = ffado_streaming_get_capture_stream_type(driver->dev, chn);
if (driver->capture_channels[chn].stream_type == ffado_stream_type_audio) {
- snprintf(buf, sizeof(buf) - 1, "%s:AC%d_%s", fClientControl.fName, (int)chn, portname);
+ snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
printMessage ("Registering audio capture port %s", buf);
if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
JACK_DEFAULT_AUDIO_TYPE,
@@ -452,7 +452,7 @@ int JackFFADODriver::Attach()
fCaptureChannels++;
} else if (driver->capture_channels[chn].stream_type == ffado_stream_type_midi) {
- snprintf(buf, sizeof(buf) - 1, "%s:MC%d_%s", fClientControl.fName, (int)chn, portname);
+ snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
printMessage ("Registering midi capture port %s", buf);
if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
JACK_DEFAULT_MIDI_TYPE,
@@ -499,7 +499,7 @@ int JackFFADODriver::Attach()
driver->playback_channels[chn].stream_type = ffado_streaming_get_playback_stream_type(driver->dev, chn);
if (driver->playback_channels[chn].stream_type == ffado_stream_type_audio) {
- snprintf(buf, sizeof(buf) - 1, "%s:AP%d_%s", fClientControl.fName, (int)chn, portname);
+ snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
printMessage ("Registering audio playback port %s", buf);
if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
JACK_DEFAULT_AUDIO_TYPE,
@@ -524,7 +524,7 @@ int JackFFADODriver::Attach()
jack_log("JackFFADODriver::Attach fPlaybackPortList[i] %ld ", port_index);
fPlaybackChannels++;
} else if (driver->playback_channels[chn].stream_type == ffado_stream_type_midi) {
- snprintf(buf, sizeof(buf) - 1, "%s:MP%d_%s", fClientControl.fName, (int)chn, portname);
+ snprintf(buf, sizeof(buf) - 1, "%s:%s", fClientControl.fName, portname);
printMessage ("Registering midi playback port %s", buf);
if ((port_index = fGraphManager->AllocatePort(fClientControl.fRefNum, buf,
JACK_DEFAULT_MIDI_TYPE,
diff --git a/linux/wscript b/linux/wscript
index 20695a96..869985d4 100644
--- a/linux/wscript
+++ b/linux/wscript
@@ -2,7 +2,7 @@
# encoding: utf-8
def configure(conf):
- conf.check_cfg(package='alsa', atleast_version='1.0.0', args='--cflags --libs')
+ conf.check_cfg(package='alsa', atleast_version='1.0.18', args='--cflags --libs')
conf.env['BUILD_DRIVER_ALSA'] = conf.is_defined('HAVE_ALSA')
conf. check_cfg(package='libfreebob', atleast_version='1.0.0', args='--cflags --libs')
diff --git a/macosx/JackMachServerChannel.cpp b/macosx/JackMachServerChannel.cpp
index 6f614d3a..fcf4fe8c 100644
--- a/macosx/JackMachServerChannel.cpp
+++ b/macosx/JackMachServerChannel.cpp
@@ -58,7 +58,12 @@ int JackMachServerChannel::Open(const char* server_name, JackServer* server)
void JackMachServerChannel::Close()
{
jack_log("JackMachServerChannel::Close");
+ #ifdef MAC_OS_X_VERSION_10_5
+ // Exception does not work in this case on pre Snow Loopard systems, see JackMachServerNotifyChannel::NotifyQuit()
+ fThread.Kill();
+ #else
fThread.Stop();
+ #endif
fServerPort.DestroyPort();
}
diff --git a/macosx/JackMachServerNotifyChannel.cpp b/macosx/JackMachServerNotifyChannel.cpp
index 378cdfd4..f55ce09e 100644
--- a/macosx/JackMachServerNotifyChannel.cpp
+++ b/macosx/JackMachServerNotifyChannel.cpp
@@ -55,10 +55,14 @@ void JackMachServerNotifyChannel::Notify(int refnum, int notify, int value)
void JackMachServerNotifyChannel::NotifyQuit()
{
+ #ifdef MAC_OS_X_VERSION_10_5
+ // Nothing : since exception does not work in this case on pre Snow Loopard systems, see JackMachServerChannel::Close()
+ #else
kern_return_t res = rpc_jack_client_rt_notify(fClientPort.GetPort(), -1, kQUIT, 0, 0);
if (res != KERN_SUCCESS) {
jack_error("Could not write request ref = %d notify = %d err = %s", -1, kQUIT, mach_error_string(res));
}
+#endif
}
} // end of namespace
diff --git a/macosx/coreaudio/JackCoreAudioDriver.cpp b/macosx/coreaudio/JackCoreAudioDriver.cpp
index 361008e3..2441375c 100644
--- a/macosx/coreaudio/JackCoreAudioDriver.cpp
+++ b/macosx/coreaudio/JackCoreAudioDriver.cpp
@@ -1268,9 +1268,9 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
if (capturing && inchannels > 0) {
size = sizeof(AudioStreamBasicDescription);
- err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 0, &srcFormat, &size);
+ err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &srcFormat, &size);
if (err1 != noErr) {
- jack_error("Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
+ jack_error("Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
printError(err1);
goto error;
}
@@ -1288,9 +1288,8 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
PrintStreamDesc(&srcFormat);
err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, 1, &srcFormat, sizeof(AudioStreamBasicDescription));
-
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
+ jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
printError(err1);
goto error;
}
@@ -1299,9 +1298,9 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
if (playing && outchannels > 0) {
size = sizeof(AudioStreamBasicDescription);
- err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 1, &dstFormat, &size);
+ err1 = AudioUnitGetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &dstFormat, &size);
if (err1 != noErr) {
- jack_error("Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
+ jack_error("Error calling AudioUnitGetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
printError(err1);
goto error;
}
@@ -1319,9 +1318,8 @@ int JackCoreAudioDriver::OpenAUHAL(bool capturing,
PrintStreamDesc(&dstFormat);
err1 = AudioUnitSetProperty(fAUHAL, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &dstFormat, sizeof(AudioStreamBasicDescription));
-
if (err1 != noErr) {
- jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Output");
+ jack_error("Error calling AudioUnitSetProperty - kAudioUnitProperty_StreamFormat kAudioUnitScope_Input");
printError(err1);
goto error;
}
diff --git a/posix/JackPosixMutex.h b/posix/JackPosixMutex.h
index 91d21132..ddf89553 100644
--- a/posix/JackPosixMutex.h
+++ b/posix/JackPosixMutex.h
@@ -103,11 +103,12 @@ class JackPosixMutex
pthread_mutex_destroy(&fMutex);
}
- void Lock()
+ bool Lock()
{
int res = pthread_mutex_lock(&fMutex);
if (res != 0)
jack_error("JackPosixMutex::Lock res = %d", res);
+ return (res == 0);
}
bool Trylock()
@@ -115,11 +116,12 @@ class JackPosixMutex
return (pthread_mutex_trylock(&fMutex) == 0);
}
- void Unlock()
+ bool Unlock()
{
int res = pthread_mutex_unlock(&fMutex);
if (res != 0)
jack_error("JackPosixMutex::Unlock res = %d", res);
+ return (res == 0);
}
};
diff --git a/windows/JackRouter/JackRouter.cpp b/windows/JackRouter/JackRouter.cpp
new file mode 100644
index 00000000..47727af7
--- /dev/null
+++ b/windows/JackRouter/JackRouter.cpp
@@ -0,0 +1,840 @@
+/*
+Copyright (C) 2006 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifdef WIN32
+#pragma warning (disable : 4786)
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <process.h>
+#include "JackRouter.h"
+#include "profport.h"
+
+/*
+
+ 08/07/2007 SL : USe jack_client_open instead of jack_client_new (automatic client renaming).
+ 09/08/2007 SL : Add JackRouter.ini parameter file.
+ 09/20/2007 SL : Better error report in DllRegisterServer (for Vista).
+ 09/27/2007 SL : Add AUDO_CONNECT property in JackRouter.ini file.
+ 10/10/2007 SL : Use ASIOSTInt32LSB instead of ASIOSTInt16LSB.
+
+ */
+
+//------------------------------------------------------------------------------------------
+// extern
+void getNanoSeconds(ASIOTimeStamp *time);
+
+// local
+double AsioSamples2double (ASIOSamples* samples);
+
+static const double twoRaisedTo32 = 4294967296.;
+static const double twoRaisedTo32Reciprocal = 1. / twoRaisedTo32;
+
+//------------------------------------------------------------------------------------------
+// on windows, we do the COM stuff.
+
+#if WINDOWS
+#include "windows.h"
+#include "mmsystem.h"
+#include "psapi.h"
+
+using namespace std;
+
+// class id.
+// {838FE50A-C1AB-4b77-B9B6-0A40788B53F3}
+CLSID IID_ASIO_DRIVER = { 0x838fe50a, 0xc1ab, 0x4b77, { 0xb9, 0xb6, 0xa, 0x40, 0x78, 0x8b, 0x53, 0xf3 } };
+
+
+CFactoryTemplate g_Templates[1] = {
+ {L"ASIOJACK", &IID_ASIO_DRIVER, JackRouter::CreateInstance}
+};
+int g_cTemplates = sizeof(g_Templates) / sizeof(g_Templates[0]);
+
+CUnknown* JackRouter::CreateInstance(LPUNKNOWN pUnk, HRESULT *phr)
+{
+ return (CUnknown*)new JackRouter(pUnk,phr);
+};
+
+STDMETHODIMP JackRouter::NonDelegatingQueryInterface(REFIID riid, void ** ppv)
+{
+ if (riid == IID_ASIO_DRIVER) {
+ return GetInterface(this, ppv);
+ }
+ return CUnknown::NonDelegatingQueryInterface(riid, ppv);
+}
+
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+// Register ASIO Driver
+// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+extern LONG RegisterAsioDriver(CLSID,char *,char *,char *,char *);
+extern LONG UnregisterAsioDriver(CLSID,char *,char *);
+
+//
+// Server registration, called on REGSVR32.EXE "the dllname.dll"
+//
+HRESULT _stdcall DllRegisterServer()
+{
+ LONG rc;
+ char errstr[128];
+
+ rc = RegisterAsioDriver (IID_ASIO_DRIVER,"JackRouter.dll","JackRouter","JackRouter","Apartment");
+
+ if (rc) {
+ memset(errstr,0,128);
+ sprintf(errstr,"Register Server failed ! (%d)",rc);
+ MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"JackRouter",MB_OK);
+ return -1;
+ }
+
+ return S_OK;
+}
+
+//
+// Server unregistration
+//
+HRESULT _stdcall DllUnregisterServer()
+{
+ LONG rc;
+ char errstr[128];
+
+ rc = UnregisterAsioDriver (IID_ASIO_DRIVER,"JackRouter.dll","JackRouter");
+
+ if (rc) {
+ memset(errstr,0,128);
+ sprintf(errstr,"Unregister Server failed ! (%d)",rc);
+ MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"JackRouter",MB_OK);
+ return -1;
+ }
+
+ return S_OK;
+}
+
+// Globals
+
+list<pair<string, string> > JackRouter::fConnections;
+bool JackRouter::fFirstActivate = true;
+
+//------------------------------------------------------------------------------------------
+//------------------------------------------------------------------------------------------
+JackRouter::JackRouter (LPUNKNOWN pUnk, HRESULT *phr)
+ : CUnknown("ASIOJACK", pUnk, phr)
+
+//------------------------------------------------------------------------------------------
+
+#else
+
+// when not on windows, we derive from AsioDriver
+JackRouter::JackRouter() : AsioDriver()
+
+#endif
+{
+ long i;
+
+ fSamplePosition = 0;
+ fActive = false;
+ fStarted = false;
+ fTimeInfoMode = false;
+ fTcRead = false;
+ fClient = NULL;
+ fAutoConnectIn = true;
+ fAutoConnectOut = true;
+
+ for (i = 0; i < kNumInputs; i++) {
+ fInputBuffers[i] = 0;
+ fInputPorts[i] = 0;
+ fInMap[i] = 0;
+ }
+ for (i = 0; i < kNumOutputs; i++) {
+ fOutputBuffers[i] = 0;
+ fOutputPorts[i] = 0;
+ fOutMap[i] = 0;
+ }
+ fCallbacks = 0;
+ fActiveInputs = fActiveOutputs = 0;
+ fToggle = 0;
+ fBufferSize = 512;
+ fSampleRate = 44100;
+ printf("Constructor\n");
+
+ // Use "jackrouter.ini" parameters if available
+ HMODULE handle = LoadLibrary("JackRouter.dll");
+
+ if (handle) {
+
+ // Get JackRouter.dll path
+ char dllName[512];
+ string confPath;
+ DWORD res = GetModuleFileName(handle, dllName, 512);
+
+ // Compute .ini file path
+ string fullPath = dllName;
+ int lastPos = fullPath.find_last_of(PATH_SEP);
+ string dllFolder = fullPath.substr(0, lastPos);
+ confPath = dllFolder + PATH_SEP + "JackRouter.ini";
+
+ // Get parameters
+ kNumInputs = get_private_profile_int("IO", "input", 2, confPath.c_str());
+ kNumOutputs = get_private_profile_int("IO", "output", 2, confPath.c_str());
+
+ fAutoConnectIn = get_private_profile_int("AUTO_CONNECT", "input", 1, confPath.c_str());
+ fAutoConnectOut = get_private_profile_int("AUTO_CONNECT", "output", 1, confPath.c_str());
+
+ FreeLibrary(handle);
+
+ } else {
+ printf("LoadLibrary error\n");
+ }
+}
+
+//------------------------------------------------------------------------------------------
+JackRouter::~JackRouter()
+{
+ stop ();
+ disposeBuffers ();
+ printf("Destructor\n");
+ jack_client_close(fClient);
+}
+
+//------------------------------------------------------------------------------------------
+#include <windows.h>
+#include <stdio.h>
+#include <tchar.h>
+#include "psapi.h"
+
+static bool GetEXEName(DWORD dwProcessID, char* name)
+{
+ DWORD aProcesses [1024], cbNeeded, cProcesses;
+ unsigned int i;
+
+ // Enumerate all processes
+ if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded))
+ return false;
+
+ // Calculate how many process identifiers were returned.
+ cProcesses = cbNeeded / sizeof(DWORD);
+
+ TCHAR szEXEName[MAX_PATH];
+ // Loop through all process to find the one that matches
+ // the one we are looking for
+
+ for (i = 0; i < cProcesses; i++) {
+ if (aProcesses [i] == dwProcessID) {
+ // Get a handle to the process
+ HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION |
+ PROCESS_VM_READ, FALSE, dwProcessID);
+
+ // Get the process name
+ if (NULL != hProcess) {
+ HMODULE hMod;
+ DWORD cbNeeded;
+
+ if(EnumProcessModules(hProcess, &hMod,
+ sizeof(hMod), &cbNeeded)) {
+ //Get the name of the exe file
+ GetModuleBaseName(hProcess, hMod, szEXEName,
+ sizeof(szEXEName)/sizeof(TCHAR));
+ int len = strlen((char*)szEXEName) - 4; // remove ".exe"
+ strncpy(name, (char*)szEXEName, len);
+ name[len] = '\0';
+ return true;
+ }
+ }
+ }
+ }
+
+ return false;
+}
+
+ //------------------------------------------------------------------------------------------
+static inline float ClipFloat(float sample)
+{
+ return (sample < -1.0f) ? -1.0f : (sample > 1.0f) ? 1.0f : sample;
+}
+
+//------------------------------------------------------------------------------------------
+void JackRouter::shutdown(void* arg)
+{
+ JackRouter* driver = (JackRouter*)arg;
+ /*
+ //exit(1);
+ char errstr[128];
+
+ memset(errstr,0,128);
+ sprintf(errstr,"JACK server has quitted");
+ MessageBox(0,(LPCTSTR)errstr,(LPCTSTR)"JackRouter",MB_OK);
+ */
+}
+
+//------------------------------------------------------------------------------------------
+int JackRouter::process(jack_nframes_t nframes, void* arg)
+{
+ JackRouter* driver = (JackRouter*)arg;
+ int i,j;
+ int pos = (driver->fToggle) ? 0 : driver->fBufferSize ;
+
+ for (i = 0; i < driver->fActiveInputs; i++) {
+
+#ifdef LONG_SAMPLE
+ float* buffer = (float*)jack_port_get_buffer(driver->fInputPorts[i], nframes);
+ long* in = driver->fInputBuffers[i] + pos;
+ for (j = 0; j < nframes; j++) {
+ in[j] = buffer[j] * float(0x7fffffff);
+ }
+#else
+ memcpy(driver->fInputBuffers[i] + pos,
+ jack_port_get_buffer(driver->fInputPorts[i], nframes),
+ nframes * sizeof(float));
+#endif
+
+ }
+
+ driver->bufferSwitch();
+
+ for (i = 0; i < driver->fActiveOutputs; i++) {
+
+#ifdef LONG_SAMPLE
+ float* buffer = (float*)jack_port_get_buffer(driver->fOutputPorts[i], nframes);
+ long* out = driver->fOutputBuffers[i] + pos;
+ float gain = 1.f/float(0x7fffffff);
+ for (j = 0; j < nframes; j++) {
+ buffer[j] = out[j] * gain;
+ }
+#else
+ memcpy(jack_port_get_buffer(driver->fOutputPorts[i], nframes),
+ driver->fOutputBuffers[i] + pos,
+ nframes * sizeof(float));
+#endif
+ }
+
+ return 0;
+}
+
+//------------------------------------------------------------------------------------------
+void JackRouter::getDriverName(char *name)
+{
+ strcpy (name, "JackRouter");
+}
+
+//------------------------------------------------------------------------------------------
+long JackRouter::getDriverVersion()
+{
+ return 0x00000001L;
+}
+
+//------------------------------------------------------------------------------------------
+void JackRouter::getErrorMessage(char *string)
+{
+ strcpy (string, fErrorMessage);
+}
+
+//------------------------------------------------------------------------------------------
+ASIOBool JackRouter::init(void* sysRef)
+{
+ char name[MAX_PATH];
+ sysRef = sysRef;
+
+ if (fActive)
+ return true;
+
+ HANDLE win = (HANDLE)sysRef;
+ int my_pid = _getpid();
+
+ if (!GetEXEName(my_pid, name)) { // If getting the .exe name fails, takes a generic one.
+ _snprintf(name, sizeof(name) - 1, "JackRouter_%d", my_pid);
+ }
+
+ if (fClient) {
+ printf("Error: jack client still present...\n");
+ return true;
+ }
+
+ fClient = jack_client_open(name, JackNullOption, NULL);
+ if (fClient == NULL) {
+ strcpy (fErrorMessage, "Open error: is jack server running?");
+ printf("Open error: is jack server running?\n");
+ return false;
+ }
+
+ fBufferSize = jack_get_buffer_size(fClient);
+ fSampleRate = jack_get_sample_rate(fClient);
+ jack_set_process_callback(fClient, process, this);
+ jack_on_shutdown(fClient, shutdown, this);
+
+ fInputLatency = fBufferSize; // typically
+ fOutputLatency = fBufferSize * 2;
+ fMilliSeconds = (long)((double)(fBufferSize * 1000) / fSampleRate);
+
+ // Typically fBufferSize * 2; try to get 1 by offering direct buffer
+ // access, and using asioPostOutput for lower latency
+
+ printf("Init ASIO Jack\n");
+ fActive = true;
+ return true;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::start()
+{
+ if (fCallbacks) {
+ fSamplePosition = 0;
+ fTheSystemTime.lo = fTheSystemTime.hi = 0;
+ fToggle = 0;
+ fStarted = true;
+ printf("Start ASIO Jack\n");
+
+ if (jack_activate(fClient) == 0) {
+
+ if (fFirstActivate) {
+ AutoConnect();
+ fFirstActivate = false;
+ } else {
+ RestoreConnections();
+ }
+
+ return ASE_OK;
+
+ } else {
+ return ASE_NotPresent;
+ }
+ }
+
+ return ASE_NotPresent;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::stop()
+{
+ fStarted = false;
+ printf("Stop ASIO Jack\n");
+ SaveConnections();
+ jack_deactivate(fClient);
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getChannels(long *numInputChannels, long *numOutputChannels)
+{
+ *numInputChannels = kNumInputs;
+ *numOutputChannels = kNumOutputs;
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getLatencies(long *_inputLatency, long *_outputLatency)
+{
+ *_inputLatency = fInputLatency;
+ *_outputLatency = fOutputLatency;
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity)
+{
+ *minSize = *maxSize = *preferredSize = fBufferSize; // allow this size only
+ *granularity = 0;
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::canSampleRate(ASIOSampleRate sampleRate)
+{
+ return (sampleRate == fSampleRate) ? ASE_OK : ASE_NoClock;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getSampleRate(ASIOSampleRate *sampleRate)
+{
+ *sampleRate = fSampleRate;
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::setSampleRate(ASIOSampleRate sampleRate)
+{
+ return (sampleRate == fSampleRate) ? ASE_OK : ASE_NoClock;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getClockSources(ASIOClockSource *clocks, long *numSources)
+{
+ // Internal
+ if (clocks && numSources) {
+ clocks->index = 0;
+ clocks->associatedChannel = -1;
+ clocks->associatedGroup = -1;
+ clocks->isCurrentSource = ASIOTrue;
+ strcpy(clocks->name, "Internal");
+ *numSources = 1;
+ return ASE_OK;
+ } else {
+ return ASE_InvalidParameter;
+ }
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::setClockSource(long index)
+{
+ if (!index) {
+ fAsioTime.timeInfo.flags |= kClockSourceChanged;
+ return ASE_OK;
+ } else {
+ return ASE_NotPresent;
+ }
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp)
+{
+ tStamp->lo = fTheSystemTime.lo;
+ tStamp->hi = fTheSystemTime.hi;
+
+ if (fSamplePosition >= twoRaisedTo32) {
+ sPos->hi = (unsigned long)(fSamplePosition * twoRaisedTo32Reciprocal);
+ sPos->lo = (unsigned long)(fSamplePosition - (sPos->hi * twoRaisedTo32));
+ } else {
+ sPos->hi = 0;
+ sPos->lo = (unsigned long)fSamplePosition;
+ }
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::getChannelInfo(ASIOChannelInfo *info)
+{
+ if (info->channel < 0 || (info->isInput ? info->channel >= kNumInputs : info->channel >= kNumOutputs))
+ return ASE_InvalidParameter;
+#ifdef LONG_SAMPLE
+ info->type = ASIOSTInt32LSB;
+#else
+ info->type = ASIOSTFloat32LSB;
+#endif
+
+ info->channelGroup = 0;
+ info->isActive = ASIOFalse;
+ long i;
+ char buf[32];
+
+ if (info->isInput) {
+ for (i = 0; i < fActiveInputs; i++) {
+ if (fInMap[i] == info->channel) {
+ info->isActive = ASIOTrue;
+ //_snprintf(buf, sizeof(buf) - 1, "Jack::In%d ", info->channel);
+ //strcpy(info->name, buf);
+ //strcpy(info->name, jack_port_name(fInputPorts[i]));
+ break;
+ }
+ }
+ _snprintf(buf, sizeof(buf) - 1, "In%d ", info->channel);
+ strcpy(info->name, buf);
+ } else {
+ for (i = 0; i < fActiveOutputs; i++) {
+ if (fOutMap[i] == info->channel) { //NOT USED !!
+ info->isActive = ASIOTrue;
+ //_snprintf(buf, sizeof(buf) - 1, "Jack::Out%d ", info->channel);
+ //strcpy(info->name, buf);
+ //strcpy(info->name, jack_port_name(fOutputPorts[i]));
+ break;
+ }
+ }
+ _snprintf(buf, sizeof(buf) - 1, "Out%d ", info->channel);
+ strcpy(info->name, buf);
+ }
+ return ASE_OK;
+}
+
+//------------------------------------------------------------------------------------------
+ASIOError JackRouter::createBuffers(ASIOBufferInfo *bufferInfos, long numChannels,
+ long bufferSize, ASIOCallbacks *callbacks)
+{
+ ASIOBufferInfo *info = bufferInfos;
+ long i;
+ bool notEnoughMem = false;
+ char buf[256];
+ fActiveInputs = 0;
+ fActiveOutputs = 0;
+
+ for (i = 0; i < numChannels; i++, info++) {
+ if (info->isInput) {
+ if (info->channelNum < 0 || info->channelNum >= kNumInputs)
+ goto error;
+ fInMap[fActiveInputs] = info->channelNum;
+ #ifdef LONG_SAMPLE
+ fInputBuffers[fActiveInputs] = new long[fBufferSize * 2]; // double buffer
+ #else
+ fInputBuffers[fActiveInputs] = new float[fBufferSize * 2]; // double buffer
+ #endif
+ if (fInputBuffers[fActiveInputs]) {
+ info->buffers[0] = fInputBuffers[fActiveInputs];
+ info->buffers[1] = fInputBuffers[fActiveInputs] + fBufferSize;
+ } else {
+ info->buffers[0] = info->buffers[1] = 0;
+ notEnoughMem = true;
+ }
+
+ _snprintf(buf, sizeof(buf) - 1, "in%d", fActiveInputs + 1);
+ fInputPorts[fActiveInputs]
+ = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput,0);
+ if (fInputPorts[fActiveInputs] == NULL)
+ goto error;
+
+ fActiveInputs++;
+ if (fActiveInputs > kNumInputs) {
+error:
+ disposeBuffers();
+ return ASE_InvalidParameter;
+ }
+ } else { // output
+ if (info->channelNum < 0 || info->channelNum >= kNumOutputs)
+ goto error;
+ fOutMap[fActiveOutputs] = info->channelNum;
+
+ #ifdef LONG_SAMPLE
+ fOutputBuffers[fActiveOutputs] = new long[fBufferSize * 2]; // double buffer
+ #else
+ fOutputBuffers[fActiveOutputs] = new float[fBufferSize * 2]; // double buffer
+ #endif
+
+ if (fOutputBuffers[fActiveOutputs]) {
+ info->buffers[0] = fOutputBuffers[fActiveOutputs];
+ info->buffers[1] = fOutputBuffers[fActiveOutputs] + fBufferSize;
+ } else {
+ info->buffers[0] = info->buffers[1] = 0;
+ notEnoughMem = true;
+ }
+
+ _snprintf(buf, sizeof(buf) - 1, "out%d", fActiveOutputs + 1);
+ fOutputPorts[fActiveOutputs]
+ = jack_port_register(fClient, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput,0);
+ if (fOutputPorts[fActiveOutputs] == NULL)
+ goto error;
+
+ fActiveOutputs++;
+ if (fActiveOutputs > kNumOutputs) {
+ fActiveOutputs--;
+ disposeBuffers();
+ return ASE_InvalidParameter;
+ }
+ }
+ }
+
+ if (notEnoughMem) {
+ disposeBuffers();
+ return ASE_NoMemory;
+ }
+
+ this->fCallbacks = callbacks;
+ if (callbacks->asioMessage (kAsioSupportsTimeInfo, 0, 0, 0)) {
+ fTimeInfoMode = true;
+ fAsioTime.timeInfo.speed = 1.;
+ fAsioTime.timeInfo.systemTime.hi = fAsioTime.timeInfo.systemTime.lo = 0;
+ fAsioTime.timeInfo.samplePosition.hi = fAsioTime.timeInfo.samplePosition.lo = 0;
+ fAsioTime.timeInfo.sampleRate = fSampleRate;
+ fAsioTime.timeInfo.flags = kSystemTimeValid | kSamplePositionValid | kSampleRateValid;
+
+ fAsioTime.timeCode.speed = 1.;
+ fAsioTime.timeCode.timeCodeSamples.lo = fAsioTime.timeCode.timeCodeSamples.hi = 0;
+ fAsioTime.timeCode.flags = kTcValid | kTcRunning ;
+ } else {
+ fTimeInfoMode = false;
+ }
+
+ return ASE_OK;
+}
+
+//---------------------------------------------------------------------------------------------
+ASIOError JackRouter::disposeBuffers()
+{
+ long i;
+
+ fCallbacks = 0;
+ stop();
+
+ for (i = 0; i < fActiveInputs; i++) {
+ delete[] fInputBuffers[i];
+ jack_port_unregister(fClient, fInputPorts[i]);
+ }
+ fActiveInputs = 0;
+
+ for (i = 0; i < fActiveOutputs; i++) {
+ delete[] fOutputBuffers[i];
+ jack_port_unregister(fClient, fOutputPorts[i]);
+ }
+ fActiveOutputs = 0;
+
+ return ASE_OK;
+}
+
+//---------------------------------------------------------------------------------------------
+ASIOError JackRouter::controlPanel()
+{
+ return ASE_NotPresent;
+}
+
+//---------------------------------------------------------------------------------------------
+ASIOError JackRouter::future(long selector, void* opt) // !!! check properties
+{
+ ASIOTransportParameters* tp = (ASIOTransportParameters*)opt;
+ switch (selector)
+ {
+ case kAsioEnableTimeCodeRead: fTcRead = true; return ASE_SUCCESS;
+ case kAsioDisableTimeCodeRead: fTcRead = false; return ASE_SUCCESS;
+ case kAsioSetInputMonitor: return ASE_SUCCESS; // for testing!!!
+ case kAsioCanInputMonitor: return ASE_SUCCESS; // for testing!!!
+ case kAsioCanTimeInfo: return ASE_SUCCESS;
+ case kAsioCanTimeCode: return ASE_SUCCESS;
+ }
+ return ASE_NotPresent;
+}
+
+//--------------------------------------------------------------------------------------------------------
+// private methods
+//--------------------------------------------------------------------------------------------------------
+
+//---------------------------------------------------------------------------------------------
+void JackRouter::bufferSwitch()
+{
+ if (fStarted && fCallbacks) {
+ getNanoSeconds(&fTheSystemTime); // latch system time
+ fSamplePosition += fBufferSize;
+ if (fTimeInfoMode) {
+ bufferSwitchX ();
+ } else {
+ fCallbacks->bufferSwitch (fToggle, ASIOFalse);
+ }
+ fToggle = fToggle ? 0 : 1;
+ }
+}
+
+//---------------------------------------------------------------------------------------------
+// asio2 buffer switch
+void JackRouter::bufferSwitchX ()
+{
+ getSamplePosition (&fAsioTime.timeInfo.samplePosition, &fAsioTime.timeInfo.systemTime);
+ long offset = fToggle ? fBufferSize : 0;
+ if (fTcRead) {
+ // Create a fake time code, which is 10 minutes ahead of the card's sample position
+ // Please note that for simplicity here time code will wrap after 32 bit are reached
+ fAsioTime.timeCode.timeCodeSamples.lo = fAsioTime.timeInfo.samplePosition.lo + 600.0 * fSampleRate;
+ fAsioTime.timeCode.timeCodeSamples.hi = 0;
+ }
+ fCallbacks->bufferSwitchTimeInfo (&fAsioTime, fToggle, ASIOFalse);
+ fAsioTime.timeInfo.flags &= ~(kSampleRateChanged | kClockSourceChanged);
+}
+
+//---------------------------------------------------------------------------------------------
+ASIOError JackRouter::outputReady()
+{
+ return ASE_NotPresent;
+}
+
+//---------------------------------------------------------------------------------------------
+double AsioSamples2double(ASIOSamples* samples)
+{
+ double a = (double)(samples->lo);
+ if (samples->hi)
+ a += (double)(samples->hi) * twoRaisedTo32;
+ return a;
+}
+
+//---------------------------------------------------------------------------------------------
+void getNanoSeconds(ASIOTimeStamp* ts)
+{
+ double nanoSeconds = (double)((unsigned long)timeGetTime ()) * 1000000.;
+ ts->hi = (unsigned long)(nanoSeconds / twoRaisedTo32);
+ ts->lo = (unsigned long)(nanoSeconds - (ts->hi * twoRaisedTo32));
+}
+
+//------------------------------------------------------------------------
+void JackRouter::SaveConnections()
+{
+ const char** connections;
+ int i;
+
+ for (i = 0; i < fActiveInputs; ++i) {
+ if (fInputPorts[i] && (connections = jack_port_get_connections(fInputPorts[i])) != 0) {
+ for (int j = 0; connections[j]; j++) {
+ fConnections.push_back(make_pair(connections[j], jack_port_name(fInputPorts[i])));
+ }
+ jack_free(connections);
+ }
+ }
+
+ for (i = 0; i < fActiveOutputs; ++i) {
+ if (fOutputPorts[i] && (connections = jack_port_get_connections(fOutputPorts[i])) != 0) {
+ for (int j = 0; connections[j]; j++) {
+ fConnections.push_back(make_pair(jack_port_name(fOutputPorts[i]), connections[j]));
+ }
+ jack_free(connections);
+ }
+ }
+}
+
+//------------------------------------------------------------------------
+void JackRouter::RestoreConnections()
+{
+ list<pair<string, string> >::const_iterator it;
+
+ for (it = fConnections.begin(); it != fConnections.end(); it++) {
+ pair<string, string> connection = *it;
+ jack_connect(fClient, connection.first.c_str(), connection.second.c_str());
+ }
+
+ fConnections.clear();
+}
+
+//------------------------------------------------------------------------------------------
+void JackRouter::AutoConnect()
+{
+ const char** ports;
+
+ if ((ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsOutput)) == NULL) {
+ printf("Cannot find any physical capture ports\n");
+ } else {
+ if (fAutoConnectIn) {
+ for (int i = 0; i < fActiveInputs; i++) {
+ if (!ports[i]) {
+ printf("source port is null i = %ld\n", i);
+ break;
+ } else if (jack_connect(fClient, ports[i], jack_port_name(fInputPorts[i])) != 0) {
+ printf("Cannot connect input ports\n");
+ }
+ }
+ }
+ jack_free(ports);
+ }
+
+ if ((ports = jack_get_ports(fClient, NULL, NULL, JackPortIsPhysical | JackPortIsInput)) == NULL) {
+ printf("Cannot find any physical playback ports");
+ } else {
+ if (fAutoConnectOut) {
+ for (int i = 0; i < fActiveOutputs; i++) {
+ if (!ports[i]){
+ printf("destination port is null i = %ld\n", i);
+ break;
+ } else if (jack_connect(fClient, jack_port_name(fOutputPorts[i]), ports[i]) != 0) {
+ printf("Cannot connect output ports\n");
+ }
+ }
+ }
+ jack_free(ports);
+ }
+}
+
diff --git a/windows/JackRouter/JackRouter.def b/windows/JackRouter/JackRouter.def
new file mode 100644
index 00000000..1316d71f
--- /dev/null
+++ b/windows/JackRouter/JackRouter.def
@@ -0,0 +1,9 @@
+LIBRARY JackRouter
+DESCRIPTION 'ASIO Jack Driver'
+PROTMODE
+EXPORTS
+ DllMain
+ DllGetClassObject
+ DllCanUnloadNow
+ DllRegisterServer
+ DllUnregisterServer
diff --git a/windows/JackRouter/JackRouter.dsp b/windows/JackRouter/JackRouter.dsp
new file mode 100644
index 00000000..c92ddf99
--- /dev/null
+++ b/windows/JackRouter/JackRouter.dsp
@@ -0,0 +1,163 @@
+# Microsoft Developer Studio Project File - Name="JackRouter" - Package Owner=<4>
+# Microsoft Developer Studio Generated Build File, Format Version 6.00
+# ** DO NOT EDIT **
+
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
+
+CFG=JackRouter - Win32 Debug
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,
+!MESSAGE use the Export Makefile command and run
+!MESSAGE
+!MESSAGE NMAKE /f "JackRouter.mak".
+!MESSAGE
+!MESSAGE You can specify a configuration when running NMAKE
+!MESSAGE by defining the macro CFG on the command line. For example:
+!MESSAGE
+!MESSAGE NMAKE /f "JackRouter.mak" CFG="JackRouter - Win32 Debug"
+!MESSAGE
+!MESSAGE Possible choices for configuration are:
+!MESSAGE
+!MESSAGE "JackRouter - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE "JackRouter - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
+!MESSAGE
+
+# Begin Project
+# PROP AllowPerConfigDependencies 0
+# PROP Scc_ProjName ""
+# PROP Scc_LocalPath ""
+CPP=cl.exe
+MTL=midl.exe
+RSC=rc.exe
+
+!IF "$(CFG)" == "JackRouter - Win32 Release"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 0
+# PROP BASE Output_Dir "Release"
+# PROP BASE Intermediate_Dir "Release"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 0
+# PROP Output_Dir "Release"
+# PROP Intermediate_Dir "Release"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\..\..\ASIOSDK2\common" /I "..\..\common" /I "..\..\common\jack" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "NDEBUG"
+# ADD RSC /l 0x409 /d "NDEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /machine:I386
+
+!ELSEIF "$(CFG)" == "JackRouter - Win32 Debug"
+
+# PROP BASE Use_MFC 0
+# PROP BASE Use_Debug_Libraries 1
+# PROP BASE Output_Dir "Debug"
+# PROP BASE Intermediate_Dir "Debug"
+# PROP BASE Target_Dir ""
+# PROP Use_MFC 0
+# PROP Use_Debug_Libraries 1
+# PROP Output_Dir "Debug"
+# PROP Intermediate_Dir "Debug"
+# PROP Ignore_Export_Lib 0
+# PROP Target_Dir ""
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
+# ADD CPP /nologo /G5 /MDd /W3 /Gm /GX /Zi /Od /I "..\..\..\..\..\ASIOSDK2\common" /I "..\..\common" /I "..\..\common\jack" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /GZ /c
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
+# ADD BASE RSC /l 0x409 /d "_DEBUG"
+# ADD RSC /l 0x409 /d "_DEBUG"
+BSC32=bscmake.exe
+# ADD BASE BSC32 /nologo
+# ADD BSC32 /nologo
+LINK32=link.exe
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib winmm.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"Debug/JackRouter_debug.dll" /pdbtype:sept
+
+!ENDIF
+
+# Begin Target
+
+# Name "JackRouter - Win32 Release"
+# Name "JackRouter - Win32 Debug"
+# Begin Group "Source Files"
+
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
+# Begin Source File
+
+SOURCE=..\..\..\..\..\ASIOSDK2\common\combase.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\..\ASIOSDK2\common\dllentry.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\JackRouter.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\JackRouter.def
+# End Source File
+# Begin Source File
+
+SOURCE=.\profport.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\..\..\ASIOSDK2\common\register.cpp
+# End Source File
+# Begin Source File
+
+SOURCE=.\resource.rc
+# End Source File
+# End Group
+# Begin Group "Header Files"
+
+# PROP Default_Filter "h;hpp;hxx;hm;inl"
+# Begin Source File
+
+SOURCE=..\..\..\common\asio.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\Common\Asiodrvr.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\asiosmpl.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\common\asiosys.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\common\combase.h
+# End Source File
+# Begin Source File
+
+SOURCE=..\..\..\common\iasiodrv.h
+# End Source File
+# End Group
+# Begin Group "Resource Files"
+
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+# End Group
+# Begin Source File
+
+SOURCE=.\Psapi.Lib
+# End Source File
+# Begin Source File
+
+SOURCE=..\Release\bin\libjack.lib
+# End Source File
+# End Target
+# End Project
diff --git a/windows/JackRouter/JackRouter.dsw b/windows/JackRouter/JackRouter.dsw
new file mode 100644
index 00000000..e26ab1ee
--- /dev/null
+++ b/windows/JackRouter/JackRouter.dsw
@@ -0,0 +1,29 @@
+Microsoft Developer Studio Workspace File, Format Version 6.00
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
+
+###############################################################################
+
+Project: "JackRouter"=".\JackRouter.dsp" - Package Owner=<4>
+
+Package=<5>
+{{{
+}}}
+
+Package=<4>
+{{{
+}}}
+
+###############################################################################
+
+Global:
+
+Package=<5>
+{{{
+}}}
+
+Package=<3>
+{{{
+}}}
+
+###############################################################################
+
diff --git a/windows/JackRouter/JackRouter.h b/windows/JackRouter/JackRouter.h
new file mode 100644
index 00000000..bf5d44c8
--- /dev/null
+++ b/windows/JackRouter/JackRouter.h
@@ -0,0 +1,174 @@
+/*
+Copyright (C) 2006 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
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef _asiosmpl_
+#define _asiosmpl_
+
+#include "asiosys.h"
+
+
+// Globals
+static int kBlockFrames = 256;
+static int kNumInputs = 4;
+static int kNumOutputs = 4;
+
+
+#if WINDOWS
+
+#include "jack.h"
+#include "rpc.h"
+#include "rpcndr.h"
+#ifndef COM_NO_WINDOWS_H
+#include <windows.h>
+#include "ole2.h"
+
+#endif
+
+#include "combase.h"
+#include "iasiodrv.h"
+
+#define MAX_PORTS 32
+
+#define LONG_SAMPLE 1
+
+#define PATH_SEP "\\"
+
+#include <list>
+#include <string>
+
+class JackRouter : public IASIO, public CUnknown
+{
+public:
+ JackRouter(LPUNKNOWN pUnk, HRESULT *phr);
+ ~JackRouter();
+
+ DECLARE_IUNKNOWN
+ //STDMETHODIMP QueryInterface(REFIID riid, void **ppv) { \
+ // return GetOwner()->QueryInterface(riid,ppv); \
+ //}; \
+ //STDMETHODIMP_(ULONG) AddRef() { \
+ // return GetOwner()->AddRef(); \
+ //}; \
+ //STDMETHODIMP_(ULONG) Release() { \
+ // return GetOwner()->Release(); \
+ //};
+
+ // Factory method
+ static CUnknown *CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
+ // IUnknown
+ virtual HRESULT STDMETHODCALLTYPE NonDelegatingQueryInterface(REFIID riid,void **ppvObject);
+#else
+
+#include "asiodrvr.h"
+
+
+//---------------------------------------------------------------------------------------------
+class JackRouter : public AsioDriver
+{
+public:
+ JackRouter();
+ ~JackRouter();
+#endif
+
+ static int process(jack_nframes_t nframes, void* arg);
+ static void shutdown(void* arg);
+
+ ASIOBool init(void* sysRef);
+ void getDriverName(char *name); // max 32 bytes incl. terminating zero
+ long getDriverVersion();
+ void getErrorMessage(char *string); // max 128 bytes incl.
+
+ ASIOError start();
+ ASIOError stop();
+
+ ASIOError getChannels(long *numInputChannels, long *numOutputChannels);
+ ASIOError getLatencies(long *inputLatency, long *outputLatency);
+ ASIOError getBufferSize(long *minSize, long *maxSize,
+ long *preferredSize, long *granularity);
+
+ ASIOError canSampleRate(ASIOSampleRate sampleRate);
+ ASIOError getSampleRate(ASIOSampleRate *sampleRate);
+ ASIOError setSampleRate(ASIOSampleRate sampleRate);
+ ASIOError getClockSources(ASIOClockSource *clocks, long *numSources);
+ ASIOError setClockSource(long index);
+
+ ASIOError getSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp);
+ ASIOError getChannelInfo(ASIOChannelInfo *info);
+
+ ASIOError createBuffers(ASIOBufferInfo *bufferInfos, long numChannels,
+ long bufferSize, ASIOCallbacks *callbacks);
+ ASIOError disposeBuffers();
+
+ ASIOError controlPanel();
+ ASIOError future(long selector, void *opt);
+ ASIOError outputReady();
+
+ void bufferSwitch();
+ long getMilliSeconds() {return fMilliSeconds;}
+
+ static bool fFirstActivate;
+ static std::list<std::pair<std::string, std::string> > fConnections; // Connections list
+
+private:
+
+ void bufferSwitchX();
+
+ double fSamplePosition;
+ ASIOCallbacks* fCallbacks;
+ ASIOTime fAsioTime;
+ ASIOTimeStamp fTheSystemTime;
+
+#ifdef LONG_SAMPLE
+ long* fInputBuffers[MAX_PORTS * 2];
+ long* fOutputBuffers[MAX_PORTS * 2];
+#else
+ float* fInputBuffers[MAX_PORTS * 2];
+ float* fOutputBuffers[MAX_PORTS * 2];
+#endif
+ long fInMap[MAX_PORTS];
+ long fOutMap[MAX_PORTS];
+
+ long fInputLatency;
+ long fOutputLatency;
+ long fActiveInputs;
+ long fActiveOutputs;
+ long fToggle;
+ long fMilliSeconds;
+ bool fActive, fStarted;
+ bool fTimeInfoMode, fTcRead;
+ char fErrorMessage[128];
+
+ bool fAutoConnectIn;
+ bool fAutoConnectOut;
+
+ // Jack part
+ jack_client_t* fClient;
+ jack_port_t* fInputPorts[MAX_PORTS];
+ jack_port_t* fOutputPorts[MAX_PORTS];
+ long fBufferSize;
+ ASIOSampleRate fSampleRate;
+
+ void AutoConnect();
+ void SaveConnections();
+ void RestoreConnections();
+
+};
+
+#endif
+
diff --git a/windows/JackRouter/Psapi.Lib b/windows/JackRouter/Psapi.Lib
new file mode 100644
index 00000000..ae896911
--- /dev/null
+++ b/windows/JackRouter/Psapi.Lib
Binary files differ
diff --git a/windows/JackRouter/README b/windows/JackRouter/README
new file mode 100644
index 00000000..5f2bce1d
--- /dev/null
+++ b/windows/JackRouter/README
@@ -0,0 +1,3 @@
+This folder contains the sources for ASIO/JACK bridge ASIO driver called "JackRouter". The included project is a Microsoft VC++ 6 one.
+It requires some files (combase.cpp, dllentry.cpp, register.cpp) that are part on the ASIO driver SDK. The produced "JackRouter.dll" file
+has to be registered in the system using the "regsvr32" tool. \ No newline at end of file
diff --git a/windows/JackRouter/profport.cpp b/windows/JackRouter/profport.cpp
new file mode 100644
index 00000000..eb77937f
--- /dev/null
+++ b/windows/JackRouter/profport.cpp
@@ -0,0 +1,315 @@
+/*
+History :
+01-28-02 : Change the location of temporary files created in write_private_profile_string
+ now done in TmpDirectory.
+01-29-02 : Correct bug when the '=' character is not present.
+06-18-02 : Return default value if file does not exist, new write_private_profile_int function.
+*/
+
+/***** Routines to read profile strings -- by Joseph J. Graf ******/
+/***** corrections and improvements -- by D. Fober - Grame ******/
+/*
+ corrections: buffer sizes control
+ improvements: behavior more similar to windows
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+
+#include <string>
+
+#include <ctype.h>
+#include "profport.h" /* function prototypes in here */
+
+#ifndef WIN32
+
+static int read_line (FILE *fp, char *bp, int size);
+static int read_section(FILE *fp, char *section);
+static int read_entry (FILE *fp, char *entry, char *buff, int size);
+static char * read_value (char *buff);
+static int read_int_value (char *buff, int def);
+static char * read_file (char *file);
+static char * str_search (char * buff, char * str, int stopCond);
+
+/*****************************************************************
+* Function: read_line()
+* Arguments: <FILE *> fp - a pointer to the file to be read from
+* <char *> bp - a pointer to the copy buffer
+* <int> size - size of the copy buffer
+* Returns: the line length if successful -1 otherwise
+******************************************************************/
+static int read_line(FILE *fp, char *bp, int size)
+{
+ char c = '\0';
+ int i = 0, limit = size-2;
+
+ /* Read one line from the source file */
+ while (((c = getc(fp)) != '\n') && (i < limit)) {
+ if (c == EOF) {
+ if (!i) return -1;
+ else break;
+ }
+ bp[i++] = c;
+ }
+ bp[i] = '\0';
+ return i;
+}
+
+static int read_section (FILE *fp, char *section)
+{
+ char buff[MAX_LINE_LENGTH];
+ char t_section[MAX_LINE_LENGTH];
+ int n, slen;
+
+ sprintf(t_section,"[%s]", section); /* Format the section name */
+ slen = strlen (t_section);
+ /* Move through file 1 line at a time until a section is matched or EOF */
+ do {
+ n = read_line(fp, buff, MAX_LINE_LENGTH);
+ if (n == -1)
+ return 0;
+ } while (strncmp (buff,t_section, slen));
+ return 1;
+ }
+
+static int read_entry (FILE *fp, char *entry, char *buff, int size)
+{
+ int n, elen = strlen (entry);
+
+ do {
+ n = read_line(fp, buff, size);
+ if (n == -1)
+ return 0;
+ else if (*buff == '[')
+ return 0;
+ } while (strncmp (buff, entry, elen));
+ return 1;
+ }
+
+#define isBlank(c) ((c == ' ') || (c == '\t'))
+static char * read_value (char *buff)
+{
+ char * eq = strrchr (buff,'='); /* Parse out the equal sign */
+ if (eq) {
+ eq++;
+ while (*eq && isBlank(*eq))
+ eq++;
+// return *eq ? eq : 0;
+ return eq;
+ }
+ return eq;
+ }
+
+#define isSignedDigit(c) (isdigit(c) || (c == '+') || (c == '-'))
+static int read_int_value (char *buff, int def)
+{
+ char * val = read_value (buff);
+ char value[20]; int i;
+
+ if (!*val) return def;
+
+ for (i = 0; isSignedDigit(*val) && (i <= 10); i++ )
+ value[i] = *val++;
+ value[i] = '\0';
+ return value[0] ? atoi(value) : def;
+}
+
+static char * read_file (char *file)
+{
+ FILE *fd = fopen (file,"r");
+ int size; char * buff = 0;
+
+ if (!fd) return 0;
+ if (fseek (fd, 0, SEEK_END) == -1) goto err;
+ size = ftell (fd);
+ if (size < 0) goto err;
+ if (fseek (fd, 0, SEEK_SET) == -1) goto err;
+ buff = (char *) malloc (size+1);
+ if (buff) {
+ *buff = 0;
+ fread (buff, 1, size, fd);
+ buff[size] = 0;
+ }
+err:
+ fclose (fd);
+ return buff;
+}
+
+static char * str_search (char * buff, char * str, int stopCond)
+{
+ char *ptr = buff;
+ int len = strlen (str);
+ while (*ptr && strncmp (ptr, str, len)) {
+ while (*ptr && (*ptr++ != '\n'))
+ ;
+ if (*ptr == stopCond)
+ return 0;
+ }
+ return *ptr ? ptr : 0;
+}
+
+/**************************************************************************
+* Function: get_private_profile_int()
+* Arguments: <char *> section - the name of the section to search for
+* <char *> entry - the name of the entry to find the value of
+* <int> def - the default value in the event of a failed read
+* <char *> file_name - the name of the .ini file to read from
+* Returns: the value located at entry
+***************************************************************************/
+int get_private_profile_int(char *section,
+ char *entry, int def, char *file_name)
+{
+ FILE *fp = fopen(file_name,"r");
+ char buff[MAX_LINE_LENGTH];
+
+ if( !fp ) return def; /* Return default value if file does not exist */
+ if (!read_section (fp, section)) goto err;
+ if (!read_entry (fp, entry, buff, MAX_LINE_LENGTH)) goto err;
+ def = read_int_value (buff, def);
+err:
+ fclose (fp);
+ return def;
+}
+
+/**************************************************************************
+* Function: get_private_profile_string()
+* Arguments: <char *> section - the name of the section to search for
+* <char *> entry - the name of the entry to find the value of
+* <char *> def - default string in the event of a failed read
+* <char *> buffer - a pointer to the buffer to copy into
+* <int> buffer_len - the max number of characters to copy
+* <char *> file_name - the name of the .ini file to read from
+* Returns: the number of characters copied into the supplied buffer
+***************************************************************************/
+
+int get_private_profile_string(char *section, char *entry, char *def,
+ char *buffer, int buffer_len, char *file_name)
+{
+ FILE *fp = fopen (file_name,"r");
+ char buff[MAX_LINE_LENGTH];
+ char *val;
+
+ if( !fp ) goto err; /* Return default value if file does not exist */
+ if (!read_section (fp, section)) goto err;
+ if (!read_entry (fp, entry, buff, MAX_LINE_LENGTH)) goto err;
+ val = read_value (buff);
+ if(val) def = val;
+
+err:
+ if (fp) fclose (fp);
+ if (def) {
+ strncpy (buffer, def, buffer_len - 1);
+ buffer[buffer_len] = '\0';
+ }
+ else buffer[buffer_len] = '\0';
+ return strlen (buffer);
+}
+
+
+/***************************************************************************
+ * Function: write_private_profile_string()
+ * Arguments: <char *> section - the name of the section to search for
+ * <char *> entry - the name of the entry to find the value of
+ * <char *> buffer - pointer to the buffer that holds the string
+ * <char *> file_name - the name of the .ini file to read from
+ * Returns: TRUE if successful, otherwise FALSE
+ ***************************************************************************/
+int write_private_profile_string(char *section,
+ char *entry, char *buffer, char *file_name)
+
+{
+ char * content = read_file(file_name);
+ FILE * fd = fopen(file_name,"w");
+ char t_section[MAX_LINE_LENGTH], *ptr;
+ int ret = 0;
+
+ if (!fd) goto end;
+ if (!content) {
+ fprintf (fd, "[%s]\n%s = %s\n", section, entry, buffer);
+ ret = 1;
+ goto end;
+ }
+ sprintf(t_section,"[%s]",section); /* Format the section name */
+ ptr = str_search (content, t_section, 0); /* look for the section start */
+ if (!ptr) {
+ /* no such section: add the new section at end of file */
+ fprintf (fd, "%s\n[%s]\n%s = %s\n", content, section, entry, buffer);
+ }
+ else {
+ char * eptr;
+ eptr = str_search (ptr, entry, '[');
+ if (!eptr) {
+ /* no such entry: looks for next section */
+ eptr = str_search (++ptr, "[", 0);
+ if (!eptr) {
+ /* section is the last one */
+ fprintf (fd, "%s\n%s = %s\n", content, entry, buffer);
+ }
+ else {
+ while (*ptr && (*ptr != '\n')) ptr++;
+ *ptr = 0;
+ fprintf (fd, "%s\n%s = %s", content, entry, buffer);
+ *ptr = '\n';
+ fprintf (fd, "%s", ptr);
+ }
+ }
+ else {
+ *eptr++ = 0;
+ fprintf (fd, "%s%s = %s", content, entry, buffer);
+ while (*eptr && (*eptr != '\n')) eptr++;
+ if (eptr) fprintf (fd, "%s", eptr);
+ }
+ }
+ ret = 1;
+
+end:
+ if (content) free(content);
+ if (fd) fclose(fd);
+ return 0;
+}
+
+/***************************************************************************
+ * Function: write_private_profile_int()
+ * Arguments: <char *> section - the name of the section to search for
+ * <char *> entry - the name of the entry to find the value of
+ * <int> buffer - the value to be written
+ * <char *> file_name - the name of the .ini file to read from
+ * Returns: TRUE if successful, otherwise FALSE
+ ***************************************************************************/
+int write_private_profile_int(char *section,
+ char *entry, int val, char *file_name)
+{
+ char buffer [64];
+ sprintf(buffer, "%d", val);
+ return write_private_profile_string (section,entry, buffer, file_name);
+}
+
+#endif // #ifndef WIN32
+
+
+/**************************************************************************
+* Function: get_private_profile_float()
+* Arguments: <char *> section - the name of the section to search for
+* <char *> entry - the name of the entry to find the value of
+* <float> def - the default value in the event of a failed read
+* <char *> file_name - the name of the .ini file to read from
+* Returns: the value located at entry
+* Warning: The float value to be read must not contain more than 100 digits.
+* Author: CD, 15/11/2006.
+***************************************************************************/
+#define maxFloatLen 100
+float get_private_profile_float (char * section, char * entry, float def, char * file_name)
+{
+ float result = def;
+ char buffer[ maxFloatLen ], *endptr;
+
+ if ( get_private_profile_string(section, entry, "", buffer, maxFloatLen, file_name) > 0 )
+ {
+ result = (float)strtod(buffer, &endptr);
+ if ((result==0) && (endptr==buffer))
+ result = def;
+ }
+ return result;
+}
diff --git a/windows/JackRouter/profport.h b/windows/JackRouter/profport.h
new file mode 100644
index 00000000..2f717177
--- /dev/null
+++ b/windows/JackRouter/profport.h
@@ -0,0 +1,37 @@
+
+/******************************************************************************
+ PORTABLE ROUTINES FOR WRITING PRIVATE PROFILE STRINGS -- by Joseph J. Graf
+ Header file containing prototypes and compile-time configuration.
+
+ [09/05/02] D. Fober - Windows definitions added
+******************************************************************************/
+
+#ifndef __profport__
+#define __profport__
+
+#define MAX_LINE_LENGTH 1024
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef WIN32
+#include "Windows.h"
+#define get_private_profile_int GetPrivateProfileInt
+#define get_private_profile_string GetPrivateProfileString
+#define write_private_profile_string WritePrivateProfileString
+#define write_private_profile_int WritePrivateProfileInt
+#else
+int get_private_profile_int (char * section, char * entry, int def, char * file_name);
+int get_private_profile_string (char * section, char * entry, char * def, char * buffer, int buffer_len, char * file_name);
+int write_private_profile_string (char * section, char * entry, char * buffer, char * file_name);
+int write_private_profile_int (char * section, char * entry, int val, char * file_name);
+#endif
+
+float get_private_profile_float (char * section, char * entry, float def, char * file_name);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //__profport__
diff --git a/windows/JackRouter/psapi.dll b/windows/JackRouter/psapi.dll
new file mode 100644
index 00000000..ff4c964c
--- /dev/null
+++ b/windows/JackRouter/psapi.dll
Binary files differ
diff --git a/windows/JackRouter/psapi.h b/windows/JackRouter/psapi.h
new file mode 100644
index 00000000..af72931e
--- /dev/null
+++ b/windows/JackRouter/psapi.h
@@ -0,0 +1,95 @@
+/*
+ psapi.h - Include file for PSAPI.DLL APIs
+
+ Written by Mumit Khan <khan@nanotech.wisc.edu>
+
+ This file is part of a free library for the Win32 API.
+
+ NOTE: This strictly does not belong in the Win32 API since it's
+ really part of Platform SDK. However,GDB needs it and we might
+ as well provide it here.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+*/
+#ifndef _PSAPI_H
+#define _PSAPI_H
+#if __GNUC__ >=3
+#pragma GCC system_header
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef RC_INVOKED
+
+typedef struct _MODULEINFO {
+ LPVOID lpBaseOfDll;
+ DWORD SizeOfImage;
+ LPVOID EntryPoint;
+} MODULEINFO,*LPMODULEINFO;
+
+typedef struct _PSAPI_WS_WATCH_INFORMATION {
+ LPVOID FaultingPc;
+ LPVOID FaultingVa;
+} PSAPI_WS_WATCH_INFORMATION,*PPSAPI_WS_WATCH_INFORMATION;
+
+typedef struct _PROCESS_MEMORY_COUNTERS {
+ DWORD cb;
+ DWORD PageFaultCount;
+ DWORD PeakWorkingSetSize;
+ DWORD WorkingSetSize;
+ DWORD QuotaPeakPagedPoolUsage;
+ DWORD QuotaPagedPoolUsage;
+ DWORD QuotaPeakNonPagedPoolUsage;
+ DWORD QuotaNonPagedPoolUsage;
+ DWORD PagefileUsage;
+ DWORD PeakPagefileUsage;
+} PROCESS_MEMORY_COUNTERS,*PPROCESS_MEMORY_COUNTERS;
+
+/* Grouped by application,not in alphabetical order. */
+BOOL WINAPI EnumProcesses(DWORD *,DWORD,DWORD *);
+BOOL WINAPI EnumProcessModules(HANDLE,HMODULE *,DWORD,LPDWORD);
+DWORD WINAPI GetModuleBaseNameA(HANDLE,HMODULE,LPSTR,DWORD);
+DWORD WINAPI GetModuleBaseNameW(HANDLE,HMODULE,LPWSTR,DWORD);
+DWORD WINAPI GetModuleFileNameExA(HANDLE,HMODULE,LPSTR,DWORD);
+DWORD WINAPI GetModuleFileNameExW(HANDLE,HMODULE,LPWSTR,DWORD);
+BOOL WINAPI GetModuleInformation(HANDLE,HMODULE,LPMODULEINFO,DWORD);
+BOOL WINAPI EmptyWorkingSet(HANDLE);
+BOOL WINAPI QueryWorkingSet(HANDLE,PVOID,DWORD);
+BOOL WINAPI InitializeProcessForWsWatch(HANDLE);
+BOOL WINAPI GetWsChanges(HANDLE,PPSAPI_WS_WATCH_INFORMATION,DWORD);
+DWORD WINAPI GetMappedFileNameW(HANDLE,LPVOID,LPWSTR,DWORD);
+DWORD WINAPI GetMappedFileNameA(HANDLE,LPVOID,LPSTR,DWORD);
+BOOL WINAPI EnumDeviceDrivers(LPVOID *,DWORD,LPDWORD);
+DWORD WINAPI GetDeviceDriverBaseNameA(LPVOID,LPSTR,DWORD);
+DWORD WINAPI GetDeviceDriverBaseNameW(LPVOID,LPWSTR,DWORD);
+DWORD WINAPI GetDeviceDriverFileNameA(LPVOID,LPSTR,DWORD);
+DWORD WINAPI GetDeviceDriverFileNameW(LPVOID,LPWSTR,DWORD);
+BOOL WINAPI GetProcessMemoryInfo(HANDLE,PPROCESS_MEMORY_COUNTERS,DWORD);
+
+#endif /* not RC_INVOKED */
+
+#ifdef UNICODE
+#define GetModuleBaseName GetModuleBaseNameW
+#define GetModuleFileNameEx GetModuleFileNameExW
+#define GetMappedFilenameEx GetMappedFilenameExW
+#define GetDeviceDriverBaseName GetDeviceDriverBaseNameW
+#define GetDeviceDriverFileName GetDeviceDriverFileNameW
+#else
+#define GetModuleBaseName GetModuleBaseNameA
+#define GetModuleFileNameEx GetModuleFileNameExA
+#define GetMappedFilenameEx GetMappedFilenameExA
+#define GetDeviceDriverBaseName GetDeviceDriverBaseNameA
+#define GetDeviceDriverFileName GetDeviceDriverFileNameA
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _PSAPI_H */
+
diff --git a/windows/JackRouter/resource.h b/windows/JackRouter/resource.h
new file mode 100644
index 00000000..673206e6
--- /dev/null
+++ b/windows/JackRouter/resource.h
@@ -0,0 +1,15 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Developer Studio generated include file.
+// Used by resource.rc
+//
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1000
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/windows/JackRouter/resource.rc b/windows/JackRouter/resource.rc
new file mode 100644
index 00000000..4289ddc2
--- /dev/null
+++ b/windows/JackRouter/resource.rc
@@ -0,0 +1,109 @@
+//Microsoft Developer Studio generated resource script.
+//
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "afxres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// French (France) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA)
+#ifdef _WIN32
+LANGUAGE LANG_FRENCH, SUBLANG_FRENCH
+#pragma code_page(1252)
+#endif //_WIN32
+
+#ifndef _MAC
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION 0,2,0,0
+ PRODUCTVERSION 0,2,0,0
+ FILEFLAGSMASK 0x3fL
+#ifdef _DEBUG
+ FILEFLAGS 0x1L
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS 0x40004L
+ FILETYPE 0x2L
+ FILESUBTYPE 0x0L
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040c04b0"
+ BEGIN
+ VALUE "Comments", "\0"
+ VALUE "CompanyName", "Grame\0"
+ VALUE "FileDescription", "JackRouter ASIO driver\0"
+ VALUE "FileVersion", "0, 2, 0, 0\0"
+ VALUE "InternalName", "JackRouter\0"
+ VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
+ VALUE "LegalTrademarks", "\0"
+ VALUE "OriginalFilename", "JackRouter.dll\0"
+ VALUE "PrivateBuild", "\0"
+ VALUE "ProductName", "JackRouter\0"
+ VALUE "ProductVersion", "0, 2, 0, 0\0"
+ VALUE "SpecialBuild", "\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x40c, 1200
+ END
+END
+
+#endif // !_MAC
+
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "resource.h\0"
+END
+
+2 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "#include ""afxres.h""\r\n"
+ "\0"
+END
+
+3 TEXTINCLUDE DISCARDABLE
+BEGIN
+ "\r\n"
+ "\0"
+END
+
+#endif // APSTUDIO_INVOKED
+
+#endif // French (France) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif // not APSTUDIO_INVOKED
+
diff --git a/windows/Setup/JackRouter.dll b/windows/Setup/JackRouter.dll
index 226ea667..f06fe1b6 100644
--- a/windows/Setup/JackRouter.dll
+++ b/windows/Setup/JackRouter.dll
Binary files differ
diff --git a/windows/Setup/jack.ci b/windows/Setup/jack.ci
index 66ef7114..25233392 100644
--- a/windows/Setup/jack.ci
+++ b/windows/Setup/jack.ci
@@ -73,7 +73,7 @@
<_><src>..\Release\bin\portaudio_x86.dll</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
<_><src>..\Release\bin\jack\jack_net.dll</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
<_><src>..\Release\bin\jack\jack_netone.dll</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
-<_><src>..\Release\bin\jack\jack_netsource.exe</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
+<_><src>..\Release\bin\jack_netsource.exe</><dest>inst</><custom></><ifexist>overnewer</><recurs>0</></>
<_><src>..\Release\bin\jack\jack_dummy.dll</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
<_><src>..\Release\bin\jack\jack_loopback.dll</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
<_><src>..\Release\bin\jack\jack_winmme.dll</><dest>inst</><custom>jack</><ifexist>overnewer</><recurs>0</></>
diff --git a/windows/jack_netsource.cbp b/windows/jack_netsource.cbp
index dd5f99e7..ddfe02e8 100644
--- a/windows/jack_netsource.cbp
+++ b/windows/jack_netsource.cbp
@@ -1,113 +1,110 @@
-<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-<CodeBlocks_project_file>
- <FileVersion major="1" minor="6" />
- <Project>
- <Option title="jack_netsource" />
- <Option pch_mode="2" />
- <Option compiler="gcc" />
- <Build>
- <Target title="Win32 Release">
- <Option output="Release\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
- <Option object_output="Release\" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- <Add option="-Wall" />
- <Add directory="..\example-clients" />
- <Add directory="..\windows" />
- <Add directory="..\common\jack" />
- <Add directory="..\common" />
- </Compiler>
- <Linker>
- <Add directory="Release\bin" />
- </Linker>
- </Target>
- <Target title="Win32 Debug">
- <Option output="Debug\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
- <Option object_output="Debug\" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-Wall" />
- <Add option="-g" />
- <Add directory="..\example-clients" />
- <Add directory="..\windows" />
- <Add directory="..\common\jack" />
- <Add directory="..\common" />
- </Compiler>
- <Linker>
- <Add directory="Debug\bin" />
- </Linker>
- </Target>
- <Target title="Win32 Profiling">
- <Option output="Release\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
- <Option object_output="Release\" />
- <Option type="1" />
- <Option compiler="gcc" />
- <Compiler>
- <Add option="-O2" />
- <Add option="-Wall" />
- <Add option="-DJACK_MONITOR" />
- <Add directory="..\example-clients" />
- <Add directory="..\windows" />
- <Add directory="..\common\jack" />
- <Add directory="..\common" />
- </Compiler>
- <Linker>
- <Add directory="Release\bin" />
- </Linker>
- </Target>
- </Build>
- <Compiler>
- <Add option="-Wall" />
- <Add directory="..\example-clients" />
- <Add directory="..\windows" />
- <Add directory="..\common\jack" />
- <Add directory="..\common" />
- </Compiler>
- <Linker>
- <Add library="kernel32" />
- <Add library="user32" />
- <Add library="gdi32" />
- <Add library="winspool" />
- <Add library="comdlg32" />
- <Add library="advapi32" />
- <Add library="shell32" />
- <Add library="ole32" />
- <Add library="oleaut32" />
- <Add library="uuid" />
- <Add library="odbc32" />
- <Add library="odbccp32" />
- <Add library="libjack" />
- <Add library="libsamplerate-0" />
- <Add library="ws2_32" />
- <Add directory="Release\bin" />
- </Linker>
- <Unit filename="..\common\netjack_packet.c">
- <Option compilerVar="CC" />
- </Unit>
- <Unit filename="..\example-clients\netsource.c">
- <Option compilerVar="CC" />
- </Unit>
- <Unit filename="getopt.c">
- <Option compilerVar="CC" />
- </Unit>
- <Unit filename="getopt1.c">
- <Option compilerVar="CC" />
- </Unit>
- <Unit filename="jack_netsource.rc">
- <Option compilerVar="WINDRES" />
- </Unit>
- <Extensions>
- <code_completion />
- <envvars />
- <debugger />
- <AutoVersioning>
- <Scheme minor_max="10" build_max="0" rev_max="0" rev_rand_max="10" build_times_to_increment_minor="100" />
- <Settings autoincrement="1" date_declarations="1" do_auto_increment="0" ask_to_increment="0" language="C++" svn="0" svn_directory="" header_path="version.h" />
- <Changes_Log show_changes_editor="0" app_title="released version %M.%m.%b of %p" changeslog_path="ChangesLog.txt" />
- </AutoVersioning>
- </Extensions>
- </Project>
-</CodeBlocks_project_file>
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<CodeBlocks_project_file>
+ <FileVersion major="1" minor="6" />
+ <Project>
+ <Option title="jack_netsource" />
+ <Option pch_mode="2" />
+ <Option compiler="gcc" />
+ <Build>
+ <Target title="Win32 Release">
+ <Option output="Release\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
+ <Option object_output="Release\" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-O2" />
+ <Add option="-Wall" />
+ <Add directory="..\example-clients" />
+ <Add directory="..\windows" />
+ <Add directory="..\common\jack" />
+ <Add directory="..\common" />
+ </Compiler>
+ <Linker>
+ <Add directory="Release\bin" />
+ </Linker>
+ </Target>
+ <Target title="Win32 Debug">
+ <Option output="Debug\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
+ <Option object_output="Debug\" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-Wall" />
+ <Add option="-g" />
+ <Add directory="..\example-clients" />
+ <Add directory="..\windows" />
+ <Add directory="..\common\jack" />
+ <Add directory="..\common" />
+ </Compiler>
+ <Linker>
+ <Add directory="Debug\bin" />
+ </Linker>
+ </Target>
+ <Target title="Win32 Profiling">
+ <Option output="Release\bin\jack_netsource" prefix_auto="1" extension_auto="1" />
+ <Option object_output="Release\" />
+ <Option type="1" />
+ <Option compiler="gcc" />
+ <Compiler>
+ <Add option="-O2" />
+ <Add option="-Wall" />
+ <Add option="-DJACK_MONITOR" />
+ <Add directory="..\example-clients" />
+ <Add directory="..\windows" />
+ <Add directory="..\common\jack" />
+ <Add directory="..\common" />
+ </Compiler>
+ <Linker>
+ <Add directory="Release\bin" />
+ </Linker>
+ </Target>
+ </Build>
+ <Compiler>
+ <Add option="-Wall" />
+ <Add directory="..\example-clients" />
+ <Add directory="..\windows" />
+ <Add directory="..\common\jack" />
+ <Add directory="..\common" />
+ </Compiler>
+ <Linker>
+ <Add library="kernel32" />
+ <Add library="user32" />
+ <Add library="gdi32" />
+ <Add library="winspool" />
+ <Add library="comdlg32" />
+ <Add library="advapi32" />
+ <Add library="shell32" />
+ <Add library="ole32" />
+ <Add library="oleaut32" />
+ <Add library="uuid" />
+ <Add library="odbc32" />
+ <Add library="odbccp32" />
+ <Add library="libjack" />
+ <Add library="libsamplerate-0" />
+ <Add library="ws2_32" />
+ <Add directory="Release\bin" />
+ </Linker>
+ <Unit filename="..\common\netjack_packet.c">
+ <Option compilerVar="CC" />
+ </Unit>
+ <Unit filename="..\example-clients\netsource.c">
+ <Option compilerVar="CC" />
+ </Unit>
+ <Unit filename="getopt.c">
+ <Option compilerVar="CC" />
+ </Unit>
+ <Unit filename="getopt1.c">
+ <Option compilerVar="CC" />
+ </Unit>
+ <Extensions>
+ <code_completion />
+ <envvars />
+ <debugger />
+ <AutoVersioning>
+ <Scheme minor_max="10" build_max="0" rev_max="0" rev_rand_max="10" build_times_to_increment_minor="100" />
+ <Settings autoincrement="1" date_declarations="1" do_auto_increment="0" ask_to_increment="0" language="C++" svn="0" svn_directory="" header_path="version.h" />
+ <Changes_Log show_changes_editor="0" app_title="released version %M.%m.%b of %p" changeslog_path="ChangesLog.txt" />
+ </AutoVersioning>
+ </Extensions>
+ </Project>
+</CodeBlocks_project_file>
diff --git a/windows/jack_netsource.rc b/windows/jack_netsource.rc
deleted file mode 100644
index efc71b7e..00000000
--- a/windows/jack_netsource.rc
+++ /dev/null
@@ -1,48 +0,0 @@
-// Generated by ResEdit 1.4.3
-// Copyright (C) 2006-2008
-// http://www.resedit.net
-
-#include "resource.h"
-#include "afxres.h"
-
-
-//
-// Version Information resources
-//
-LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
-1 VERSIONINFO
- FILEVERSION 1,9,5,0
- PRODUCTVERSION 1,9,5,0
- FILEOS VOS_UNKNOWN
- FILETYPE VFT_APP
-BEGIN
- BLOCK "StringFileInfo"
- BEGIN
- BLOCK "040c04b0"
- BEGIN
- VALUE "Comments", "\0"
- VALUE "CompanyName", "Grame\0"
- VALUE "FileDescription", "JackNetOne netsource for Windows\0"
- VALUE "FileVersion", "1, 9, 5, 0\0"
- VALUE "InternalName", "netsource\0"
- VALUE "LegalCopyright", "Copyright Grame © 2006-2009\0"
- VALUE "LegalTrademarks", "\0"
- VALUE "OriginalFilename", "jack_netsource.exe\0"
- VALUE "PrivateBuild", "\0"
- VALUE "ProductName", "jack_netsource\0"
- VALUE "ProductVersion", "1, 9, 5, 0\0"
- VALUE "SpecialBuild", "\0"
- END
- END
- BLOCK "VarFileInfo"
- BEGIN
- VALUE "Translation", 1036, 1200
- END
-END
-
-
-//
-// Icon resources
-//
-LANGUAGE LANG_FRENCH, SUBLANG_DEFAULT
-IDI_ICON1 ICON ".\\Setup\\src\\jack.ico"
diff --git a/wscript b/wscript
index f5c0d488..33469397 100644
--- a/wscript
+++ b/wscript
@@ -112,6 +112,8 @@ def configure(conf):
conf.sub_config('linux')
if Options.options.dbus:
conf.sub_config('dbus')
+ if conf.env['BUILD_JACKDBUS'] != True:
+ conf.fatal('jackdbus was explicitly requested but cannot be built')
conf.sub_config('example-clients')
if conf.check_cfg(package='celt', atleast_version='0.7.0', args='--cflags --libs'):
@@ -136,7 +138,6 @@ def configure(conf):
conf.env['BUILD_DOXYGEN_DOCS'] = Options.options.doxygen
conf.env['BUILD_WITH_PROFILE'] = Options.options.profile
conf.env['BUILD_WITH_32_64'] = Options.options.mixed
- conf.env['BUILD_JACKDBUS'] = Options.options.dbus
conf.env['BUILD_CLASSIC'] = Options.options.classic
conf.env['BUILD_DEBUG'] = Options.options.debug
@@ -203,8 +204,9 @@ def configure(conf):
display_feature('Build D-Bus JACK (jackdbus)', conf.env['BUILD_JACKDBUS'])
if conf.env['BUILD_JACKDBUS'] and conf.env['BUILD_JACKD']:
- print Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues!' + Logs.colors.NORMAL
-
+ print Logs.colors.RED + 'WARNING !! mixing both jackd and jackdbus may cause issues:' + Logs.colors.NORMAL
+ print Logs.colors.RED + 'WARNING !! jackdbus does not use .jackdrc nor qjackctl settings' + Logs.colors.NORMAL
+
if conf.env['IS_LINUX']:
display_feature('Build with ALSA support', conf.env['BUILD_DRIVER_ALSA'] == True)
display_feature('Build with FireWire (FreeBob) support', conf.env['BUILD_DRIVER_FREEBOB'] == True)