diff --git a/common/JackConstants.h b/common/JackConstants.h index 0e05c058..fc26913d 100644 --- a/common/JackConstants.h +++ b/common/JackConstants.h @@ -92,4 +92,6 @@ #define EMPTY 0xFFFD #define FREE 0xFFFC +#define JACK_DEFAULT_SELF_CONNECT_MODE JackSelfConnectIgnoreAll + #endif diff --git a/common/JackControlAPI.cpp b/common/JackControlAPI.cpp index abd6d28a..5bf8195a 100644 --- a/common/JackControlAPI.cpp +++ b/common/JackControlAPI.cpp @@ -864,6 +864,7 @@ jackctl_server_start( server_ptr->realtime_priority.i, server_ptr->verbose.b, (jack_timer_type_t)server_ptr->clock_source.ui, + JACK_DEFAULT_SELF_CONNECT_MODE, server_ptr->name.str); if (server_ptr->engine == NULL) { diff --git a/common/JackEngine.cpp b/common/JackEngine.cpp index 6093adf6..5a32178e 100644 --- a/common/JackEngine.cpp +++ b/common/JackEngine.cpp @@ -39,11 +39,13 @@ namespace Jack JackEngine::JackEngine(JackGraphManager* manager, JackSynchro* table, - JackEngineControl* control) + JackEngineControl* control, + JackSelfConnectMode self_connect_mode) { fGraphManager = manager; fSynchroTable = table; fEngineControl = control; + fSelfConnectMode = self_connect_mode; for (int i = 0; i < CLIENT_NUM; i++) fClientTable[i] = NULL; } @@ -756,10 +758,47 @@ int JackEngine::CheckPortsConnect(int refnum, jack_port_id_t src, jack_port_id_t // 2 means client is connecting its own ports (i.e. for app internal functionality) // TODO: Make this check an engine option and more tweakable (return error or success) // MAYBE: make the engine option changable on the fly and expose it through client or control API - if (src_self + dst_self != 0) + + switch (fSelfConnectMode) { - jack_info("ignoring port self connect request"); - return 0; + case JackSelfConnectFailExternalOnly: + if (src_self + dst_self == 1) + { + jack_info("rejecting port self connect request to external port"); + return -1; + } + + return 1; + + case JackSelfConnectIgnoreExternalOnly: + if (src_self + dst_self == 1) + { + jack_info("ignoring port self connect request to external port"); + return 0; + } + + return 1; + + case JackSelfConnectFailAll: + if (src_self + dst_self != 0) + { + jack_info("rejecting port self connect request"); + return -1; + } + + return 1; + + case JackSelfConnectIgnoreAll: + if (src_self + dst_self != 0) + { + jack_info("ignoring port self connect request"); + return 0; + } + + return 1; + + case JackSelfConnectAllow: // fix warning + return 1; } return 1; diff --git a/common/JackEngine.h b/common/JackEngine.h index 9f689378..c425f143 100644 --- a/common/JackEngine.h +++ b/common/JackEngine.h @@ -43,6 +43,7 @@ class SERVER_EXPORT JackEngine JackGraphManager* fGraphManager; JackEngineControl* fEngineControl; + JackSelfConnectMode fSelfConnectMode; JackClientInterface* fClientTable[CLIENT_NUM]; JackSynchro* fSynchroTable; JackServerNotifyChannel fChannel; /*! To communicate between the RT thread and server */ @@ -75,7 +76,7 @@ class SERVER_EXPORT JackEngine public: - JackEngine(JackGraphManager* manager, JackSynchro* table, JackEngineControl* controler); + JackEngine(JackGraphManager* manager, JackSynchro* table, JackEngineControl* controler, JackSelfConnectMode self_connect_mode); ~JackEngine(); int Open(); diff --git a/common/JackLockedEngine.h b/common/JackLockedEngine.h index c8799f49..3dd75135 100644 --- a/common/JackLockedEngine.h +++ b/common/JackLockedEngine.h @@ -38,8 +38,8 @@ class SERVER_EXPORT JackLockedEngine : public JackLockAble public: - JackLockedEngine(JackGraphManager* manager, JackSynchro* table, JackEngineControl* controler): - fEngine(manager, table, controler) + JackLockedEngine(JackGraphManager* manager, JackSynchro* table, JackEngineControl* controler, JackSelfConnectMode self_connect_mode): + fEngine(manager, table, controler, self_connect_mode) {} ~JackLockedEngine() {} diff --git a/common/JackServer.cpp b/common/JackServer.cpp index 081e743b..961266e9 100644 --- a/common/JackServer.cpp +++ b/common/JackServer.cpp @@ -38,7 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. namespace Jack { -JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name) +JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, JackSelfConnectMode self_connect_mode, const char* server_name) { if (rt) { jack_info("JACK server starting in realtime mode with priority %ld", priority); @@ -48,7 +48,7 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long pr fGraphManager = new JackGraphManager(); fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, clock, server_name); - fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl); + fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl, self_connect_mode); fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable())); fDriverInfo = new JackDriverInfo(); fAudioDriver = NULL; diff --git a/common/JackServer.h b/common/JackServer.h index 325237de..22a21c4e 100644 --- a/common/JackServer.h +++ b/common/JackServer.h @@ -62,7 +62,7 @@ class SERVER_EXPORT JackServer public: - JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name); + JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, JackSelfConnectMode self_connect_mode, const char* server_name); ~JackServer(); int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); diff --git a/common/JackServerGlobals.cpp b/common/JackServerGlobals.cpp index 815d5330..3768935c 100644 --- a/common/JackServerGlobals.cpp +++ b/common/JackServerGlobals.cpp @@ -40,10 +40,11 @@ int JackServerGlobals::Start(const char* server_name, int rt, int priority, int verbose, - jack_timer_type_t clock) + jack_timer_type_t clock, + JackSelfConnectMode self_connect_mode) { jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose); - new JackServer(sync, temporary, time_out_ms, rt, priority, verbose, clock, server_name); // Will setup fInstance and fUserCount globals + new JackServer(sync, temporary, time_out_ms, rt, priority, verbose, clock, self_connect_mode, server_name); // Will setup fInstance and fUserCount globals int res = fInstance->Open(driver_desc, driver_params); return (res < 0) ? res : fInstance->Start(); } @@ -289,7 +290,7 @@ bool JackServerGlobals::Init() free(argv[i]); } - int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, verbose_aux, clock_source); + int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, verbose_aux, clock_source, JACK_DEFAULT_SELF_CONNECT_MODE); if (res < 0) { jack_error("Cannot start server... exit"); Delete(); diff --git a/common/JackServerGlobals.h b/common/JackServerGlobals.h index c972a9bf..9f29e3c6 100644 --- a/common/JackServerGlobals.h +++ b/common/JackServerGlobals.h @@ -53,7 +53,8 @@ struct SERVER_EXPORT JackServerGlobals int rt, int priority, int verbose, - jack_timer_type_t clock); + jack_timer_type_t clock, + JackSelfConnectMode self_connect_mode); static void Stop(); static void Delete(); }; diff --git a/common/JackTypes.h b/common/JackTypes.h index 234be17a..433fe939 100644 --- a/common/JackTypes.h +++ b/common/JackTypes.h @@ -49,4 +49,14 @@ typedef enum { Finished, } jack_client_state_t; + +enum JackSelfConnectMode +{ + JackSelfConnectAllow, + JackSelfConnectFailExternalOnly, + JackSelfConnectIgnoreExternalOnly, + JackSelfConnectFailAll, + JackSelfConnectIgnoreAll, +}; + #endif