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