offset start end -> start offset length
This commit is contained in:
parent
8a048e6ef2
commit
6bb4a1d066
|
@ -69,7 +69,7 @@ public:
|
|||
{
|
||||
_sequence = sequence;
|
||||
|
||||
_r->offset = when;
|
||||
_r->start = when;
|
||||
|
||||
_label = strdup( name );
|
||||
|
||||
|
@ -78,7 +78,7 @@ public:
|
|||
|
||||
Annotation_Point ( const Annotation_Point &rhs )
|
||||
{
|
||||
_r->offset = rhs._r->offset;
|
||||
_r->start = rhs._r->start;
|
||||
_label = strdup( rhs._label );
|
||||
}
|
||||
|
||||
|
|
|
@ -52,10 +52,10 @@ Annotation_Region::Annotation_Region ( Sequence *sequence, nframes_t when, const
|
|||
{
|
||||
_sequence = sequence;
|
||||
|
||||
_r->offset = when;
|
||||
_r->start = when;
|
||||
|
||||
/* FIXME: hack */
|
||||
_r->end = 400;
|
||||
_r->length = 400;
|
||||
|
||||
_label = strdup( name );
|
||||
|
||||
|
@ -64,7 +64,9 @@ Annotation_Region::Annotation_Region ( Sequence *sequence, nframes_t when, const
|
|||
|
||||
Annotation_Region::Annotation_Region ( const Annotation_Region &rhs )
|
||||
{
|
||||
_r->offset = rhs._r->offset;
|
||||
_r->start = rhs._r->start;
|
||||
_r->length = rhs._r->length;
|
||||
|
||||
_label = strdup( rhs._label );
|
||||
}
|
||||
|
||||
|
|
|
@ -58,39 +58,62 @@ static Fl_Color fl_invert_color ( Fl_Color c )
|
|||
}
|
||||
|
||||
|
||||
#if 0
|
||||
/* perhaps use map? */
|
||||
map_PRIM ( set )
|
||||
void
|
||||
Audio_Region::get ( Log_Entry &e ) const
|
||||
{
|
||||
/* if ( narg % 2 != 0 ) */
|
||||
/* printf( "invalid number of arguments\n" ); */
|
||||
e.add( ":source", _clip ? _clip->name() : "" );
|
||||
e.add( ":gain", _scale );
|
||||
e.add( ":fade-in-type", _fade_in.type );
|
||||
e.add( ":fade-in-duration", _fade_in.length );
|
||||
e.add( ":fade-out-type", _fade_out.type );
|
||||
e.add( ":fade-out-duration", _fade_out.length );
|
||||
e.add( ":color", (int)_box_color );
|
||||
|
||||
int id = atoi( arg );
|
||||
Sequence_Region::get( e );
|
||||
|
||||
map_ARG_NEXT( arg, end );
|
||||
|
||||
Logable *l = Loggable::find( id );
|
||||
|
||||
char **sa = malloc( sizeof( char * ) * narg + 1 );
|
||||
|
||||
for ( int i = 0; i < narg; ++i )
|
||||
sa[ i ] = strdup( map_ARG_NEXT( arg, end ) );
|
||||
|
||||
l->set( sa );
|
||||
|
||||
map_RESULT( "" );
|
||||
e.add( ":offset", _r->offset );
|
||||
}
|
||||
|
||||
void
|
||||
Audio_Region::set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":gain" ) )
|
||||
_scale = atof( v );
|
||||
else if ( ! strcmp( s, ":color" ) )
|
||||
_box_color = (Fl_Color)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-in-type" ) )
|
||||
_fade_in.type = (Fade::fade_type_e)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-in-duration" ) )
|
||||
_fade_in.length = atoll( v );
|
||||
else if ( ! strcmp( s, ":fade-out-type" ) )
|
||||
_fade_out.type = (Fade::fade_type_e)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-out-duration" ) )
|
||||
_fade_out.length = atoll( v );
|
||||
else if ( ! strcmp( s, ":offset" ) )
|
||||
_r->offset = atoll( v );
|
||||
else if ( ! strcmp( s, ":source" ) )
|
||||
{
|
||||
if ( ! ( _clip = Audio_File::from_file( v ) ) )
|
||||
{
|
||||
printf( "Grave error: could not open source \"%s\"\n", v );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Sequence_Region::set( e );
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
Audio_Region::init ( void )
|
||||
{
|
||||
|
||||
_sequence = NULL;
|
||||
_r->offset = 0;
|
||||
_r->start = 0;
|
||||
_r->end = 0;
|
||||
_scale = 1.0f;
|
||||
_clip = NULL;
|
||||
|
||||
|
@ -128,7 +151,7 @@ Audio_Region::Audio_Region ( Audio_File *c )
|
|||
{
|
||||
init();
|
||||
_clip = c;
|
||||
_r->end = _clip->length();
|
||||
_r->length = _clip->length();
|
||||
|
||||
log_create();
|
||||
}
|
||||
|
@ -139,9 +162,10 @@ Audio_Region::Audio_Region ( Audio_File *c, Sequence *t, nframes_t o )
|
|||
{
|
||||
init();
|
||||
_clip = c;
|
||||
_r->end = _clip->length();
|
||||
_sequence = t;
|
||||
_r->offset = o;
|
||||
_r->offset = 0;
|
||||
_r->start = o;
|
||||
_r->length = _clip->length();
|
||||
|
||||
sequence()->add( this );
|
||||
|
||||
|
@ -172,7 +196,6 @@ int
|
|||
Audio_Region::handle ( int m )
|
||||
{
|
||||
static int ox, oy;
|
||||
static enum trim_e trimming;
|
||||
|
||||
static bool copied = false;
|
||||
static nframes_t os;
|
||||
|
@ -266,7 +289,7 @@ Audio_Region::handle ( int m )
|
|||
ox = x() - X;
|
||||
oy = y() - Y;
|
||||
/* for panning */
|
||||
os = _r->start;
|
||||
os = _r->offset;
|
||||
|
||||
/* normalization and selection */
|
||||
if ( Fl::event_button2() )
|
||||
|
@ -360,14 +383,10 @@ Audio_Region::handle ( int m )
|
|||
int d = (ox + X) - x();
|
||||
long td = timeline->x_to_ts( d );
|
||||
|
||||
nframes_t W = _r->end - _r->start;
|
||||
|
||||
if ( td > 0 && os < td )
|
||||
_r->start = 0;
|
||||
_r->offset = 0;
|
||||
else
|
||||
_r->start = os - td;
|
||||
|
||||
_r->end = _r->start + W;
|
||||
_r->offset = os - td;
|
||||
|
||||
sequence()->redraw();
|
||||
return 1;
|
||||
|
@ -390,6 +409,8 @@ Audio_Region::handle ( int m )
|
|||
return Sequence_Widget::handle( m );
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
@ -513,15 +534,14 @@ Audio_Region::draw ( void )
|
|||
W += 4;
|
||||
|
||||
int OX = scroll_x();
|
||||
int ox = timeline->ts_to_x( _r->offset );
|
||||
int ox = timeline->ts_to_x( _r->start );
|
||||
|
||||
if ( ox > OX + sequence()->w() ||
|
||||
ox < OX && ox + abs_w() < OX )
|
||||
/* not in viewport */
|
||||
return;
|
||||
|
||||
int rw = timeline->ts_to_x( _r->end - _r->start );
|
||||
// nframes_t end = _r->offset + ( _r->end - _r->start );
|
||||
int rw = timeline->ts_to_x( _r->length );
|
||||
|
||||
/* calculate waveform offset due to scrolling */
|
||||
nframes_t offset = 0;
|
||||
|
@ -545,7 +565,8 @@ Audio_Region::draw ( void )
|
|||
|
||||
|
||||
// const nframes_t start = _r->start + offset + timeline->x_to_ts( X - rx );
|
||||
nframes_t start = _r->start + offset;
|
||||
// nframes_t start = _r->start + offset;
|
||||
nframes_t start = _r->offset + offset;
|
||||
|
||||
/* compensate for ??? */
|
||||
if ( X - rx > 0 )
|
||||
|
@ -636,14 +657,10 @@ Audio_Region::draw ( void )
|
|||
void
|
||||
Audio_Region::normalize ( void )
|
||||
{
|
||||
printf( "normalize: start=%lu end=%lu\n", _r->start, _r->end );
|
||||
|
||||
/* FIXME: figure out a way to do this via the peak server */
|
||||
|
||||
int peaks, channels;
|
||||
Peak *pbuf;
|
||||
|
||||
if ( _clip->read_peaks( length(), _r->start, _r->end, &peaks, &pbuf, &channels ) &&
|
||||
if ( _clip->read_peaks( length(), offset(), offset() + length(), &peaks, &pbuf, &channels ) &&
|
||||
peaks )
|
||||
_scale = pbuf->normalization_factor();
|
||||
}
|
||||
|
@ -710,10 +727,8 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe
|
|||
{
|
||||
const Range r = _range;
|
||||
|
||||
const nframes_t length = r.end - r.start;
|
||||
|
||||
/* do nothing if we aren't covered by this frame range */
|
||||
if ( pos > r.offset + length || pos + nframes < r.offset )
|
||||
if ( pos > r.start + r.length || pos + nframes < r.start )
|
||||
return 0;
|
||||
|
||||
/* calculate offsets into file and sample buffer */
|
||||
|
@ -722,23 +737,23 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe
|
|||
|
||||
cnt = nframes;
|
||||
|
||||
if ( pos < r.offset )
|
||||
if ( pos < r.start )
|
||||
{
|
||||
sofs = 0;
|
||||
ofs = r.offset - pos;
|
||||
ofs = r.start - pos;
|
||||
cnt -= ofs;
|
||||
}
|
||||
else
|
||||
{
|
||||
ofs = 0;
|
||||
sofs = pos - r.offset;
|
||||
sofs = pos - r.start;
|
||||
}
|
||||
|
||||
if ( ofs >= nframes )
|
||||
return 0;
|
||||
|
||||
// const nframes_t start = ofs + r.start + sofs;
|
||||
const nframes_t start = r.start + sofs;
|
||||
const nframes_t start = r.offset + sofs;
|
||||
const nframes_t len = min( cnt, nframes - ofs );
|
||||
const nframes_t end = start + len;
|
||||
|
||||
|
@ -782,9 +797,9 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe
|
|||
|
||||
/* do fade out if necessary */
|
||||
// if ( start + cnt + fade.length > r.end )
|
||||
if ( start + fade.length > r.end )
|
||||
if ( start + fade.length > ( r.offset + r.length ) )
|
||||
{
|
||||
const nframes_t d = r.end - start;
|
||||
const nframes_t d = ( r.offset + r.length ) - start;
|
||||
|
||||
assert( cnt <= nframes );
|
||||
|
||||
|
@ -803,12 +818,12 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe
|
|||
nframes_t
|
||||
Audio_Region::write ( nframes_t nframes )
|
||||
{
|
||||
_range.end += nframes;
|
||||
_range.length += nframes;
|
||||
|
||||
/* FIXME: too much? */
|
||||
// _track->damage( FL_DAMAGE_EXPOSE, x() + w(), y(), 10/* FIXME: guess */, h() );
|
||||
|
||||
if ( 0 == ( timeline->ts_to_x( _range.end ) % 20 ) )
|
||||
if ( 0 == ( timeline->ts_to_x( _range.length ) % 20 ) )
|
||||
{
|
||||
nframes_t oldl = _clip->length();
|
||||
|
||||
|
@ -851,7 +866,7 @@ Audio_Region::finalize ( nframes_t frame )
|
|||
|
||||
/* FIXME: should we attempt to truncate the file? */
|
||||
|
||||
_range.end = frame - _range.offset;
|
||||
_range.length = frame - _range.start - _range.offset;
|
||||
|
||||
redraw();
|
||||
|
||||
|
|
|
@ -102,53 +102,8 @@ private:
|
|||
|
||||
protected:
|
||||
|
||||
// const char *class_name ( void ) { return "Audio_Region"; }
|
||||
|
||||
virtual void get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":source", _clip ? _clip->name() : "" );
|
||||
e.add( ":gain", _scale );
|
||||
e.add( ":fade-in-type", _fade_in.type );
|
||||
e.add( ":fade-in-duration", _fade_in.length );
|
||||
e.add( ":fade-out-type", _fade_out.type );
|
||||
e.add( ":fade-out-duration", _fade_out.length );
|
||||
e.add( ":color", (int)_box_color );
|
||||
|
||||
Sequence_Widget::get( e );
|
||||
}
|
||||
|
||||
void
|
||||
set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":gain" ) )
|
||||
_scale = atof( v );
|
||||
else if ( ! strcmp( s, ":color" ) )
|
||||
_box_color = (Fl_Color)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-in-type" ) )
|
||||
_fade_in.type = (Fade::fade_type_e)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-in-duration" ) )
|
||||
_fade_in.length = atoll( v );
|
||||
else if ( ! strcmp( s, ":fade-out-type" ) )
|
||||
_fade_out.type = (Fade::fade_type_e)atoi( v );
|
||||
else if ( ! strcmp( s, ":fade-out-duration" ) )
|
||||
_fade_out.length = atoll( v );
|
||||
else if ( ! strcmp( s, ":source" ) )
|
||||
{
|
||||
if ( ! ( _clip = Audio_File::from_file( v ) ) )
|
||||
{
|
||||
printf( "Grave error: could not open source \"%s\"\n", v );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Sequence_Widget::set( e );
|
||||
}
|
||||
virtual void get ( Log_Entry &e ) const;
|
||||
virtual void set ( Log_Entry &e );
|
||||
|
||||
public:
|
||||
|
||||
|
|
|
@ -23,7 +23,7 @@ Control_Point::Control_Point ( Sequence *t, nframes_t when, float y )
|
|||
{
|
||||
_sequence = t;
|
||||
_y = y;
|
||||
_r->offset = when;
|
||||
_r->start = when;
|
||||
_box_color = FL_WHITE;
|
||||
|
||||
log_create();
|
||||
|
@ -31,7 +31,7 @@ Control_Point::Control_Point ( Sequence *t, nframes_t when, float y )
|
|||
|
||||
Control_Point::Control_Point ( const Control_Point &rhs )
|
||||
{
|
||||
_r->offset = rhs._r->offset;
|
||||
_r->start = rhs._r->start;
|
||||
_y = rhs._y;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,7 +97,7 @@ Sequence::overlaps ( Sequence_Widget *r )
|
|||
for ( list <Sequence_Widget *>::const_iterator i = _widgets.begin(); i != _widgets.end(); i++ )
|
||||
{
|
||||
if ( *i == r ) continue;
|
||||
if ( ! ( (*i)->offset() > r->offset() + r->length() || (*i)->offset() + (*i)->length() < r->offset() ) )
|
||||
if ( ! ( (*i)->start() > r->start() + r->length() || (*i)->start() + (*i)->length() < r->start() ) )
|
||||
return *i;
|
||||
}
|
||||
|
||||
|
@ -176,7 +176,7 @@ Sequence::event_widget ( void )
|
|||
{
|
||||
nframes_t ets = timeline->xoffset + timeline->x_to_ts( Fl::event_x() - x() );
|
||||
for ( list <Sequence_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ )
|
||||
if ( ets > (*r)->offset() && ets < (*r)->offset() + (*r)->length() )
|
||||
if ( ets > (*r)->start() && ets < (*r)->start() + (*r)->length() )
|
||||
return (*r);
|
||||
|
||||
return NULL;
|
||||
|
@ -189,7 +189,7 @@ Sequence::select_range ( int X, int W )
|
|||
nframes_t ets = sts + timeline->x_to_ts( W );
|
||||
|
||||
for ( list <Sequence_Widget *>::const_reverse_iterator r = _widgets.rbegin(); r != _widgets.rend(); r++ )
|
||||
if ( ! ( (*r)->offset() > ets || (*r)->offset() + (*r)->length() < sts ) )
|
||||
if ( ! ( (*r)->start() > ets || (*r)->start() + (*r)->length() < sts ) )
|
||||
(*r)->select();
|
||||
}
|
||||
|
||||
|
@ -236,14 +236,14 @@ Sequence::snap ( Sequence_Widget *r )
|
|||
|
||||
if ( abs( rx1 - wx2 ) < snap_pixels )
|
||||
{
|
||||
r->offset( w->offset() + w->length() + 1 );
|
||||
r->start( w->start() + w->length() + 1 );
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if ( abs( rx2 - wx1 ) < snap_pixels )
|
||||
{
|
||||
r->offset( ( w->offset() - r->length() ) - 1 );
|
||||
r->start( ( w->start() - r->length() ) - 1 );
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -252,10 +252,10 @@ Sequence::snap ( Sequence_Widget *r )
|
|||
|
||||
nframes_t f;
|
||||
|
||||
if ( timeline->nearest_line( r->offset(), &f ) )
|
||||
if ( timeline->nearest_line( r->start(), &f ) )
|
||||
{
|
||||
// printf( "snap frame is %lu\n", f );
|
||||
r->offset( f );
|
||||
r->start( f );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -22,8 +22,7 @@
|
|||
void
|
||||
Sequence_Point::get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":x", _r->offset );
|
||||
e.add( ":sequence", _sequence );
|
||||
Sequence_Widget::get( e );
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -37,7 +36,7 @@ Sequence_Point::set ( Log_Entry &e )
|
|||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( ":x", s ) )
|
||||
if ( ! strcmp( ":start", s ) )
|
||||
{
|
||||
sequence()->sort();
|
||||
}
|
||||
|
|
|
@ -56,8 +56,6 @@ public:
|
|||
return sequence()->x() + sequence()->w() + abs_w();
|
||||
else
|
||||
return x;
|
||||
|
||||
|
||||
}
|
||||
|
||||
nframes_t length ( void ) const { return timeline->x_to_ts( abs_w() ); }
|
||||
|
|
|
@ -20,6 +20,35 @@
|
|||
#include "Sequence_Region.H"
|
||||
#include "Track.H"
|
||||
|
||||
void
|
||||
Sequence_Region::get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":color", (int)_box_color );
|
||||
e.add( ":length", _r->length );
|
||||
|
||||
Sequence_Widget::get( e );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Sequence_Region::set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":color" ) )
|
||||
_box_color = (Fl_Color)atoll( v );
|
||||
else if ( ! strcmp( s, ":length" ) )
|
||||
_r->length = atoll( v );
|
||||
|
||||
}
|
||||
|
||||
Sequence_Widget::set( e );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Sequence_Region::draw_box ( void )
|
||||
|
@ -53,14 +82,17 @@ Sequence_Region::trim ( enum trim_e t, int X )
|
|||
|
||||
long td = timeline->x_to_ts( d );
|
||||
|
||||
if ( td < 0 && _r->start < 0 - td )
|
||||
td = 0 - _r->start;
|
||||
if ( td < 0 && _r->offset < 0 - td )
|
||||
td = 0 - _r->offset;
|
||||
|
||||
if ( _r->start + td >= _r->end )
|
||||
td = (_r->end - _r->start) - timeline->x_to_ts( 1 );
|
||||
if ( td > 0 && td >= _r->length )
|
||||
td = _r->length - timeline->x_to_ts( 1 );
|
||||
|
||||
// td = _r->length - timeline->x_to_ts( 1 );
|
||||
|
||||
_r->start += td;
|
||||
_r->offset += td;
|
||||
_r->start += td;
|
||||
_r->length -= td;
|
||||
break;
|
||||
}
|
||||
case RIGHT:
|
||||
|
@ -71,12 +103,12 @@ Sequence_Region::trim ( enum trim_e t, int X )
|
|||
|
||||
long td = timeline->x_to_ts( d );
|
||||
|
||||
// printf( "%li %li\n", td, _r->end - _r->start );
|
||||
// printf( "%li %li\n", td, _r->length - _r->offset );
|
||||
|
||||
if ( td >= 0 && _r->end - _r->start < td )
|
||||
_r->end = _r->start + timeline->x_to_ts( 1 );
|
||||
if ( td >= 0 && _r->length < td )
|
||||
_r->length = timeline->x_to_ts( 1 );
|
||||
else
|
||||
_r->end -= td;
|
||||
_r->length -= td;
|
||||
|
||||
break;
|
||||
}
|
||||
|
@ -105,7 +137,7 @@ Sequence_Region::handle ( int m )
|
|||
int ret;
|
||||
|
||||
Logger _log( this );
|
||||
//log_r->start();
|
||||
//log_r->offset();
|
||||
|
||||
switch ( m )
|
||||
{
|
||||
|
|
|
@ -23,36 +23,15 @@
|
|||
#include "Sequence_Widget.H"
|
||||
|
||||
/* Base class representing a /region/ of time on a /sequence/, with
|
||||
controls for the start and end points. */
|
||||
controls for the offset and length points. */
|
||||
|
||||
class Sequence_Region : public Sequence_Widget
|
||||
{
|
||||
|
||||
protected:
|
||||
|
||||
virtual void get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":color", (int)_box_color );
|
||||
|
||||
Sequence_Widget::get( e );
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
virtual set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":color" ) )
|
||||
_box_color = (Fl_Color)atoll( v );
|
||||
}
|
||||
|
||||
Sequence_Widget::set( e );
|
||||
}
|
||||
virtual void get ( Log_Entry &e ) const;
|
||||
virtual void set ( Log_Entry &e );
|
||||
|
||||
Sequence_Region ( )
|
||||
{
|
||||
|
|
|
@ -33,6 +33,58 @@ Sequence_Widget * Sequence_Widget::_pushed = NULL;
|
|||
Sequence_Widget * Sequence_Widget::_belowmouse = NULL;
|
||||
Fl_Color Sequence_Widget::_selection_color = FL_MAGENTA;
|
||||
|
||||
void
|
||||
Sequence_Widget::get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":start", _r->start );
|
||||
// e.add( ":offset", _r->offset );
|
||||
// e.add( ":length", _r->length );
|
||||
e.add( ":sequence", _sequence );
|
||||
e.add( ":selected", selected() );
|
||||
}
|
||||
|
||||
void
|
||||
Sequence_Widget::set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":start" ) )
|
||||
_r->start = atoll( v );
|
||||
// else if ( ! strcmp( s, ":offset" ) )
|
||||
// _r->offset = atoll( v );
|
||||
// else if ( ! strcmp( s, ":length" ) )
|
||||
// _r->length = atoll( v );
|
||||
else if ( ! strcmp( s, ":selected" ) )
|
||||
{
|
||||
if ( atoi( v ) )
|
||||
select();
|
||||
else
|
||||
deselect();
|
||||
}
|
||||
else if ( ! strcmp( s, ":sequence" ) )
|
||||
{
|
||||
int i;
|
||||
sscanf( v, "%X", &i );
|
||||
Sequence *t = (Sequence*)Loggable::find( i );
|
||||
|
||||
assert( t );
|
||||
|
||||
t->add( this );
|
||||
}
|
||||
// else
|
||||
// e.erase( i );
|
||||
}
|
||||
|
||||
if ( _sequence )
|
||||
_sequence->redraw();
|
||||
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Sequence_Widget::draw_label ( const char *label, Fl_Align align, Fl_Color color )
|
||||
{
|
||||
|
@ -172,7 +224,7 @@ Sequence_Widget::handle ( int m )
|
|||
case FL_RELEASE:
|
||||
if ( _drag )
|
||||
{
|
||||
end_drag();
|
||||
length_drag();
|
||||
_log.release();
|
||||
}
|
||||
|
||||
|
@ -194,15 +246,15 @@ Sequence_Widget::handle ( int m )
|
|||
{
|
||||
const nframes_t of = timeline->x_to_offset( X );
|
||||
|
||||
if ( of >= _drag->offset )
|
||||
if ( of >= _drag->start )
|
||||
{
|
||||
_r->offset = of - _drag->offset;
|
||||
_r->start = of - _drag->start;
|
||||
|
||||
if ( Sequence_Widget::_current == this )
|
||||
sequence()->snap( this );
|
||||
}
|
||||
else
|
||||
_r->offset = 0;
|
||||
_r->start = 0;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -30,21 +30,21 @@ class Sequence_Widget;
|
|||
|
||||
struct Drag
|
||||
{
|
||||
/* mouse coords at start of drag */
|
||||
/* mouse coords at offset of drag */
|
||||
int x;
|
||||
int y;
|
||||
int state;
|
||||
|
||||
nframes_t offset;
|
||||
nframes_t start;
|
||||
|
||||
Drag( int X, int Y, nframes_t offset=0 ) : x( X ), y( Y ), offset( offset ) { state = 0; }
|
||||
Drag( int X, int Y, nframes_t start=0 ) : x( X ), y( Y ), start( start ) { state = 0; }
|
||||
};
|
||||
|
||||
struct Range
|
||||
{
|
||||
nframes_t offset; /* where on the timeline */
|
||||
nframes_t start; /* first sample from clip */
|
||||
nframes_t end; /* last sample from clip */
|
||||
nframes_t start; /* where on the timeline */
|
||||
nframes_t offset; /* first sample from clip */
|
||||
nframes_t length; /* total number of samples */
|
||||
};
|
||||
|
||||
/* Base class for virtual widget on a track */
|
||||
|
@ -79,56 +79,8 @@ protected:
|
|||
|
||||
Drag *_drag;
|
||||
|
||||
|
||||
virtual void get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":x", _r->offset );
|
||||
e.add( ":l", _r->start );
|
||||
e.add( ":r", _r->end );
|
||||
e.add( ":sequence", _sequence );
|
||||
e.add( ":selected", selected() );
|
||||
}
|
||||
|
||||
virtual void
|
||||
set ( Log_Entry &e )
|
||||
{
|
||||
for ( int i = 0; i < e.size(); ++i )
|
||||
{
|
||||
const char *s, *v;
|
||||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":x" ) )
|
||||
_r->offset = atoll( v );
|
||||
else if ( ! strcmp( s, ":l" ) )
|
||||
_r->start = atoll( v );
|
||||
else if ( ! strcmp( s, ":r" ) )
|
||||
_r->end = atoll( v );
|
||||
else if ( ! strcmp( s, ":selected" ) )
|
||||
{
|
||||
if ( atoi( v ) )
|
||||
select();
|
||||
else
|
||||
deselect();
|
||||
}
|
||||
else if ( ! strcmp( s, ":sequence" ) )
|
||||
{
|
||||
int i;
|
||||
sscanf( v, "%X", &i );
|
||||
Sequence *t = (Sequence*)Loggable::find( i );
|
||||
|
||||
assert( t );
|
||||
|
||||
t->add( this );
|
||||
}
|
||||
// else
|
||||
// e.erase( i );
|
||||
}
|
||||
|
||||
if ( _sequence )
|
||||
_sequence->redraw();
|
||||
|
||||
}
|
||||
virtual void get ( Log_Entry &e ) const;
|
||||
virtual void set ( Log_Entry &e );
|
||||
|
||||
public:
|
||||
|
||||
|
@ -138,7 +90,7 @@ public:
|
|||
|
||||
_r = &_range;
|
||||
|
||||
_r->offset = _r->start = _r->end = 0;
|
||||
_r->start = _r->offset = _r->length = 0;
|
||||
|
||||
_drag = NULL;
|
||||
|
||||
|
@ -234,7 +186,7 @@ public:
|
|||
_r = new Range( _range );
|
||||
}
|
||||
|
||||
void end_drag ( void )
|
||||
void length_drag ( void )
|
||||
{
|
||||
_range = *_r;
|
||||
delete _r;
|
||||
|
@ -245,26 +197,26 @@ public:
|
|||
}
|
||||
|
||||
void
|
||||
offset ( nframes_t where )
|
||||
start ( nframes_t where )
|
||||
{
|
||||
|
||||
if ( ! selected() )
|
||||
{
|
||||
redraw();
|
||||
_r->offset = where;
|
||||
_r->start = where;
|
||||
}
|
||||
else
|
||||
{
|
||||
long d = where - _r->offset;
|
||||
long d = where - _r->start;
|
||||
|
||||
for ( list <Sequence_Widget *>::iterator i = _selection.begin(); i != _selection.end(); i++ )
|
||||
{
|
||||
(*i)->redraw();
|
||||
|
||||
if ( d < 0 )
|
||||
(*i)->_r->offset -= 0 - d;
|
||||
(*i)->_r->start -= 0 - d;
|
||||
else
|
||||
(*i)->_r->offset += d;
|
||||
(*i)->_r->start += d;
|
||||
|
||||
}
|
||||
}
|
||||
|
@ -284,18 +236,18 @@ public:
|
|||
/* used by regions */
|
||||
virtual int x ( void ) const
|
||||
{
|
||||
return _r->offset < timeline->xoffset ? _sequence->x() : min( _sequence->x() + _sequence->w(), _sequence->x() + timeline->ts_to_x( _r->offset - timeline->xoffset ) );
|
||||
return _r->start < timeline->xoffset ? _sequence->x() : min( _sequence->x() + _sequence->w(), _sequence->x() + timeline->ts_to_x( _r->start - timeline->xoffset ) );
|
||||
}
|
||||
|
||||
/* use this as x() when you need to draw lines between widgets */
|
||||
int line_x ( void ) const
|
||||
{
|
||||
return _r->offset < timeline->xoffset ? max( -32768, _sequence->x() - timeline->ts_to_x( timeline->xoffset - _r->offset )) : min( 32767, _sequence->x() + timeline->ts_to_x( _r->offset - timeline->xoffset ) );
|
||||
return _r->start < timeline->xoffset ? max( -32768, _sequence->x() - timeline->ts_to_x( timeline->xoffset - _r->start )) : min( 32767, _sequence->x() + timeline->ts_to_x( _r->start - timeline->xoffset ) );
|
||||
}
|
||||
|
||||
virtual int w ( void ) const
|
||||
{
|
||||
int tx = timeline->ts_to_x( _r->offset );
|
||||
int tx = timeline->ts_to_x( _r->start );
|
||||
|
||||
int rw;
|
||||
if ( tx < scroll_x() )
|
||||
|
@ -306,8 +258,8 @@ public:
|
|||
return min( rw, _sequence->w() );
|
||||
}
|
||||
|
||||
int abs_x ( void ) const { return timeline->ts_to_x( _r->offset ); }
|
||||
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->end - _r->start ); }
|
||||
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); }
|
||||
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->length ); }
|
||||
|
||||
Fl_Color color ( void ) const { return _color; }
|
||||
void color ( Fl_Color v ) { _color = v; }
|
||||
|
@ -318,22 +270,21 @@ public:
|
|||
Sequence * sequence ( void ) const { return _sequence; }
|
||||
void sequence ( Sequence *t ) { _sequence = t; }
|
||||
|
||||
nframes_t offset ( void ) const { return _r->offset; }
|
||||
// void offset ( nframes_t o ) { _r->offset = o; }
|
||||
|
||||
void end ( nframes_t v ) { _r->end = v; }
|
||||
nframes_t end ( void ) const { return _r->end; }
|
||||
void start ( nframes_t v ) { _r->start = v; }
|
||||
nframes_t start ( void ) const { return _r->start; }
|
||||
// void start ( nframes_t o ) { _r->start = o; }
|
||||
|
||||
/** convert a screen x coord into an offset into the region */
|
||||
void length ( nframes_t v ) { _r->length = v; }
|
||||
virtual nframes_t length ( void ) const { return _r->length; }
|
||||
void offset ( nframes_t v ) { _r->offset = v; }
|
||||
nframes_t offset ( void ) const { return _r->offset; }
|
||||
|
||||
/** convert a screen x coord into an start into the region */
|
||||
nframes_t x_to_offset ( int X )
|
||||
{
|
||||
return timeline->x_to_ts( scroll_x() + ( X - _sequence->x() ) ) - _r->offset;
|
||||
return timeline->x_to_ts( scroll_x() + ( X - _sequence->x() ) ) - _r->start;
|
||||
}
|
||||
|
||||
int active_r ( void ) const { return _sequence->active_r(); }
|
||||
virtual nframes_t length ( void ) const { return _r->end - _r->start; }
|
||||
|
||||
virtual Fl_Boxtype box ( void ) const { return FL_UP_BOX; }
|
||||
virtual Fl_Align align ( void ) const { return (Fl_Align)0; }
|
||||
|
@ -366,13 +317,13 @@ public:
|
|||
bool
|
||||
operator< ( const Sequence_Widget & rhs )
|
||||
{
|
||||
return _r->offset < rhs._r->offset;
|
||||
return _r->start < rhs._r->start;
|
||||
}
|
||||
|
||||
bool
|
||||
operator<=( const Sequence_Widget & rhs )
|
||||
{
|
||||
return _r->offset <= rhs._r->offset;
|
||||
return _r->start <= rhs._r->start;
|
||||
}
|
||||
|
||||
virtual void draw_label ( const char *label, Fl_Align align, Fl_Color color=(Fl_Color)0 );
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
void
|
||||
Tempo_Point::get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":x", _r->offset );
|
||||
e.add( ":start", _r->offset );
|
||||
e.add( ":tempo", _tempo );
|
||||
}
|
||||
|
||||
|
@ -38,7 +38,7 @@ Tempo_Point::set ( Log_Entry &e )
|
|||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":x" ) )
|
||||
if ( ! strcmp( s, ":start" ) )
|
||||
_r->offset = atol( v );
|
||||
else if ( ! strcmp( s, ":tempo" ) )
|
||||
_tempo = atof( v );
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
void
|
||||
Time_Point::get ( Log_Entry &e ) const
|
||||
{
|
||||
e.add( ":x", _r->offset );
|
||||
e.add( ":start", _r->offset );
|
||||
e.add( ":beats_per_bar", _time.beats_per_bar );
|
||||
e.add( ":beat_type", _time.beat_type );
|
||||
}
|
||||
|
@ -38,7 +38,7 @@ Time_Point::set ( Log_Entry &e )
|
|||
|
||||
e.get( i, &s, &v );
|
||||
|
||||
if ( ! strcmp( s, ":x" ) )
|
||||
if ( ! strcmp( s, ":start" ) )
|
||||
_r->offset = atol( v );
|
||||
else if ( ! strcmp( s, ":beats_per_bar" ) )
|
||||
_time.beats_per_bar = atoi( v );
|
||||
|
|
Loading…
Reference in New Issue