Changeset 3020:c506c0704832 in roaraudio


Ignore:
Timestamp:
10/31/09 14:21:51 (14 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added basic ringbuffer stuff

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroar/buffer.c

    r2976 r3020  
    137137 ROAR_DBG("buffer_add(buf=%p, next=%p) = ?", buf, next); 
    138138 
     139 if ( buf->flags & ROAR_BUFFER_FLAG_RING ) 
     140  return -1; 
     141 
    139142 if ( buf == next ) { 
    140143  ROAR_ERR("buffer_add(*): both pointer are of the same destination, This is a error in the application"); 
     
    169172} 
    170173 
     174int roar_buffer_ring_new (struct roar_buffer ** buf, size_t len, int free_running) { 
     175 struct roar_buffer * n; 
     176 
     177 if ( buf == NULL || len == 0 ) 
     178  return -1; 
     179 
     180 // just to be sure: 
     181 *buf = NULL; 
     182 
     183 // currently we are limited to free running mode 
     184 if ( !free_running ) 
     185  return -1; 
     186 
     187 if ( roar_buffer_new(&n, len) == -1 ) 
     188  return -1; 
     189 
     190 n->flags |= ROAR_BUFFER_FLAG_RING; 
     191 
     192 if ( free_running ) 
     193  n->flags |= ROAR_BUFFER_FLAG_FREE_RUNNING; 
     194 
     195 n->meta.ring.read_pos  = 0; 
     196 n->meta.ring.write_pos = 0; 
     197 
     198 memset(n->data, 0, n->len); 
     199 
     200 *buf = n; 
     201 
     202 return 0; 
     203} 
     204 
    171205int roar_buffer_get_data (struct roar_buffer *  buf, void   ** data) { 
    172206 if ( buf == NULL ) 
     
    382416} 
    383417 
     418int roar_buffer_ring_read  (struct roar_buffer *  buf, void * data, size_t * len) { 
     419 if ( buf == NULL || len == NULL ) 
     420  return -1; 
     421 
     422 if ( data == NULL && *len != 0 ) 
     423  return -1; 
     424 
     425 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
     426  return -1; 
     427 
     428 if ( *len == 0 ) 
     429  return 0; 
     430 
     431 // we may handle this later: 
     432 if ( *len > buf->user_len ) 
     433  return -1; 
     434 
     435 if ( buf->meta.ring.read_pos >= buf->user_len ) 
     436  buf->meta.ring.read_pos -= buf->user_len; 
     437 
     438 if ( (*len + buf->meta.ring.read_pos) > buf->user_len ) { 
     439  // wraped mode: 
     440  memcpy(data, buf->user_data+buf->meta.ring.read_pos, buf->user_len - buf->meta.ring.read_pos); 
     441  memcpy(data, buf->user_data, *len + buf->meta.ring.read_pos - buf->user_len); 
     442 
     443  buf->meta.ring.read_pos += *len; 
     444  buf->meta.ring.read_pos -= buf->user_len; 
     445  return 0; 
     446 } else { 
     447  // unwarped mode: 
     448  memcpy(data, buf->user_data+buf->meta.ring.read_pos, *len); 
     449  buf->meta.ring.read_pos += *len; 
     450  return 0; 
     451 } 
     452 
     453 return -1; 
     454} 
     455 
     456int roar_buffer_ring_write (struct roar_buffer *  buf, void * data, size_t * len) { 
     457 if ( buf == NULL || len == NULL ) 
     458  return -1; 
     459 
     460 if ( data == NULL && *len != 0 ) 
     461  return -1; 
     462 
     463 if ( !(buf->flags & ROAR_BUFFER_FLAG_RING) ) 
     464  return -1; 
     465 
     466 if ( *len == 0 ) 
     467  return 0; 
     468 
     469 // we may handle this later: 
     470 if ( *len > buf->user_len ) 
     471  return -1; 
     472 
     473 if ( buf->meta.ring.write_pos >= buf->user_len ) 
     474  buf->meta.ring.write_pos -= buf->user_len; 
     475 
     476 if ( (*len + buf->meta.ring.write_pos) > buf->user_len ) { 
     477  // wraped mode: 
     478  memcpy(buf->user_data+buf->meta.ring.write_pos, data, buf->user_len - buf->meta.ring.write_pos); 
     479  memcpy(buf->user_data, data, *len + buf->meta.ring.write_pos - buf->user_len); 
     480 
     481  buf->meta.ring.write_pos += *len; 
     482  buf->meta.ring.write_pos -= buf->user_len; 
     483  return 0; 
     484 } else { 
     485  // unwarped mode: 
     486  memcpy(buf->user_data+buf->meta.ring.write_pos, data, *len); 
     487  buf->meta.ring.write_pos += *len; 
     488  return 0; 
     489 } 
     490 
     491 return -1; 
     492} 
     493 
    384494//ll 
Note: See TracChangeset for help on using the changeset viewer.