|
|
@@ -99,8 +99,8 @@ Record_DS::disk_thread ( void ) |
|
|
|
bool punching_out = false; |
|
|
|
bool punched_in = false; |
|
|
|
|
|
|
|
nframes_t bS = 0; |
|
|
|
nframes_t bE = 0; |
|
|
|
nframes_t bS = 0; /* block start */ |
|
|
|
nframes_t bE = 0; /* block end */ |
|
|
|
|
|
|
|
again: |
|
|
|
|
|
|
@@ -109,14 +109,14 @@ again: |
|
|
|
punched_in = false; |
|
|
|
punching_out = false; |
|
|
|
|
|
|
|
nframes_t pS = _frame; |
|
|
|
nframes_t pE = _stop_frame; |
|
|
|
nframes_t pS = _frame; /* punch start */ |
|
|
|
nframes_t pE = _stop_frame; /* punch end */ |
|
|
|
|
|
|
|
if ( punching_in ) |
|
|
|
{ |
|
|
|
/* write remainder of buffer */ |
|
|
|
write_block( buf + ((pS - bS) * channels()), |
|
|
|
bE - pS ); |
|
|
|
bE - pS ); |
|
|
|
|
|
|
|
punching_in = false; |
|
|
|
punched_in = true; |
|
|
@@ -147,29 +147,48 @@ again: |
|
|
|
frames_read += frames_to_read; |
|
|
|
|
|
|
|
bE = _first_frame + frames_read; |
|
|
|
|
|
|
|
punching_in = ! punched_in && bE > pS; |
|
|
|
punching_out = punched_in && pE < bE; |
|
|
|
|
|
|
|
if ( punching_out ) |
|
|
|
if ( ! punched_in && bS > pS ) |
|
|
|
{ |
|
|
|
write_block( buf, |
|
|
|
pE - bS ); |
|
|
|
|
|
|
|
break; |
|
|
|
/* we're supposed to be punching in but don't have data |
|
|
|
until a later frame... write null data instead. FIXME: |
|
|
|
it would probably be better to just have the record |
|
|
|
threads running all the time so that there would always |
|
|
|
have some actual data to write here */ |
|
|
|
sample_t nbuf[bS - pS]; |
|
|
|
memset(nbuf,0,bS - pS); |
|
|
|
write_block(nbuf, pS - pS); |
|
|
|
write_block(buf,frames_to_read); |
|
|
|
punched_in = true; |
|
|
|
punching_in = false; |
|
|
|
} |
|
|
|
else |
|
|
|
if ( punching_in ) |
|
|
|
{ |
|
|
|
write_block( buf + ((pS - bS) * channels()), |
|
|
|
bE - pS ); |
|
|
|
punching_in = ! punched_in && bE > pS; |
|
|
|
punching_out = punched_in && pE < bE; |
|
|
|
|
|
|
|
punching_in = false; |
|
|
|
punched_in = true; |
|
|
|
} |
|
|
|
else if ( punched_in ) |
|
|
|
{ |
|
|
|
write_block( buf, bE - bS ); |
|
|
|
if ( punching_out ) |
|
|
|
{ |
|
|
|
write_block( buf, |
|
|
|
pE - bS ); |
|
|
|
|
|
|
|
break; |
|
|
|
} |
|
|
|
else if ( punching_in ) |
|
|
|
{ |
|
|
|
assert( pS >= bS ); |
|
|
|
assert( bE >= pS ); |
|
|
|
|
|
|
|
write_block( buf + ((pS - bS) * channels()), |
|
|
|
bE - pS ); |
|
|
|
|
|
|
|
punching_in = false; |
|
|
|
punched_in = true; |
|
|
|
} |
|
|
|
else if ( punched_in ) |
|
|
|
{ |
|
|
|
write_block( buf, bE - bS ); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|