|
|
@@ -118,19 +118,24 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe |
|
|
|
|
|
|
|
if ( _loop ) |
|
|
|
{ |
|
|
|
nframes_t lofs = sofs % _loop; |
|
|
|
nframes_t lstart = r.offset + lofs; |
|
|
|
|
|
|
|
/* /\* keep things simple *\/ */ |
|
|
|
/* assert( _loop > len ); */ |
|
|
|
|
|
|
|
nframes_t lstart = r.offset + ( sofs % _loop ); |
|
|
|
if ( lofs + len > _loop ) |
|
|
|
{ |
|
|
|
/* this buffer covers a loop bounary */ |
|
|
|
|
|
|
|
cnt = _clip->read( buf + ofs, channel, lstart, len ); |
|
|
|
/* read the first part */ |
|
|
|
cnt = _clip->read( buf + ofs, channel, lstart, len - ( ( lofs + len ) - _loop ) ); |
|
|
|
/* read the second part */ |
|
|
|
cnt += _clip->read( buf + ofs + cnt, channel, lstart + cnt, len - cnt ); |
|
|
|
|
|
|
|
/* /\* read the part before the loop point *\/ */ |
|
|
|
/* cnt = _clip->read( buf + ofs, channel, start, min( len, _loop - start ) ); */ |
|
|
|
/* /\* read the part after the loop point *\/ */ |
|
|
|
/* cnt += _clip->read( buf + ofs + cnt, channel, _loop, len - cnt ); */ |
|
|
|
/* TODO: declick/crossfade transition? */ |
|
|
|
|
|
|
|
assert( cnt == len ); |
|
|
|
} |
|
|
|
else |
|
|
|
cnt = _clip->read( buf + ofs, channel, lstart, len ); |
|
|
|
} |
|
|
|
else |
|
|
|
cnt = _clip->read( buf + ofs, channel, start, len ); |
|
|
|