Browse Source

More latency compensation tweaks.

tags/non-daw-v1.2.0
Jonathan Moore Liles 10 years ago
parent
commit
f3b73381d7
6 changed files with 90 additions and 104 deletions
  1. +30
    -45
      mixer/src/Chain.C
  2. +31
    -39
      mixer/src/Module.C
  3. +5
    -2
      mixer/src/Module.H
  4. +4
    -10
      mixer/src/Plugin_Module.C
  5. +2
    -3
      mixer/src/Plugin_Module.H
  6. +18
    -5
      timeline/src/Engine/Track.C

+ 30
- 45
mixer/src/Chain.C View File

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



+ 31
- 39
mixer/src/Module.C View File

@@ -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


+ 5
- 2
mixer/src/Module.H View File

@@ -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" }; */


+ 4
- 10
mixer/src/Plugin_Module.C View File

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



+ 2
- 3
mixer/src/Plugin_Module.H View File

@@ -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 );



+ 18
- 5
timeline/src/Engine/Track.C View File

@@ -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
{


Loading…
Cancel
Save