| @@ -118,19 +118,24 @@ Audio_Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channe | |||||
| if ( _loop ) | 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 | else | ||||
| cnt = _clip->read( buf + ofs, channel, start, len ); | cnt = _clip->read( buf + ofs, channel, start, len ); | ||||