diff --git a/common/jack/jack.h b/common/jack/jack.h
index 5eb8e166..a3ee3f03 100644
--- a/common/jack/jack.h
+++ b/common/jack/jack.h
@@ -1010,7 +1010,7 @@ size_t jack_port_type_get_buffer_size (jack_client_t *client, const char *port_t
* latency values associated with them, both measured in frames:
*
* capture latency: how long since the data read from
- * the buffer of a port arrived at at
+ * the buffer of a port arrived at
* a port marked with JackPortIsTerminal.
* The data will have come from the "outside
* world" if the terminal port is also
diff --git a/macosx/coremidi/JackCoreMidiDriver.cpp b/macosx/coremidi/JackCoreMidiDriver.cpp
index df8bd065..dcefef44 100644
--- a/macosx/coremidi/JackCoreMidiDriver.cpp
+++ b/macosx/coremidi/JackCoreMidiDriver.cpp
@@ -112,7 +112,6 @@ bool JackCoreMidiDriver::OpenAux()
OSStatus status = MIDIClientCreate(name, HandleNotificationEvent, this,
&client);
-
CFRelease(name);
if (status != noErr) {
@@ -246,7 +245,6 @@ bool JackCoreMidiDriver::OpenAux()
}
}
-
if (! (pi_count || po_count || in_channels || out_channels)) {
jack_error("JackCoreMidiDriver::Open - no CoreMIDI inputs or outputs "
"found, and no virtual ports allocated.");
@@ -522,7 +520,6 @@ void
JackCoreMidiDriver::Restart()
{
JackLock lock(this);
-
SaveConnections();
Stop();
Detach();
@@ -538,16 +535,27 @@ JackCoreMidiDriver::HandleNotification(const MIDINotification *message)
{
switch (message->messageID) {
- case kMIDIMsgSetupChanged:
- Restart();
- break;
-
- case kMIDIMsgObjectAdded:
+ case kMIDIMsgObjectAdded: {
+ /*
+ We don't want to restart when our internal virtual in/out are created.
+ */
+ const MIDIObjectAddRemoveNotification* add_message = reinterpret_cast(message);
+ if (!JackCoreMidiPort::IsInternalPort(add_message->child)) {
+ Restart();
+ }
break;
-
- case kMIDIMsgObjectRemoved:
+ }
+
+ case kMIDIMsgObjectRemoved: {
+ /*
+ We don't want to restart when our internal virtual in/out are created.
+ */
+ const MIDIObjectAddRemoveNotification* remove_message = reinterpret_cast(message);
+ if (!JackCoreMidiPort::IsInternalPort(remove_message->child)) {
+ Restart();
+ }
break;
-
+ }
}
}
@@ -809,8 +817,8 @@ extern "C" {
{
const JSList * node;
const jack_driver_param_t * param;
- int virtual_in = 0;
- int virtual_out = 0;
+ int virtual_in = 1;
+ int virtual_out = 1;
for (node = params; node; node = jack_slist_next (node)) {
param = (const jack_driver_param_t *) node->data;
diff --git a/macosx/coremidi/JackCoreMidiDriver.h b/macosx/coremidi/JackCoreMidiDriver.h
index 90e36bb1..4ad6fda0 100644
--- a/macosx/coremidi/JackCoreMidiDriver.h
+++ b/macosx/coremidi/JackCoreMidiDriver.h
@@ -61,7 +61,7 @@ namespace Jack {
int CloseAux();
void Restart();
-
+
JackThread fThread; /*! Thread to execute the Process function */
public:
diff --git a/macosx/coremidi/JackCoreMidiPort.cpp b/macosx/coremidi/JackCoreMidiPort.cpp
index 9b19d0e4..2bc4eb66 100644
--- a/macosx/coremidi/JackCoreMidiPort.cpp
+++ b/macosx/coremidi/JackCoreMidiPort.cpp
@@ -25,6 +25,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
using Jack::JackCoreMidiPort;
+std::set JackCoreMidiPort::endpoint_list;
+
+bool JackCoreMidiPort::IsInternalPort(MIDIObjectRef port_aux)
+{
+ MIDIEndpointRef port = (MIDIEndpointRef)port_aux;
+ return std::find(endpoint_list.begin(), endpoint_list.end(), port) != endpoint_list.end();
+}
+
JackCoreMidiPort::JackCoreMidiPort(double time_ratio)
{
initialized = false;
diff --git a/macosx/coremidi/JackCoreMidiPort.h b/macosx/coremidi/JackCoreMidiPort.h
index d4d2b381..3cb7b60b 100644
--- a/macosx/coremidi/JackCoreMidiPort.h
+++ b/macosx/coremidi/JackCoreMidiPort.h
@@ -21,6 +21,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#define __JackCoreMidiPort__
#include
+#include
#include "JackConstants.h"
@@ -36,9 +37,6 @@ namespace Jack {
protected:
- MIDIEndpointRef
- GetEndpoint();
-
void
Initialize(const char *alias_name, const char *client_name,
const char *driver_name, int index,
@@ -46,6 +44,11 @@ namespace Jack {
double time_ratio;
MIDIEndpointRef endpoint;
+
+ MIDIEndpointRef
+ GetEndpoint();
+
+ static std::set endpoint_list;
public:
@@ -59,6 +62,8 @@ namespace Jack {
const char *
GetName();
+
+ static bool IsInternalPort(MIDIObjectRef port_aux);
};
diff --git a/macosx/coremidi/JackCoreMidiVirtualInputPort.cpp b/macosx/coremidi/JackCoreMidiVirtualInputPort.cpp
index 874a644d..111fbafb 100644
--- a/macosx/coremidi/JackCoreMidiVirtualInputPort.cpp
+++ b/macosx/coremidi/JackCoreMidiVirtualInputPort.cpp
@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include
#include
+#include "JackError.h"
#include "JackCoreMidiUtil.h"
#include "JackCoreMidiVirtualInputPort.h"
@@ -63,6 +64,9 @@ JackCoreMidiVirtualInputPort(const char *alias_name, const char *client_name,
throw std::runtime_error(GetMacOSErrorString(status));
}
Initialize(alias_name, client_name, driver_name, index, destination);
+
+ // Keep in global list (that keeps growing during the whole session...)
+ endpoint_list.insert(endpoint);
}
JackCoreMidiVirtualInputPort::~JackCoreMidiVirtualInputPort()
diff --git a/macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp b/macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp
index 0d8bc173..69ead9d2 100644
--- a/macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp
+++ b/macosx/coremidi/JackCoreMidiVirtualOutputPort.cpp
@@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
#include
#include
+#include "JackError.h"
#include "JackCoreMidiUtil.h"
#include "JackCoreMidiVirtualOutputPort.h"
@@ -48,6 +49,9 @@ JackCoreMidiVirtualOutputPort(const char *alias_name, const char *client_name,
throw std::runtime_error(GetMacOSErrorString(status));
}
Initialize(alias_name, client_name, driver_name, index, source, 0);
+
+ // Keep in global list (that keeps growing during the whole session...)
+ endpoint_list.insert(GetEndpoint());
}
JackCoreMidiVirtualOutputPort::~JackCoreMidiVirtualOutputPort()