From 9ce87012833574eb6f155cb44f46f4d078a84f4e Mon Sep 17 00:00:00 2001 From: Jonathan Moore Liles Date: Mon, 21 Apr 2008 13:01:03 -0500 Subject: [PATCH] Actually rename ports when appropriate. Journal track I/O configuration. --- Timeline/Port.C | 24 +++++++++-- Timeline/Port.H | 23 +++++++--- Timeline/Track.C | 107 ++++++++++++++++++++++++++++++++--------------- Timeline/Track.H | 40 +++++++++++------- 4 files changed, 137 insertions(+), 57 deletions(-) diff --git a/Timeline/Port.C b/Timeline/Port.C index 27c6fb2..bfdf98b 100644 --- a/Timeline/Port.C +++ b/Timeline/Port.C @@ -30,7 +30,7 @@ Port::Port ( jack_port_t *port ) _name = jack_port_name( _port ); } -Port::Port ( const char *name, direction_e dir ) +Port::Port ( const char *name, type_e dir ) { _name = name; @@ -42,8 +42,26 @@ Port::Port ( const char *name, direction_e dir ) Port::~Port ( ) { - /* close port? */ -// jack_port_unregister( engine->client(), _port ); + +/* if ( _port ) */ +/* jack_port_unregister( engine->client(), _port ); */ + +} + +void +Port::shutdown ( void ) +{ + if ( _port ) + jack_port_unregister( engine->client(), _port ); +} + +/** rename port */ +bool +Port::name ( const char *name ) +{ + _name = name; + + return 0 == jack_port_set_name( _port, name ); } void diff --git a/Timeline/Port.H b/Timeline/Port.H index 2ec6acb..ca5ea34 100644 --- a/Timeline/Port.H +++ b/Timeline/Port.H @@ -25,21 +25,34 @@ class Port { - jack_port_t *_port; const char *_name; public: - enum direction_e { Output, Input }; + enum type_e { Output, Input }; Port ( jack_port_t *port ); - Port ( const char *name, direction_e dir ); + Port ( const char *name, type_e dir ); ~Port ( ); - bool connected ( void ) const { return jack_port_connected( _port ); } - const char * name ( void ) const { return _name; } +/* Port ( const Port & rhs ) */ +/* { */ +/* _port = rhs.port; */ +/* _name = rhs.name; */ +/* } */ + + bool valid ( void ) const { return _port; } + bool connected ( void ) const { return jack_port_connected( _port ); } + type_e type ( void ) const + { + return jack_port_flags( _port ) == JackPortIsOutput ? Output : Input; + } + const char * name ( void ) const { return _name; } + bool name ( const char *name ); + + void shutdown ( void ); void write ( sample_t *buf, nframes_t nframes ); void read ( sample_t *buf, nframes_t nframes ); void *buffer ( nframes_t nframes ); diff --git a/Timeline/Track.C b/Timeline/Track.C index e36c9c7..2130324 100644 --- a/Timeline/Track.C +++ b/Timeline/Track.C @@ -47,10 +47,7 @@ Track::cb_input_field ( void ) { log_start(); - if ( _name ) - free( _name ); - - _name = strdup( name_field->value() ); + name( name_field->value() ); log_end(); } @@ -125,8 +122,6 @@ Track::init ( void ) o->textcolor( 32 ); o->callback( cb_input_field, (void*)this ); - -// o->hide(); } { @@ -205,24 +200,26 @@ Track::init ( void ) } end(); - /* FIXME: should be configurable, but where? */ - create_outputs( 2 ); - create_inputs( 2 ); +/* /\* FIXME: should be configurable, but where? *\/ */ +/* create_outputs( 2 ); */ +/* create_inputs( 2 ); */ playback_ds = new Playback_DS( this, engine->frame_rate(), engine->nframes(), output.size() ); record_ds = new Record_DS( this, engine->frame_rate(), engine->nframes(), input.size() ); } -Track::Track ( const char *L ) : - Fl_Group ( 0, 0, 0, 0, L ) +Track::Track ( const char *L, int channels ) : + Fl_Group ( 0, 0, 0, 0, 0 ) { - init(); if ( L ) name( L ); + configure_inputs( channels ); + configure_outputs( channels ); + log_create(); } @@ -361,14 +358,6 @@ Track::draw ( void ) } else Fl_Group::draw(); - -/* if ( ! name_field->visible() ) */ -/* { */ -/* fl_color( FL_WHITE ); */ -/* fl_font( FL_HELVETICA, 14 ); */ -/* fl_draw( name_field->value(), name_field->x(), name_field->y(), name_field->w(), name_field->h(), FL_ALIGN_CENTER ); */ -/* } */ - } int @@ -406,15 +395,53 @@ Track::handle ( int m ) /* Engine */ /**********/ -bool -Track::create_outputs ( int n ) +const char * +Track::name_for_port ( Port::type_e type, int n ) { - char pname[256]; + static char pname[256]; - for ( int i = 0; i < n; ++i ) + snprintf( pname, sizeof( pname ), "%s/%s-%d", + name(), + type == Port::Output ? "out" : "in", + n + 1 ); + + return pname; +} + +void +Track::update_port_names ( void ) +{ + for ( int i = 0; i < output.size(); ++i ) + output[ i ].name( name_for_port( output[ i ].type(), i ) ); + + for ( int i = 0; i < input.size(); ++i ) + input[ i ].name( name_for_port( input[ i ].type(), i ) ); +} + +bool +Track::configure_outputs ( int n ) +{ + int on = output.size(); + + if ( n > on ) { - snprintf( pname, sizeof( pname ), "%s/out-%d", name(), i + 1 ); - output.push_back( Port( strdup( pname ), Port::Output ) ); + for ( int i = on; i < n; ++i ) + { + Port p( strdup( name_for_port( Port::Output, i ) ), Port::Output ); + + if ( p.valid() ) + output.push_back( p ); + else + printf( "error: could not create output port!\n" ); + } + } + else + { + for ( int i = on; i > n; --i ) + { + output.back().shutdown(); + output.pop_back(); + } } /* FIXME: bogus */ @@ -422,23 +449,35 @@ Track::create_outputs ( int n ) } bool -Track::create_inputs ( int n ) +Track::configure_inputs ( int n ) { - char pname[256]; + int on = input.size(); - for ( int i = 0; i < n; ++i ) + if ( n > on ) { - snprintf( pname, sizeof( pname ), "%s/in-%d", name(), i + 1 ); - input.push_back( Port( strdup( pname ), Port::Input ) ); + for ( int i = on; i < n; ++i ) + { + Port p( strdup( name_for_port( Port::Input, i ) ), Port::Input ); + + if ( p.valid() ) + input.push_back( p ); + else + printf( "error: could not create input port!\n" ); + } + } + else + { + for ( int i = on; i > n; --i ) + { + input.back().shutdown(); + input.pop_back(); + } } /* FIXME: bogus */ return true; } - - - /* THREAD: RT */ nframes_t Track::process ( nframes_t nframes ) diff --git a/Timeline/Track.H b/Timeline/Track.H index 1132791..fe0f03c 100644 --- a/Timeline/Track.H +++ b/Timeline/Track.H @@ -51,7 +51,7 @@ class Track : public Fl_Group, public Loggable public: - Track ( const char *L ); + Track ( const char *L, int channels=1 ); ~Track ( ); private: @@ -72,8 +72,11 @@ private: Region *_capture; /* capture region */ - bool create_outputs ( int n ); - bool create_inputs ( int n ); + bool configure_outputs ( int n ); + bool configure_inputs ( int n ); + + void update_port_names ( void ); + const char *name_for_port( Port::type_e type, int n ); Track ( ) : Fl_Group( 0, 0, 1, 1 ) @@ -126,12 +129,11 @@ public: _selected = atoi( v ); // else if ( ! strcmp( s, ":armed" else if ( ! strcmp( s, ":n" ) ) - { - _name = strdup( v ); - /* FIXME: bogus */ - if ( name_field ) - name_field->value( _name ); - } + name( v ); + else if ( ! strcmp( s, ":i" ) ) + configure_inputs( atoi( v ) ); + else if ( ! strcmp( s, ":o" ) ) + configure_outputs( atoi( v ) ); else if ( ! strcmp( s, ":t" ) ) { int i; @@ -153,10 +155,12 @@ public: void get ( Log_Entry &e ) { - e.add( ":n", _name ); - e.add( ":t", track() ); - e.add( ":s", _selected ); - e.add( ":h", size() ); + e.add( ":n", _name ); + e.add( ":t", track() ); + e.add( ":s", _selected ); + e.add( ":h", size() ); + e.add( ":i", input.size() ); + e.add( ":o", output.size() ); } /* for loggable */ @@ -187,9 +191,15 @@ public: void name ( const char *name ) { - if ( _name ) free( _name ); + if ( _name ) + free( _name ); + _name = strdup( name ); - name_field->value( _name ); + + if ( name_field ) + name_field->value( _name ); + + update_port_names(); } const char * name ( void ) const { return _name; }