Mixer: Enforce stability of module OSC path over close/open cycles.
Also, allow CV input of for multiple instances of the same plugin/parameter on the same strip.
This commit is contained in:
parent
ab469f8a23
commit
393684f376
|
@ -29,8 +29,6 @@ AUX_Module::AUX_Module ( ) : JACK_Module ( false )
|
||||||
{
|
{
|
||||||
is_default( false );
|
is_default( false );
|
||||||
|
|
||||||
_number = 0;
|
|
||||||
|
|
||||||
{
|
{
|
||||||
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
|
Port p( this, Port::INPUT, Port::CONTROL, "Gain (dB)" );
|
||||||
p.hints.type = Port::Hints::LINEAR;
|
p.hints.type = Port::Hints::LINEAR;
|
||||||
|
@ -49,8 +47,6 @@ AUX_Module::AUX_Module ( ) : JACK_Module ( false )
|
||||||
|
|
||||||
color( FL_DARK1 );
|
color( FL_DARK1 );
|
||||||
|
|
||||||
copy_label( "Aux" );
|
|
||||||
|
|
||||||
smoothing.sample_rate( sample_rate() );
|
smoothing.sample_rate( sample_rate() );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -62,35 +58,10 @@ AUX_Module::~AUX_Module ( )
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
AUX_Module::get ( Log_Entry &e ) const
|
|
||||||
{
|
|
||||||
e.add( ":number", number() );
|
|
||||||
JACK_Module::get(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
AUX_Module::set ( Log_Entry &e )
|
|
||||||
{
|
|
||||||
for ( int i = 0; i < e.size(); ++i )
|
|
||||||
{
|
|
||||||
const char *s, *v;
|
|
||||||
|
|
||||||
e.get( i, &s, &v );
|
|
||||||
|
|
||||||
if ( ! ( strcmp( s, ":number" ) ) )
|
|
||||||
{
|
|
||||||
number( atoi(v) );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
JACK_Module::set(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
AUX_Module::number ( int n )
|
AUX_Module::number ( int n )
|
||||||
{
|
{
|
||||||
_number = n;
|
JACK_Module::number(n);
|
||||||
|
|
||||||
char s[10];
|
char s[10];
|
||||||
snprintf( s, sizeof(s), "aux-%c", 'A' + n );
|
snprintf( s, sizeof(s), "aux-%c", 'A' + n );
|
||||||
|
|
|
@ -24,17 +24,12 @@
|
||||||
|
|
||||||
class AUX_Module : public JACK_Module
|
class AUX_Module : public JACK_Module
|
||||||
{
|
{
|
||||||
int _number;
|
|
||||||
|
|
||||||
Value_Smoothing_Filter smoothing;
|
Value_Smoothing_Filter smoothing;
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
virtual void get ( Log_Entry &e ) const;
|
|
||||||
virtual void set ( Log_Entry &e );
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
virtual void number ( int v );
|
||||||
|
|
||||||
virtual const char *name ( void ) const { return "AUX"; }
|
virtual const char *name ( void ) const { return "AUX"; }
|
||||||
|
|
||||||
int can_support_inputs ( int n ) { return n > 0 ? n : -1; }
|
int can_support_inputs ( int n ) { return n > 0 ? n : -1; }
|
||||||
|
@ -42,9 +37,6 @@ public:
|
||||||
virtual bool configure_outputs ( int n );
|
virtual bool configure_outputs ( int n );
|
||||||
virtual bool configure_inputs ( int n );
|
virtual bool configure_inputs ( int n );
|
||||||
|
|
||||||
void number ( int n );
|
|
||||||
int number ( void ) const { return _number; }
|
|
||||||
|
|
||||||
AUX_Module ( );
|
AUX_Module ( );
|
||||||
virtual ~AUX_Module ( );
|
virtual ~AUX_Module ( );
|
||||||
|
|
||||||
|
|
|
@ -450,8 +450,8 @@ Chain::get_module_instance_number ( Module *m )
|
||||||
{
|
{
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
||||||
for ( int i = 0; i < modules() && module(i) != m; ++i )
|
for ( int i = 0; i < modules(); ++i )
|
||||||
if ( ! strcmp( module(i)->label(), m->label() ) )
|
if ( ! strcmp( module(i)->base_label(), m->base_label() ) )
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -576,6 +576,10 @@ Chain::insert ( Module *m, Module *n )
|
||||||
Module::sample_rate( client()->sample_rate() );
|
Module::sample_rate( client()->sample_rate() );
|
||||||
n->resize_buffers( client()->nframes() );
|
n->resize_buffers( client()->nframes() );
|
||||||
|
|
||||||
|
/* inserting a new instance */
|
||||||
|
if ( -1 == n->number() )
|
||||||
|
n->number( get_module_instance_number( n ) );
|
||||||
|
|
||||||
if ( !m )
|
if ( !m )
|
||||||
{
|
{
|
||||||
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 )
|
if ( modules() == 0 && n->can_support_inputs( 0 ) >= 0 )
|
||||||
|
|
|
@ -189,7 +189,6 @@ Controller_Module::set ( Log_Entry &e )
|
||||||
{
|
{
|
||||||
connect_to( &module->control_input[port] );
|
connect_to( &module->control_input[port] );
|
||||||
module->chain()->add_control( this );
|
module->chain()->add_control( this );
|
||||||
label( module->control_input[port].name() );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for ( int i = 0; i < e.size(); ++i )
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
|
@ -220,7 +219,14 @@ Controller_Module::mode ( Mode m )
|
||||||
Port *p = control_output[0].connected_port();
|
Port *p = control_output[0].connected_port();
|
||||||
|
|
||||||
char prefix[512];
|
char prefix[512];
|
||||||
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
|
|
||||||
|
const Module *m = p->module();
|
||||||
|
|
||||||
|
if ( m->number() >= 0 )
|
||||||
|
/* we do it this way now to ensure uniqueness */
|
||||||
|
snprintf( prefix, sizeof(prefix), "CV-%s/%s", m->label(), p->name() );
|
||||||
|
else
|
||||||
|
snprintf( prefix, sizeof(prefix), "CV-%s", p->name() );
|
||||||
|
|
||||||
add_aux_cv_input( prefix, 0 );
|
add_aux_cv_input( prefix, 0 );
|
||||||
|
|
||||||
|
@ -404,6 +410,19 @@ Controller_Module::connect_spatializer_to ( Module *m )
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Controller_Module::apply_label ( Port *p, Fl_Widget *o )
|
||||||
|
{
|
||||||
|
char path[256];
|
||||||
|
|
||||||
|
if ( is_default() )
|
||||||
|
snprintf( path, sizeof(path) - 1, "%s", p->name() );
|
||||||
|
else
|
||||||
|
snprintf( path, sizeof(path) - 1, "%s/%s", p->module()->label(), p->name() );
|
||||||
|
|
||||||
|
o->copy_label(path);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Controller_Module::connect_to ( Port *p )
|
Controller_Module::connect_to ( Port *p )
|
||||||
{
|
{
|
||||||
|
@ -415,7 +434,7 @@ Controller_Module::connect_to ( Port *p )
|
||||||
|
|
||||||
if ( p->hints.type == Module::Port::Hints::BOOLEAN )
|
if ( p->hints.type == Module::Port::Hints::BOOLEAN )
|
||||||
{
|
{
|
||||||
Fl_Button *o = new Fl_Button( 0, 0, 40, 40, p->name() );
|
Fl_Button *o = new Fl_Button( 0, 0, 40, 40 );
|
||||||
w = o;
|
w = o;
|
||||||
o->type( FL_TOGGLE_BUTTON );
|
o->type( FL_TOGGLE_BUTTON );
|
||||||
o->value( p->control_value() );
|
o->value( p->control_value() );
|
||||||
|
@ -429,7 +448,8 @@ Controller_Module::connect_to ( Port *p )
|
||||||
else if ( p->hints.type == Module::Port::Hints::INTEGER )
|
else if ( p->hints.type == Module::Port::Hints::INTEGER )
|
||||||
{
|
{
|
||||||
|
|
||||||
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24, p->name() );
|
Fl_Counter *o = new Fl_Counter(0, 0, 58, 24 );
|
||||||
|
|
||||||
control = o;
|
control = o;
|
||||||
w = o;
|
w = o;
|
||||||
|
|
||||||
|
@ -449,7 +469,8 @@ Controller_Module::connect_to ( Port *p )
|
||||||
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
|
// else if ( p->hints.type == Module::Port::Hints::LOGARITHMIC )
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250, p->name() );
|
Fl_Value_SliderX *o = new Fl_Value_SliderX(0, 0, 30, 250 );
|
||||||
|
|
||||||
control = o;
|
control = o;
|
||||||
w = o;
|
w = o;
|
||||||
|
|
||||||
|
@ -513,6 +534,8 @@ Controller_Module::connect_to ( Port *p )
|
||||||
/* _type = KNOB; */
|
/* _type = KNOB; */
|
||||||
/* } */
|
/* } */
|
||||||
|
|
||||||
|
apply_label(p,control);
|
||||||
|
|
||||||
control_value = p->control_value();
|
control_value = p->control_value();
|
||||||
|
|
||||||
w->clear_visible_focus();
|
w->clear_visible_focus();
|
||||||
|
|
|
@ -119,6 +119,7 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
void apply_label ( Port *p, Fl_Widget *o );
|
||||||
void maybe_create_panner ( void );
|
void maybe_create_panner ( void );
|
||||||
char *generate_osc_path ( void );
|
char *generate_osc_path ( void );
|
||||||
void change_osc_path ( char *path );
|
void change_osc_path ( char *path );
|
||||||
|
|
|
@ -170,6 +170,8 @@ Module::init ( void )
|
||||||
_instances = 1;
|
_instances = 1;
|
||||||
_bypass = 0;
|
_bypass = 0;
|
||||||
_pending_feedback = false;
|
_pending_feedback = false;
|
||||||
|
_base_label = NULL;
|
||||||
|
_number = -2; /* magic number indicates old instance, before numbering */
|
||||||
|
|
||||||
box( FL_UP_BOX );
|
box( FL_UP_BOX );
|
||||||
labeltype( FL_NO_LABEL );
|
labeltype( FL_NO_LABEL );
|
||||||
|
@ -208,6 +210,8 @@ Module::get ( Log_Entry &e ) const
|
||||||
e.add( ":is_default", is_default() );
|
e.add( ":is_default", is_default() );
|
||||||
e.add( ":chain", chain() );
|
e.add( ":chain", chain() );
|
||||||
e.add( ":active", ! bypass() );
|
e.add( ":active", ! bypass() );
|
||||||
|
if ( number() >= 0 )
|
||||||
|
e.add( ":number", number() );
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
|
@ -238,7 +242,8 @@ Module::copy ( void ) const
|
||||||
/* we don't want this module to get added to the current
|
/* we don't want this module to get added to the current
|
||||||
chain... */
|
chain... */
|
||||||
if ( !( !strcmp( s, ":chain" ) ||
|
if ( !( !strcmp( s, ":chain" ) ||
|
||||||
!strcmp( s, ":is_default" ) ) )
|
!strcmp( s, ":is_default" ) ||
|
||||||
|
!strcmp( s, ":number" ) ) )
|
||||||
{
|
{
|
||||||
DMESSAGE( "%s = %s", s, v );
|
DMESSAGE( "%s = %s", s, v );
|
||||||
ne->add_raw( s, v );
|
ne->add_raw( s, v );
|
||||||
|
@ -251,6 +256,7 @@ Module::copy ( void ) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Module::paste_before ( void )
|
Module::paste_before ( void )
|
||||||
{
|
{
|
||||||
|
@ -267,6 +273,8 @@ Module::paste_before ( void )
|
||||||
|
|
||||||
m->set( le );
|
m->set( le );
|
||||||
|
|
||||||
|
m->number(-1);
|
||||||
|
|
||||||
if ( ! chain()->insert( this, m ) )
|
if ( ! chain()->insert( this, m ) )
|
||||||
{
|
{
|
||||||
fl_alert( "Copied module cannot be inserted at this point in the chain" );
|
fl_alert( "Copied module cannot be inserted at this point in the chain" );
|
||||||
|
@ -280,6 +288,33 @@ Module::paste_before ( void )
|
||||||
m->copy();
|
m->copy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Module::number ( int v )
|
||||||
|
{
|
||||||
|
_number = v;
|
||||||
|
|
||||||
|
char s[255];
|
||||||
|
|
||||||
|
if ( v > 0 && !is_default() )
|
||||||
|
snprintf( s, sizeof(s), "%s.%i", base_label(), v );
|
||||||
|
else
|
||||||
|
snprintf( s, sizeof(s), "%s", base_label() );
|
||||||
|
|
||||||
|
copy_label( s );
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Module::base_label ( const char *s )
|
||||||
|
{
|
||||||
|
if ( _base_label )
|
||||||
|
free( _base_label );
|
||||||
|
|
||||||
|
_base_label = NULL;
|
||||||
|
|
||||||
|
if ( s )
|
||||||
|
_base_label = strdup(s);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -430,12 +465,7 @@ Module::Port::generate_osc_path ()
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int n = module()->chain()->get_module_instance_number( module() );
|
asprintf( &path, "/strip/%s/%s/%s", module()->chain()->name(), p->module()->label(), p->name() );
|
||||||
|
|
||||||
if ( n > 0 )
|
|
||||||
asprintf( &path, "/strip/%s/%s.%i/%s", module()->chain()->name(), p->module()->label(), n, p->name() );
|
|
||||||
else
|
|
||||||
asprintf( &path, "/strip/%s/%s/%s", module()->chain()->name(), p->module()->label(), p->name() );
|
|
||||||
|
|
||||||
char *s = escape_url( path );
|
char *s = escape_url( path );
|
||||||
|
|
||||||
|
@ -574,6 +604,24 @@ Module::Port::osc_control_change_cv ( float v, void *user_data )
|
||||||
void
|
void
|
||||||
Module::set ( Log_Entry &e )
|
Module::set ( Log_Entry &e )
|
||||||
{
|
{
|
||||||
|
/* have to do this before adding to chain... */
|
||||||
|
|
||||||
|
int n = -2;
|
||||||
|
|
||||||
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
|
{
|
||||||
|
const char *s, *v;
|
||||||
|
|
||||||
|
e.get( i, &s, &v );
|
||||||
|
|
||||||
|
if ( ! strcmp(s, ":number" ) )
|
||||||
|
{
|
||||||
|
n = atoi(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
number(n);
|
||||||
|
|
||||||
for ( int i = 0; i < e.size(); ++i )
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
{
|
{
|
||||||
const char *s, *v;
|
const char *s, *v;
|
||||||
|
@ -901,19 +949,7 @@ Module::insert_menu_cb ( const Fl_Menu_ *m )
|
||||||
|
|
||||||
if ( !strcmp( picked, "Aux" ) )
|
if ( !strcmp( picked, "Aux" ) )
|
||||||
{
|
{
|
||||||
int n = 0;
|
|
||||||
for ( int i = 0; i < chain()->modules(); i++ )
|
|
||||||
{
|
|
||||||
if ( !strcmp( chain()->module(i)->name(), "AUX" ) )
|
|
||||||
n++;
|
|
||||||
}
|
|
||||||
|
|
||||||
AUX_Module *jm = new AUX_Module();
|
AUX_Module *jm = new AUX_Module();
|
||||||
jm->chain( chain() );
|
|
||||||
jm->number( n );
|
|
||||||
jm->configure_inputs( ninputs() );
|
|
||||||
jm->configure_outputs( ninputs() );
|
|
||||||
jm->initialize();
|
|
||||||
|
|
||||||
mod = jm;
|
mod = jm;
|
||||||
}
|
}
|
||||||
|
@ -931,9 +967,6 @@ Module::insert_menu_cb ( const Fl_Menu_ *m )
|
||||||
Spatializer_Module *jm = new Spatializer_Module();
|
Spatializer_Module *jm = new Spatializer_Module();
|
||||||
|
|
||||||
jm->chain( chain() );
|
jm->chain( chain() );
|
||||||
// jm->number( n );
|
|
||||||
// jm->configure_inputs( ninputs() );
|
|
||||||
// jm->configure_outputs( ninputs() );
|
|
||||||
jm->initialize();
|
jm->initialize();
|
||||||
|
|
||||||
mod = jm;
|
mod = jm;
|
||||||
|
@ -941,8 +974,6 @@ Module::insert_menu_cb ( const Fl_Menu_ *m )
|
||||||
}
|
}
|
||||||
else if ( !strcmp( picked, "Gain" ) )
|
else if ( !strcmp( picked, "Gain" ) )
|
||||||
mod = new Gain_Module();
|
mod = new Gain_Module();
|
||||||
/* else if ( !strcmp( picked, "Spatializer" ) ) */
|
|
||||||
/* mod = new Spatializer_Module(); */
|
|
||||||
else if ( !strcmp( picked, "Meter" ) )
|
else if ( !strcmp( picked, "Meter" ) )
|
||||||
mod = new Meter_Module();
|
mod = new Meter_Module();
|
||||||
else if ( !strcmp( picked, "Mono Pan" ))
|
else if ( !strcmp( picked, "Mono Pan" ))
|
||||||
|
@ -963,6 +994,8 @@ Module::insert_menu_cb ( const Fl_Menu_ *m )
|
||||||
|
|
||||||
if ( mod )
|
if ( mod )
|
||||||
{
|
{
|
||||||
|
mod->number(-1);
|
||||||
|
|
||||||
if ( ! chain()->insert( this, mod ) )
|
if ( ! chain()->insert( this, mod ) )
|
||||||
{
|
{
|
||||||
fl_alert( "Cannot insert this module at this point in the chain" );
|
fl_alert( "Cannot insert this module at this point in the chain" );
|
||||||
|
|
|
@ -49,12 +49,15 @@ class Module : public Fl_Group, public Loggable {
|
||||||
Chain *_chain;
|
Chain *_chain;
|
||||||
bool _is_default;
|
bool _is_default;
|
||||||
bool _pending_feedback;
|
bool _pending_feedback;
|
||||||
|
char *_base_label;
|
||||||
|
|
||||||
nframes_t _nframes;
|
nframes_t _nframes;
|
||||||
static nframes_t _sample_rate;
|
static nframes_t _sample_rate;
|
||||||
static Module *_copied_module_empty;
|
static Module *_copied_module_empty;
|
||||||
static char *_copied_module_settings;
|
static char *_copied_module_settings;
|
||||||
|
|
||||||
|
int _number;
|
||||||
|
|
||||||
void init ( void );
|
void init ( void );
|
||||||
|
|
||||||
void insert_menu_cb ( const Fl_Menu_ *m );
|
void insert_menu_cb ( const Fl_Menu_ *m );
|
||||||
|
@ -75,6 +78,13 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
||||||
|
virtual int number ( void ) const { return _number; }
|
||||||
|
virtual void number ( int v );
|
||||||
|
|
||||||
|
virtual const char * base_label ( void ) const { return _base_label ? _base_label : name(); }
|
||||||
|
virtual void base_label ( const char * );
|
||||||
|
|
||||||
virtual nframes_t get_module_latency ( void ) const { return 0; }
|
virtual nframes_t get_module_latency ( void ) const { return 0; }
|
||||||
|
|
||||||
virtual void get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const;
|
virtual void get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const;
|
||||||
|
|
|
@ -98,6 +98,24 @@ Plugin_Module::get ( Log_Entry &e ) const
|
||||||
void
|
void
|
||||||
Plugin_Module::set ( Log_Entry &e )
|
Plugin_Module::set ( Log_Entry &e )
|
||||||
{
|
{
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
/* we need to have number() defined before we create the control inputs in load() */
|
||||||
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
|
{
|
||||||
|
const char *s, *v;
|
||||||
|
|
||||||
|
e.get( i, &s, &v );
|
||||||
|
|
||||||
|
if ( ! strcmp(s, ":number" ) )
|
||||||
|
{
|
||||||
|
n = atoi(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* need to call this to set label even for version 0 modules */
|
||||||
|
number(n);
|
||||||
|
|
||||||
for ( int i = 0; i < e.size(); ++i )
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
{
|
{
|
||||||
const char *s, *v;
|
const char *s, *v;
|
||||||
|
@ -443,11 +461,15 @@ Plugin_Module::load ( unsigned long id )
|
||||||
{
|
{
|
||||||
/* unknown plugin ID */
|
/* unknown plugin ID */
|
||||||
WARNING( "Unknown plugin ID: %lu", id );
|
WARNING( "Unknown plugin ID: %lu", id );
|
||||||
label( "----" );
|
char s[25];
|
||||||
|
|
||||||
|
snprintf( s, 24, "! %lu", id );
|
||||||
|
|
||||||
|
base_label( s );
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
label( _idata->descriptor->Name );
|
base_label( _idata->descriptor->Name );
|
||||||
|
|
||||||
if ( _idata->descriptor )
|
if ( _idata->descriptor )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue