Changeset 3020:c506c0704832 in roaraudio
- Timestamp:
- 10/31/09 14:21:51 (14 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/buffer.c
r2976 r3020 137 137 ROAR_DBG("buffer_add(buf=%p, next=%p) = ?", buf, next); 138 138 139 if ( buf->flags & ROAR_BUFFER_FLAG_RING ) 140 return -1; 141 139 142 if ( buf == next ) { 140 143 ROAR_ERR("buffer_add(*): both pointer are of the same destination, This is a error in the application"); … … 169 172 } 170 173 174 int 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 171 205 int roar_buffer_get_data (struct roar_buffer * buf, void ** data) { 172 206 if ( buf == NULL ) … … 382 416 } 383 417 418 int 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 456 int 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 384 494 //ll
Note: See TracChangeset
for help on using the changeset viewer.