From 83baac750d231f7ddfb72ed9294a4c8610d1d818 Mon Sep 17 00:00:00 2001 From: Stephane Letz Date: Sun, 24 Mar 2013 13:21:16 +0100 Subject: [PATCH] Open one virtual in/out in CoreMidi driver, fix a state refresh issue. --- common/jack/jack.h | 2 +- macosx/coremidi/JackCoreMidiDriver.cpp | 34 ++++++++++++------- macosx/coremidi/JackCoreMidiDriver.h | 2 +- macosx/coremidi/JackCoreMidiPort.cpp | 8 +++++ macosx/coremidi/JackCoreMidiPort.h | 11 ++++-- .../coremidi/JackCoreMidiVirtualInputPort.cpp | 4 +++ .../JackCoreMidiVirtualOutputPort.cpp | 4 +++ 7 files changed, 47 insertions(+), 18 deletions(-) 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()