From dd1818ad9c995c8544c479e084bbceb09478c6e1 Mon Sep 17 00:00:00 2001 From: sletz Date: Fri, 26 Aug 2011 14:59:33 +0000 Subject: [PATCH] Singleton behaviour for JackCoreMidiDriver and JackWinMMEDriver. git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@4530 0c269be4-1314-0410-8aa9-9f06e86f4224 --- ChangeLog | 1 + macosx/coremidi/JackCoreMidiDriver.cpp | 18 ++++++++++++++---- windows/winmme/JackWinMMEDriver.cpp | 18 ++++++++++++++---- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 5d44021f..d28f4b41 100644 --- a/ChangeLog +++ b/ChangeLog @@ -41,6 +41,7 @@ Chris Caudle * Non blocking notifications in JackEngine::NotifyAddClient and JackEngine::NotifyRemoveClient. * More robust Control API implementation. * Add jackctl_driver_get_type in Control API. + * Singleton behaviour for JackCoreMidiDriver and JackWinMMEDriver. 2011-07-29 Stephane Letz diff --git a/macosx/coremidi/JackCoreMidiDriver.cpp b/macosx/coremidi/JackCoreMidiDriver.cpp index 0479bcc9..05a63eb3 100644 --- a/macosx/coremidi/JackCoreMidiDriver.cpp +++ b/macosx/coremidi/JackCoreMidiDriver.cpp @@ -275,6 +275,7 @@ JackCoreMidiDriver::Open(bool capturing, bool playing, int in_channels, return -1; } char *client_name = fClientControl.fName; + printf("JackCoreMidiDriver::Open client_name %s\n",client_name); // Allocate and connect physical inputs potential_pi_count = MIDIGetNumberOfSources(); @@ -632,6 +633,9 @@ JackCoreMidiDriver::Write() extern "C" { #endif + // singleton kind of driver + static Jack::JackDriverClientInterface* driver = NULL; + SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { jack_driver_desc_t * desc; @@ -669,11 +673,17 @@ extern "C" { } } - Jack::JackDriverClientInterface* driver = new Jack::JackCoreMidiDriver("system_midi", "coremidi", engine, table); - if (driver->Open(1, 1, virtual_in, virtual_out, false, "in", "out", 0, 0) == 0) { - return driver; + // singleton kind of driver + if (!driver) { + driver = new Jack::JackCoreMidiDriver("system_midi", "coremidi", engine, table); + if (driver->Open(1, 1, virtual_in, virtual_out, false, "in", "out", 0, 0) == 0) { + return driver; + } else { + delete driver; + return NULL; + } } else { - delete driver; + jack_info("JackCoreMidiDriver already allocated, cannot be loaded twice"); return NULL; } } diff --git a/windows/winmme/JackWinMMEDriver.cpp b/windows/winmme/JackWinMMEDriver.cpp index f98f646a..02eb3433 100644 --- a/windows/winmme/JackWinMMEDriver.cpp +++ b/windows/winmme/JackWinMMEDriver.cpp @@ -357,6 +357,9 @@ extern "C" { #endif + // singleton kind of driver + static Jack::JackDriverClientInterface* driver = NULL; + SERVER_EXPORT jack_driver_desc_t * driver_get_descriptor() { jack_driver_desc_t * desc; @@ -406,13 +409,20 @@ extern "C" } */ - Jack::JackDriverClientInterface* driver = new Jack::JackWinMMEDriver("system_midi", "winmme", engine, table); - if (driver->Open(1, 1, 0, 0, false, "in", "out", 0, 0) == 0) { - return driver; + // singleton kind of driver + if (!driver) { + driver = new Jack::JackWinMMEDriver("system_midi", "winmme", engine, table); + if (driver->Open(1, 1, virtual_in, virtual_out, false, "in", "out", 0, 0) == 0) { + return driver; + } else { + delete driver; + return NULL; + } } else { - delete driver; + jack_info("JackWinMMEDriver already allocated, cannot be loaded twice"); return NULL; } + } #ifdef __cplusplus