offset start end -> start offset length
This commit is contained in:
parent
8a048e6ef2
commit
6bb4a1d066
|
@ -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
|
void
|
||||||
/* perhaps use map? */
|
Audio_Region::get ( Log_Entry &e ) const
|
||||||
map_PRIM ( set )
|
|
||||||
{
|
{
|
||||||
/* if ( narg % 2 != 0 ) */
|
e.add( ":source", _clip ? _clip->name() : "" );
|
||||||
/* printf( "invalid number of arguments\n" ); */
|
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 );
|
e.add( ":offset", _r->offset );
|
||||||
|
}
|
||||||
Logable *l = Loggable::find( id );
|
|
||||||
|
void
|
||||||
char **sa = malloc( sizeof( char * ) * narg + 1 );
|
Audio_Region::set ( Log_Entry &e )
|
||||||
|
{
|
||||||
for ( int i = 0; i < narg; ++i )
|
for ( int i = 0; i < e.size(); ++i )
|
||||||
sa[ i ] = strdup( map_ARG_NEXT( arg, end ) );
|
{
|
||||||
|
const char *s, *v;
|
||||||
l->set( sa );
|
|
||||||
|
e.get( i, &s, &v );
|
||||||
map_RESULT( "" );
|
|
||||||
|
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
|
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->offset = os - td;
|
||||||
|
|
||||||
_r->end = _r->start + W;
|
|
||||||
|
|
||||||
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 );
|
int rw = timeline->ts_to_x( _r->length );
|
||||||
// nframes_t end = _r->offset + ( _r->end - _r->start );
|
|
||||||
|
|
||||||
/* 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;
|
||||||
|
virtual void set ( Log_Entry &e );
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
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 );
|
Sequence_Widget::get( e );
|
||||||
e.add( ":sequence", _sequence );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 )
|
if ( td < 0 && _r->offset < 0 - td )
|
||||||
td = 0 - _r->start;
|
td = 0 - _r->offset;
|
||||||
|
|
||||||
if ( _r->start + td >= _r->end )
|
if ( td > 0 && td >= _r->length )
|
||||||
td = (_r->end - _r->start) - timeline->x_to_ts( 1 );
|
td = _r->length - 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 )
|
if ( td >= 0 && _r->length < td )
|
||||||
_r->end = _r->start + timeline->x_to_ts( 1 );
|
_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
|
virtual void get ( Log_Entry &e ) const;
|
||||||
{
|
virtual void set ( Log_Entry &e );
|
||||||
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 );
|
|
||||||
}
|
|
||||||
|
|
||||||
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; /* where on the timeline */
|
||||||
nframes_t start; /* first sample from clip */
|
nframes_t offset; /* first sample from clip */
|
||||||
nframes_t end; /* last 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;
|
||||||
virtual void get ( Log_Entry &e ) const
|
virtual void set ( Log_Entry &e );
|
||||||
{
|
|
||||||
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();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
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 ); }
|
int abs_x ( void ) const { return timeline->ts_to_x( _r->start ); }
|
||||||
virtual int abs_w ( void ) const { return timeline->ts_to_x( _r->end - _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; }
|
||||||
|
|
||||||
/** 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 )
|
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 );
|
||||||
|
|
Loading…
Reference in New Issue