| @@ -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() ); | |||
| } | |||
| } | |||
| } | |||
| @@ -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 ) | |||
| { | |||
| @@ -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 ( ); | |||
| @@ -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; | |||
| } | |||