From 9f3181b9c7189fb8fc1657e514ba6f95faa6ab0d Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Sun, 13 Dec 2020 14:46:46 -0800 Subject: [PATCH] Mixer: Because disconnecting/connecting JACK ports is slow, when handling a change of strip auto input setting, avoid disconnecting a port and then reconnecting it later. --- mixer/src/Mixer_Strip.C | 43 +++++++++++++++++++++++++++++++++++++++++ mixer/src/Mixer_Strip.H | 1 + mixer/src/Module.H | 14 ++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/mixer/src/Mixer_Strip.C b/mixer/src/Mixer_Strip.C index 371672f..998bbcb 100644 --- a/mixer/src/Mixer_Strip.C +++ b/mixer/src/Mixer_Strip.C @@ -940,6 +940,9 @@ Mixer_Strip::menu_cb ( Fl_Widget *w, void *v ) void Mixer_Strip::auto_input ( const char *s ) { + /* break old connections */ + disconnect_auto_inputs(s); + if ( _auto_input ) free( _auto_input ); @@ -948,6 +951,7 @@ Mixer_Strip::auto_input ( const char *s ) if ( s ) _auto_input = strdup( s ); + /* make new connections */ mixer->auto_connect(); } @@ -1024,6 +1028,42 @@ Mixer_Strip::has_group_affinity ( void ) const return _auto_input && strncmp( _auto_input, "*/", 2 ); } +void +Mixer_Strip::disconnect_auto_inputs ( const char *exclude_pattern ) +{ + if ( chain() ) + { + JACK_Module *m = (JACK_Module*)chain()->module(0); + + if ( m ) + { + for ( unsigned int i = 0; i < m->aux_audio_input.size(); ++i ) + { + Module::Port *p1 = &m->aux_audio_input[i]; + + if ( _auto_input && exclude_pattern ) + { + /* avoid disconnecting a port that we'll immediately be reconnecting */ + for ( unsigned int j = 0; j < p1->nconnected(); ++j ) + { + Module::Port *p2 = p1->connected_port( j ); + + if ( !matches_pattern( exclude_pattern, p2 ) ) + { + p1->disconnect( p2 ); + j--; /* keep our place in the iteration */ + } + } + } + else + { + m->aux_audio_input[i].disconnect(); + } + } + } + } +} + bool Mixer_Strip::maybe_auto_connect_output ( Module::Port *p ) { @@ -1071,6 +1111,9 @@ Mixer_Strip::maybe_auto_connect_output ( Module::Port *p ) return false; } + if ( ! m->aux_audio_input[n].connected_to( p ) ) + m->aux_audio_input[n].connect_to( p ); + m->aux_audio_input[n].connect_to( p ); if ( p->module()->is_default() ) diff --git a/mixer/src/Mixer_Strip.H b/mixer/src/Mixer_Strip.H index 9c601d8..28c244b 100644 --- a/mixer/src/Mixer_Strip.H +++ b/mixer/src/Mixer_Strip.H @@ -161,6 +161,7 @@ public: void manual_connection ( bool b ); bool has_group_affinity ( void ) const; + void disconnect_auto_inputs ( const char *exclude_pattern ); void auto_connect_outputs ( void ); bool maybe_auto_connect_output ( Module::Port *p ); diff --git a/mixer/src/Module.H b/mixer/src/Module.H index fd53593..2b85146 100644 --- a/mixer/src/Module.H +++ b/mixer/src/Module.H @@ -264,6 +264,9 @@ public: /* control and external audio ports belong to a graph */ return _connected.size() > 0; } + + unsigned int nconnected ( void ) const { return _connected.size(); } + bool connected_osc ( void ) const; Port *connected_port ( void ) const @@ -271,6 +274,17 @@ public: return _connected.size() == 0 ? NULL : _connected.front(); } + Port *connected_port ( int n ) const + { + int j = 0; + for ( std::list::const_iterator i = _connected.begin(); + i != _connected.end(); ++i, ++j ) + if ( j == n ) + return *i; + + return NULL; + } + void connect_to ( Port *to ) { if ( _type != Port::AUX_AUDIO )