@@ -27,7 +27,7 @@ bool Control_Sequence::draw_with_gradient = true; | |||||
bool Control_Sequence::draw_with_polygon = true; | bool Control_Sequence::draw_with_polygon = true; | ||||
bool Control_Sequence::draw_with_grid = true; | bool Control_Sequence::draw_with_grid = true; | ||||
Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0 ), output( "foo", Port::Output ) | |||||
Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0 ) | |||||
{ | { | ||||
init(); | init(); | ||||
@@ -36,6 +36,8 @@ Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0 ), ou | |||||
if ( track ) | if ( track ) | ||||
track->add( this ); | track->add( this ); | ||||
// output.activate( track->name(), | |||||
log_create(); | log_create(); | ||||
} | } | ||||
@@ -335,7 +337,7 @@ Control_Sequence::play ( sample_t *buf, nframes_t frame, nframes_t nframes ) | |||||
nframes_t | nframes_t | ||||
Control_Sequence::process ( nframes_t nframes ) | Control_Sequence::process ( nframes_t nframes ) | ||||
{ | { | ||||
void *buf = output.buffer( nframes ); | |||||
void *buf = _output->buffer( nframes ); | |||||
return play( (sample_t*)buf, transport->frame, nframes ); | return play( (sample_t*)buf, transport->frame, nframes ); | ||||
} | } |
@@ -26,11 +26,12 @@ | |||||
class Control_Sequence : public Sequence | class Control_Sequence : public Sequence | ||||
{ | { | ||||
Port *_output; | |||||
bool _highlighted; | bool _highlighted; | ||||
void init ( void ); | void init ( void ); | ||||
Port output; | |||||
protected: | protected: | ||||
@@ -38,7 +39,7 @@ protected: | |||||
virtual void get ( Log_Entry &e ) const; | virtual void get ( Log_Entry &e ) const; | ||||
void set ( Log_Entry &e ); | void set ( Log_Entry &e ); | ||||
Control_Sequence ( ) : Sequence( 0, 0, 0, 1 ), output( "foo", Port::Output ) | |||||
Control_Sequence ( ) : Sequence( 0, 0, 0, 1 ) | |||||
{ | { | ||||
init(); | init(); | ||||
} | } | ||||
@@ -65,6 +66,7 @@ public: | |||||
/* Engine */ | /* Engine */ | ||||
void output ( Port *p ) { _output = p; } | |||||
nframes_t play ( sample_t *buf, nframes_t frame, nframes_t nframes ); | nframes_t play ( sample_t *buf, nframes_t frame, nframes_t nframes ); | ||||
nframes_t process ( nframes_t nframes ); | nframes_t process ( nframes_t nframes ); | ||||
@@ -23,6 +23,8 @@ | |||||
#include "Engine.H" | #include "Engine.H" | ||||
#include <stdio.h> // sprintf | |||||
/* nframes is the number of frames to buffer */ | /* nframes is the number of frames to buffer */ | ||||
Port::Port ( jack_port_t *port ) | Port::Port ( jack_port_t *port ) | ||||
{ | { | ||||
@@ -32,14 +34,37 @@ Port::Port ( jack_port_t *port ) | |||||
Port::Port ( const char *name, type_e dir ) | Port::Port ( const char *name, type_e dir ) | ||||
{ | { | ||||
_name = name; | |||||
activate( name, dir ); | |||||
} | |||||
_port = jack_port_register( engine->client(), _name, | |||||
JACK_DEFAULT_AUDIO_TYPE, | |||||
dir == Output ? JackPortIsOutput : JackPortIsInput, | |||||
0 ); | |||||
static const char * | |||||
name_for_port ( Port::type_e dir, const char *base, int n, const char *type ) | |||||
{ | |||||
static char pname[256]; | |||||
const char *dir_s = dir == Port::Output ? "out" : "in"; | |||||
if ( type ) | |||||
snprintf( pname, sizeof( pname ), "%s/%s-%s-%d", base, type, dir_s, n + 1 ); | |||||
else | |||||
snprintf( pname, sizeof( pname ), "%s/%s-%d", base, dir_s, n + 1 ); | |||||
return pname; | |||||
} | |||||
Port::Port ( type_e dir, const char *base, int n, const char *type ) | |||||
{ | |||||
const char *name = name_for_port( dir, base, n, type ); | |||||
activate( name, dir ); | |||||
} | } | ||||
/* Port::Port ( ) */ | |||||
/* { */ | |||||
/* _name = NULL; */ | |||||
/* _port = NULL; */ | |||||
/* } */ | |||||
Port::~Port ( ) | Port::~Port ( ) | ||||
{ | { | ||||
@@ -48,6 +73,16 @@ Port::~Port ( ) | |||||
} | } | ||||
void | |||||
Port::activate ( const char *name, type_e dir ) | |||||
{ | |||||
_name = name; | |||||
_port = jack_port_register( engine->client(), _name, | |||||
JACK_DEFAULT_AUDIO_TYPE, | |||||
dir == Output ? JackPortIsOutput : JackPortIsInput, | |||||
0 ); | |||||
} | |||||
void | void | ||||
Port::shutdown ( void ) | Port::shutdown ( void ) | ||||
{ | { | ||||
@@ -64,6 +99,12 @@ Port::name ( const char *name ) | |||||
return 0 == jack_port_set_name( _port, name ); | return 0 == jack_port_set_name( _port, name ); | ||||
} | } | ||||
bool | |||||
Port::name ( const char *base, int n, const char *type ) | |||||
{ | |||||
return name( name_for_port( this->type(), base, n, type ) ); | |||||
} | |||||
void | void | ||||
Port::write ( sample_t *buf, nframes_t nframes ) | Port::write ( sample_t *buf, nframes_t nframes ) | ||||
{ | { | ||||
@@ -34,6 +34,9 @@ public: | |||||
Port ( jack_port_t *port ); | Port ( jack_port_t *port ); | ||||
Port ( const char *name, type_e dir ); | Port ( const char *name, type_e dir ); | ||||
Port ( type_e dir, const char *base, int n, const char *type=0 ); | |||||
// Port ( ); | |||||
~Port ( ); | ~Port ( ); | ||||
/* Port ( const Port & rhs ) */ | /* Port ( const Port & rhs ) */ | ||||
@@ -51,7 +54,10 @@ public: | |||||
} | } | ||||
const char * name ( void ) const { return _name; } | const char * name ( void ) const { return _name; } | ||||
bool name ( const char *name ); | bool name ( const char *name ); | ||||
bool name ( const char *base, int n, const char *type=0 ); | |||||
void activate ( const char *name, type_e dir ); | |||||
void shutdown ( void ); | void shutdown ( void ); | ||||
void write ( sample_t *buf, nframes_t nframes ); | void write ( sample_t *buf, nframes_t nframes ); | ||||
void read ( sample_t *buf, nframes_t nframes ); | void read ( sample_t *buf, nframes_t nframes ); | ||||
@@ -357,6 +357,10 @@ Track::add ( Control_Sequence *t ) | |||||
control->add( t ); | control->add( t ); | ||||
control_out.push_back( Port( Port::Output, name(), control_out.size(), "cv" ) ); | |||||
t->output( &control_out.back() ); | |||||
resize(); | resize(); | ||||
} | } | ||||
@@ -498,27 +502,23 @@ Track::handle ( int m ) | |||||
/* Engine */ | /* Engine */ | ||||
/**********/ | /**********/ | ||||
const char * | |||||
Track::name_for_port ( Port::type_e type, int n ) | |||||
{ | |||||
static char pname[256]; | |||||
snprintf( pname, sizeof( pname ), "%s/%s-%d", | |||||
name(), | |||||
type == Port::Output ? "out" : "in", | |||||
n + 1 ); | |||||
return pname; | |||||
} | |||||
void | void | ||||
Track::update_port_names ( void ) | Track::update_port_names ( void ) | ||||
{ | { | ||||
for ( int i = 0; i < output.size(); ++i ) | for ( int i = 0; i < output.size(); ++i ) | ||||
output[ i ].name( name_for_port( output[ i ].type(), i ) ); | |||||
output[ i ].name( name(), i ); | |||||
for ( int i = 0; i < input.size(); ++i ) | for ( int i = 0; i < input.size(); ++i ) | ||||
input[ i ].name( name_for_port( input[ i ].type(), i ) ); | |||||
input[ i ].name( name(), i ); | |||||
for ( int i = 0; i < control_out.size(); ++i ) | |||||
control_out[ i ].name( name(), i, "cv" ); | |||||
/* /\* tell any attached control sequences to do the same *\/ */ | |||||
/* for ( int i = control->children(); i-- ) */ | |||||
/* ((Control_Sequence*)control->child( i ))->update_port_names(); */ | |||||
} | } | ||||
bool | bool | ||||
@@ -541,7 +541,7 @@ Track::configure_outputs ( int n ) | |||||
{ | { | ||||
for ( int i = on; i < n; ++i ) | for ( int i = on; i < n; ++i ) | ||||
{ | { | ||||
Port p( strdup( name_for_port( Port::Output, i ) ), Port::Output ); | |||||
Port p( Port::Output, name(), i ); | |||||
if ( p.valid() ) | if ( p.valid() ) | ||||
output.push_back( p ); | output.push_back( p ); | ||||
@@ -586,7 +586,7 @@ Track::configure_inputs ( int n ) | |||||
{ | { | ||||
for ( int i = on; i < n; ++i ) | for ( int i = on; i < n; ++i ) | ||||
{ | { | ||||
Port p( strdup( name_for_port( Port::Input, i ) ), Port::Input ); | |||||
Port p( Port::Input, name(), i ); | |||||
if ( p.valid() ) | if ( p.valid() ) | ||||
input.push_back( p ); | input.push_back( p ); | ||||
@@ -109,6 +109,8 @@ public: | |||||
vector<Port> input; /* input ports... */ | vector<Port> input; /* input ports... */ | ||||
vector<Port> output; /* output ports... */ | vector<Port> output; /* output ports... */ | ||||
vector<Port> control_out; /* control ports... */ | |||||
Playback_DS *playback_ds; | Playback_DS *playback_ds; | ||||
Record_DS *record_ds; | Record_DS *record_ds; | ||||