Browse Source

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.

tags/non-daw-v1.3.0
Jonathan Moore Liles 3 years ago
parent
commit
9f3181b9c7
3 changed files with 58 additions and 0 deletions
  1. +43
    -0
      mixer/src/Mixer_Strip.C
  2. +1
    -0
      mixer/src/Mixer_Strip.H
  3. +14
    -0
      mixer/src/Module.H

+ 43
- 0
mixer/src/Mixer_Strip.C 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() )


+ 1
- 0
mixer/src/Mixer_Strip.H 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 );


+ 14
- 0
mixer/src/Module.H 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 )


Loading…
Cancel
Save