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:
parent
20dce6c6e6
commit
9f3181b9c7
|
@ -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() )
|
||||
|
|
|
@ -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 );
|
||||
|
||||
|
|
|
@ -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 )
|
||||
|
|
Loading…
Reference in New Issue