Changeset 4615:1406da02b52e in roaraudio


Ignore:
Timestamp:
11/21/10 20:41:21 (13 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

done some code for non-free running ring buffer

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/buffer.c

    r4522 r4615  
    481481 
    482482int roar_buffer_ring_read  (struct roar_buffer *  buf, void * data, size_t * len) { 
     483 struct roar_buffer_ring * ring; 
     484 size_t havelen; 
     485 size_t done; 
     486 size_t tmp; 
     487 
    483488 if ( buf == NULL || len == NULL ) 
    484489  return -1; 
     
    497502  return -1; 
    498503 
    499  if ( buf->meta.ring.read_pos >= buf->user_len ) 
    500   buf->meta.ring.read_pos -= buf->user_len; 
    501  
    502  if ( (*len + buf->meta.ring.read_pos) > buf->user_len ) { 
    503   // wraped mode: 
    504   memcpy(data, buf->user_data+buf->meta.ring.read_pos, buf->user_len - buf->meta.ring.read_pos); 
    505   memcpy(data, buf->user_data, *len + buf->meta.ring.read_pos - buf->user_len); 
    506  
    507   buf->meta.ring.read_pos += *len; 
    508   buf->meta.ring.read_pos -= buf->user_len; 
    509   return 0; 
     504 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { 
     505  if ( buf->meta.ring.read_pos >= buf->user_len ) 
     506   buf->meta.ring.read_pos -= buf->user_len; 
     507 
     508  if ( (*len + buf->meta.ring.read_pos) > buf->user_len ) { 
     509   // wraped mode: 
     510   memcpy(data, buf->user_data+buf->meta.ring.read_pos, buf->user_len - buf->meta.ring.read_pos); 
     511   memcpy(data, buf->user_data, *len + buf->meta.ring.read_pos - buf->user_len); 
     512  
     513   buf->meta.ring.read_pos += *len; 
     514   buf->meta.ring.read_pos -= buf->user_len; 
     515   return 0; 
     516  } else { 
     517   // unwarped mode: 
     518   memcpy(data, buf->user_data+buf->meta.ring.read_pos, *len); 
     519   buf->meta.ring.read_pos += *len; 
     520   return 0; 
     521  } 
    510522 } else { 
    511   // unwarped mode: 
    512   memcpy(data, buf->user_data+buf->meta.ring.read_pos, *len); 
    513   buf->meta.ring.read_pos += *len; 
    514   return 0; 
     523  ring = &(buf->meta.ring); 
     524 
     525  if ( ring->read_pos == ring->write_pos ) { 
     526   *len = 0; 
     527   return 0; 
     528  } else if ( ring->read_pos < ring->write_pos ) { 
     529   havelen = ring->write_pos - ring->read_pos; 
     530 
     531   if ( havelen > *len ) 
     532    havelen = *len; 
     533 
     534   memcpy(data, buf->user_data+ring->read_pos, havelen); 
     535   ring->read_pos += havelen; 
     536 
     537   *len = havelen; 
     538   return 0; 
     539  } else { // write_pos < read_pos 
     540   done = 0; 
     541 
     542   // first pass: use data up to end of buffer 
     543 
     544   havelen = buf->user_len - ring->read_pos; 
     545 
     546   if ( havelen > *len ) 
     547    havelen = *len; 
     548 
     549   memcpy(data, buf->user_data+ring->read_pos, havelen); 
     550   ring->read_pos += havelen; 
     551 
     552   done += havelen; 
     553 
     554   if ( ring->read_pos == buf->user_len ) { 
     555    ring->read_pos = 0; 
     556   } 
     557 
     558   // second pass: use data from strat of buffer to write pointer 
     559 
     560   if ( *len > done ) { 
     561    tmp = *len - done; 
     562    if ( roar_buffer_ring_read(buf, data+done, &tmp) == 0 ) { 
     563     done += tmp; 
     564    } 
     565   } 
     566 
     567   *len = done; 
     568   return 0; 
     569  } 
     570 
     571  return -1; 
    515572 } 
    516573 
     
    535592  return -1; 
    536593 
    537  if ( buf->meta.ring.write_pos >= buf->user_len ) 
    538   buf->meta.ring.write_pos -= buf->user_len; 
    539  
    540  if ( (*len + buf->meta.ring.write_pos) > buf->user_len ) { 
    541   // wraped mode: 
    542   memcpy(buf->user_data+buf->meta.ring.write_pos, data, buf->user_len - buf->meta.ring.write_pos); 
    543   memcpy(buf->user_data, data, *len + buf->meta.ring.write_pos - buf->user_len); 
    544  
    545   buf->meta.ring.write_pos += *len; 
    546   buf->meta.ring.write_pos -= buf->user_len; 
    547   return 0; 
     594 if ( (buf->flags & ROAR_BUFFER_FLAG_FREE_RUNNING) ) { 
     595  if ( buf->meta.ring.write_pos >= buf->user_len ) 
     596   buf->meta.ring.write_pos -= buf->user_len; 
     597 
     598  if ( (*len + buf->meta.ring.write_pos) > buf->user_len ) { 
     599   // wraped mode: 
     600   memcpy(buf->user_data+buf->meta.ring.write_pos, data, buf->user_len - buf->meta.ring.write_pos); 
     601   memcpy(buf->user_data, data, *len + buf->meta.ring.write_pos - buf->user_len); 
     602 
     603   buf->meta.ring.write_pos += *len; 
     604   buf->meta.ring.write_pos -= buf->user_len; 
     605   return 0; 
     606  } else { 
     607   // unwarped mode: 
     608   memcpy(buf->user_data+buf->meta.ring.write_pos, data, *len); 
     609   buf->meta.ring.write_pos += *len; 
     610   return 0; 
     611  } 
    548612 } else { 
    549   // unwarped mode: 
    550   memcpy(buf->user_data+buf->meta.ring.write_pos, data, *len); 
    551   buf->meta.ring.write_pos += *len; 
    552   return 0; 
     613  return -1; 
    553614 } 
    554615 
Note: See TracChangeset for help on using the changeset viewer.