@@ -401,56 +401,41 @@ Chain::set_latency ( JACK::Port::direction_e dir ) | |||
{ | |||
nframes_t tmax = 0; | |||
nframes_t tmin = 0; | |||
nframes_t added = 0; | |||
nframes_t added_min = 0; | |||
nframes_t added_max = 0; | |||
if ( dir == JACK::Port::Input ) | |||
{ | |||
for ( int i = 0; i < modules(); ++i ) | |||
{ | |||
Module *m = module( i ); | |||
nframes_t min,max; | |||
/* added = m->get_latency( JACK::Port::Input, &min, &max ); */ | |||
added += m->get_latency( JACK::Port::Input, &min, &max ); | |||
min += added; | |||
max += added; | |||
if ( min > tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
m->set_latency( dir, tmin, tmax ); | |||
} | |||
} | |||
else | |||
for ( int i = 0; i < modules(); i++ ) | |||
{ | |||
tmin = JACK_MAX_FRAMES >> 1; | |||
Module *m; | |||
for ( int i = modules(); i--; ) | |||
if ( dir == JACK::Port::Input ) | |||
m = module( i ); | |||
else | |||
m = module( (modules() - 1) - i ); | |||
nframes_t min,max; | |||
min = max = 0; | |||
nframes_t a = m->get_module_latency(); | |||
added_min += a; | |||
added_max += a; | |||
if ( dir == JACK::Port::Input ? m->aux_audio_input.size() : m->aux_audio_output.size() ) | |||
{ | |||
Module *m = module( i ); | |||
nframes_t min,max; | |||
added += m->get_latency( JACK::Port::Output, &min, &max ); | |||
min += added; | |||
max += added; | |||
if ( min < tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
DMESSAGE( "Chain %s/%s: setting %s latency minimum to %lu", name(), | |||
m->name(), | |||
dir == JACK::Port::Input ? "Capture" : "Playback", | |||
(unsigned long)tmin); | |||
m->set_latency( dir, tmin, tmax ); | |||
m->get_latency( dir, &min, &max ); | |||
tmin = 0; | |||
added_min = 0; | |||
} | |||
if ( min > tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
m->set_latency( dir, tmin + added_min, tmax + added_max ); | |||
} | |||
} | |||
@@ -125,6 +125,7 @@ Module::~Module ( ) | |||
void | |||
Module::init ( void ) | |||
{ | |||
@@ -143,9 +144,18 @@ Module::init ( void ) | |||
labelsize(12); | |||
color( fl_rgb_color( 122,190,200 ) ); | |||
tooltip( "Left click to edit parameters; Ctrl + left click to select; right click or MENU key for menu." ); | |||
tooltip(); | |||
} | |||
void | |||
Module::update_tooltip ( void ) | |||
{ | |||
char *s; | |||
asprintf( &s, "Left click to edit parameters; Ctrl + left click to select; right click or MENU key for menu. (info: latency: %lu)", (unsigned long) get_module_latency() ); | |||
copy_tooltip(s); | |||
free(s); | |||
} | |||
void | |||
Module::get ( Log_Entry &e ) const | |||
@@ -1156,61 +1166,43 @@ Module::auto_disconnect_outputs ( void ) | |||
} | |||
} | |||
nframes_t | |||
void | |||
Module::get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const | |||
{ | |||
nframes_t tmin = JACK_MAX_FRAMES >> 1; | |||
nframes_t tmax = 0; | |||
const std::vector<Port> *ports; | |||
if ( dir == JACK::Port::Input ) | |||
ports = &aux_audio_input; | |||
else | |||
ports = &aux_audio_output; | |||
if ( ports->size() ) | |||
{ | |||
if ( aux_audio_input.size() ) | |||
for ( unsigned int i = 0; i < ports->size(); i++ ) | |||
{ | |||
for ( unsigned int i = 0; i < aux_audio_input.size(); i++ ) | |||
{ | |||
/* if ( ! aux_audio_input[i].jack_port()->connected() ) */ | |||
/* continue; */ | |||
/* if ( ! ports->[i].jack_port()->connected() ) */ | |||
/* continue; */ | |||
nframes_t min,max; | |||
aux_audio_input[i].jack_port()->get_latency( dir, &min, &max ); | |||
if ( min < tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
} | |||
} | |||
else | |||
{ | |||
tmin = 0; | |||
nframes_t min,max; | |||
(*ports)[i].jack_port()->get_latency( dir, &min, &max ); | |||
if ( min < tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
} | |||
} | |||
else | |||
{ | |||
if ( aux_audio_output.size() ) | |||
{ | |||
for ( unsigned int i = 0; i < aux_audio_output.size(); i++ ) | |||
{ | |||
/* if ( ! aux_audio_output[i].jack_port()->connected() ) */ | |||
/* continue; */ | |||
nframes_t min,max; | |||
aux_audio_output[i].jack_port()->get_latency( dir, &min, &max ); | |||
if ( min < tmin ) | |||
tmin = min; | |||
if ( max > tmax ) | |||
tmax = max; | |||
} | |||
} | |||
tmin = 0; | |||
} | |||
*min = tmin; | |||
*max = tmax; | |||
return 0; | |||
} | |||
void | |||
@@ -46,7 +46,6 @@ class Module : public Fl_Group, public Loggable { | |||
nframes_t _nframes; | |||
Chain *_chain; | |||
bool _is_default; | |||
// nframes_t _latency; | |||
static nframes_t _sample_rate; | |||
static Module *_copied_module_empty; | |||
@@ -72,7 +71,9 @@ protected: | |||
public: | |||
virtual nframes_t get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const; | |||
virtual nframes_t get_module_latency ( void ) const { return 0; } | |||
virtual void get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const; | |||
virtual void set_latency ( JACK::Port::direction_e dir, nframes_t min, nframes_t max ); | |||
/* true if this module was added by default and not under normal user control */ | |||
@@ -81,6 +82,8 @@ public: | |||
virtual void update ( void ) {} | |||
virtual void update_tooltip ( void ); | |||
class Port | |||
{ | |||
/* char *type_names[] = { "Audio", "Control" }; */ | |||
@@ -151,6 +151,8 @@ Plugin_Module::update ( void ) | |||
} | |||
_last_latency = _latency; | |||
update_tooltip(); | |||
} | |||
int | |||
@@ -407,7 +409,7 @@ Plugin_Module::bypass ( bool v ) | |||
} | |||
nframes_t | |||
Plugin_Module::get_plugin_latency ( void ) const | |||
Plugin_Module::get_module_latency ( void ) const | |||
{ | |||
for ( unsigned int i = ncontrol_outputs(); i--; ) | |||
{ | |||
@@ -420,14 +422,6 @@ Plugin_Module::get_plugin_latency ( void ) const | |||
return 0; | |||
} | |||
nframes_t | |||
Plugin_Module::get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const | |||
{ | |||
Module::get_latency( dir, min, max ); | |||
return get_plugin_latency(); | |||
} | |||
bool | |||
Plugin_Module::load ( unsigned long id ) | |||
{ | |||
@@ -808,7 +802,7 @@ Plugin_Module::process ( nframes_t nframes ) | |||
for ( unsigned int i = 0; i < _idata->handle.size(); ++i ) | |||
_idata->descriptor->run( _idata->handle[i], nframes ); | |||
_latency = get_plugin_latency(); | |||
_latency = get_module_latency(); | |||
} | |||
} | |||
@@ -68,8 +68,6 @@ private: | |||
volatile nframes_t _latency; | |||
nframes_t _last_latency; | |||
nframes_t get_plugin_latency ( void ) const; | |||
void init ( void ); | |||
void bbox ( int &X, int &Y, int &W, int &H ) | |||
@@ -111,8 +109,9 @@ private: | |||
public: | |||
virtual nframes_t get_module_latency ( void ) const; | |||
virtual void update ( void ); | |||
virtual nframes_t get_latency ( JACK::Port::direction_e dir, nframes_t *min, nframes_t *max ) const; | |||
static std::list<Plugin_Info> get_all_plugins ( void ); | |||
@@ -370,16 +370,29 @@ Track::compute_latency_compensation ( void ) | |||
{ | |||
if ( Timeline::playback_latency_compensation && output.size() ) | |||
{ | |||
nframes_t min,max; | |||
output[0].get_latency( JACK::Port::Output, &min, &max ); | |||
nframes_t tmin,tmax; | |||
tmin = JACK_MAX_FRAMES >> 1; | |||
tmax = 0; | |||
for ( unsigned int i = 0; i < output.size(); i++ ) | |||
{ | |||
nframes_t min,max; | |||
output[i].get_latency( JACK::Port::Output, &min, &max ); | |||
if ( max > tmax ) | |||
tmax = max; | |||
if ( min < tmin ) | |||
tmin = min; | |||
} | |||
DMESSAGE( "Track %s, setting undelay to %lu", name(), (unsigned long)max); | |||
DMESSAGE( "Track %s, setting undelay to %lu", name(), (unsigned long)tmax); | |||
char s[256]; | |||
snprintf( s, sizeof(s), "Latency Comp: -%lu", (unsigned long)max); | |||
snprintf( s, sizeof(s), "Latency Comp: -%lu", (unsigned long)tmax); | |||
copy_tooltip(s); | |||
undelay( max ); | |||
undelay( tmax ); | |||
} | |||
else | |||
{ | |||