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.

This commit is contained in:
Jonathan Moore Liles 2020-12-13 14:46:46 -08:00
parent 20dce6c6e6
commit 9f3181b9c7
3 changed files with 58 additions and 0 deletions

View File

@ -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() )

View File

@ -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 );

View File

@ -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<Module::Port*>::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 )