@@ -27,7 +27,7 @@ bool Control_Sequence::draw_with_gradient = true; | |||
bool Control_Sequence::draw_with_polygon = 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(); | |||
@@ -36,6 +36,8 @@ Control_Sequence::Control_Sequence ( Track *track ) : Sequence( 0, 0, 0, 0 ), ou | |||
if ( track ) | |||
track->add( this ); | |||
// output.activate( track->name(), | |||
log_create(); | |||
} | |||
@@ -335,7 +337,7 @@ Control_Sequence::play ( sample_t *buf, nframes_t frame, nframes_t nframes ) | |||
nframes_t | |||
Control_Sequence::process ( nframes_t nframes ) | |||
{ | |||
void *buf = output.buffer( nframes ); | |||
void *buf = _output->buffer( nframes ); | |||
return play( (sample_t*)buf, transport->frame, nframes ); | |||
} |
@@ -26,11 +26,12 @@ | |||
class Control_Sequence : public Sequence | |||
{ | |||
Port *_output; | |||
bool _highlighted; | |||
void init ( void ); | |||
Port output; | |||
protected: | |||
@@ -38,7 +39,7 @@ protected: | |||
virtual void get ( Log_Entry &e ) const; | |||
void set ( Log_Entry &e ); | |||
Control_Sequence ( ) : Sequence( 0, 0, 0, 1 ), output( "foo", Port::Output ) | |||
Control_Sequence ( ) : Sequence( 0, 0, 0, 1 ) | |||
{ | |||
init(); | |||
} | |||
@@ -65,6 +66,7 @@ public: | |||
/* Engine */ | |||
void output ( Port *p ) { _output = p; } | |||
nframes_t play ( sample_t *buf, nframes_t frame, nframes_t nframes ); | |||
nframes_t process ( nframes_t nframes ); | |||
@@ -23,6 +23,8 @@ | |||
#include "Engine.H" | |||
#include <stdio.h> // sprintf | |||
/* nframes is the number of frames to buffer */ | |||
Port::Port ( jack_port_t *port ) | |||
{ | |||
@@ -32,14 +34,37 @@ Port::Port ( jack_port_t *port ) | |||
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 ( ) | |||
{ | |||
@@ -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 | |||
Port::shutdown ( void ) | |||
{ | |||
@@ -64,6 +99,12 @@ Port::name ( const char *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 | |||
Port::write ( sample_t *buf, nframes_t nframes ) | |||
{ | |||
@@ -34,6 +34,9 @@ public: | |||
Port ( jack_port_t *port ); | |||
Port ( const char *name, type_e dir ); | |||
Port ( type_e dir, const char *base, int n, const char *type=0 ); | |||
// Port ( ); | |||
~Port ( ); | |||
/* Port ( const Port & rhs ) */ | |||
@@ -51,7 +54,10 @@ public: | |||
} | |||
const char * name ( void ) const { return _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 write ( 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_out.push_back( Port( Port::Output, name(), control_out.size(), "cv" ) ); | |||
t->output( &control_out.back() ); | |||
resize(); | |||
} | |||
@@ -498,27 +502,23 @@ Track::handle ( int m ) | |||
/* 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 | |||
Track::update_port_names ( void ) | |||
{ | |||
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 ) | |||
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 | |||
@@ -541,7 +541,7 @@ Track::configure_outputs ( int n ) | |||
{ | |||
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() ) | |||
output.push_back( p ); | |||
@@ -586,7 +586,7 @@ Track::configure_inputs ( int n ) | |||
{ | |||
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() ) | |||
input.push_back( p ); | |||
@@ -109,6 +109,8 @@ public: | |||
vector<Port> input; /* input ports... */ | |||
vector<Port> output; /* output ports... */ | |||
vector<Port> control_out; /* control ports... */ | |||
Playback_DS *playback_ds; | |||
Record_DS *record_ds; | |||