diff --git a/Mixer/JACK_Module.C b/Mixer/JACK_Module.C index 6fd61e0..89c6ce7 100644 --- a/Mixer/JACK_Module.C +++ b/Mixer/JACK_Module.C @@ -36,6 +36,7 @@ JACK_Module::JACK_Module ( ) p.hints.type = Port::Hints::INTEGER; p.hints.minimum = 0; p.hints.maximum = 6; + p.hints.ranged = true; p.connect_to( new float ); p.control_value_no_callback( 0 ); @@ -48,6 +49,7 @@ JACK_Module::JACK_Module ( ) p.hints.type = Port::Hints::INTEGER; p.hints.minimum = 0; p.hints.maximum = 6; + p.hints.ranged = true; p.connect_to( new float ); p.control_value_no_callback( 0 ); @@ -153,6 +155,8 @@ JACK_Module::initialize ( void ) void JACK_Module::handle_control_changed ( Port *p ) { + THREAD_ASSERT( UI ); + if ( 0 == strcmp( p->name(), "Inputs" ) ) { DMESSAGE( "Adjusting number of inputs (JACK outputs)" ); @@ -163,14 +167,20 @@ JACK_Module::handle_control_changed ( Port *p ) else if ( 0 == strcmp( p->name(), "Outputs" ) ) { DMESSAGE( "Adjusting number of outputs (JACK inputs)" ); - if ( chain() && chain()->can_configure_outputs( this, p->control_value() ) ) + + if ( ! chain() ) + { + configure_outputs( p->control_value() ); + } + else if ( chain()->can_configure_outputs( this, p->control_value() ) ) { configure_outputs( p->control_value() ); chain()->configure_ports(); } else - configure_outputs( p->control_value() ); - + { + p->connected_port()->control_value( noutputs() ); + } } } diff --git a/Mixer/Meter_Indicator_Module.C b/Mixer/Meter_Indicator_Module.C index 682a5f1..6fbe90e 100644 --- a/Mixer/Meter_Indicator_Module.C +++ b/Mixer/Meter_Indicator_Module.C @@ -59,7 +59,7 @@ Meter_Indicator_Module::set ( Log_Entry &e ) { Module::set( e ); - int port; + int port = -1; Module *module = NULL; for ( int i = 0; i < e.size(); ++i ) @@ -146,7 +146,7 @@ Meter_Indicator_Module::update_cb ( void ) if ( dpm_pack->children() != p->hints.dimensions ) { - engine->lock(); +/* engine->lock(); */ dpm_pack->clear(); @@ -165,7 +165,7 @@ Meter_Indicator_Module::update_cb ( void ) dpm->value( -70.0f ); } - engine->unlock(); +/* engine->unlock(); */ } else { @@ -203,6 +203,39 @@ Meter_Indicator_Module::handle ( int m ) +void +Meter_Indicator_Module::handle_control_changed ( Port *p ) +{ + THREAD_ASSERT( UI ); + + /* The engine is already locked by the UI thread at this point in + the call-graph, so we can be sure that process() won't be + executed concurrently. */ + if ( p->connected() ) + { + p = p->connected_port(); + + if ( dpm_pack->children() != p->hints.dimensions ) + { + dpm_pack->clear(); + + control_value = new float[p->hints.dimensions]; + + for ( int i = p->hints.dimensions; i--; ) + { + DPM *dpm = new DPM( x(), y(), w(), h() ); + dpm->type( FL_VERTICAL ); + align( (Fl_Align)(FL_ALIGN_CENTER | FL_ALIGN_INSIDE ) ); + + dpm_pack->add( dpm ); + + control_value[i] = -70.0f; + dpm->value( -70.0f ); + } + } + } +} + void Meter_Indicator_Module::process ( void ) { diff --git a/Mixer/Meter_Indicator_Module.H b/Mixer/Meter_Indicator_Module.H index 67f436e..da1de6a 100644 --- a/Mixer/Meter_Indicator_Module.H +++ b/Mixer/Meter_Indicator_Module.H @@ -39,6 +39,8 @@ class Meter_Indicator_Module : public Module public: + void handle_control_changed ( Port *p ); + Meter_Indicator_Module ( bool is_default = false ); virtual ~Meter_Indicator_Module ( ); diff --git a/Mixer/Meter_Module.C b/Mixer/Meter_Module.C index 5cd3f83..f8bf6e9 100644 --- a/Mixer/Meter_Module.C +++ b/Mixer/Meter_Module.C @@ -88,6 +88,8 @@ Meter_Module::update_cb ( void ) bool Meter_Module::configure_inputs ( int n ) { + THREAD_ASSERT( UI ); + int tx, ty, tw, th; bbox( tx,ty,tw,th ); @@ -141,6 +143,9 @@ Meter_Module::configure_inputs ( int n ) for ( int i = n; i--; ) control_value[i] = -70.0f; + if ( control_output[0].connected() ) + control_output[0].connected_port()->module()->handle_control_changed( control_output[0].connected_port() ); + return true; }