Changeset 4624:7cdf88681b49 in roaraudio
- Timestamp:
- 11/27/10 00:32:39 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/buffer.c
r4615 r4624 235 235 *buf = NULL; 236 236 237 // currently we are limited to free running mode238 if ( !free_running )239 return -1;240 241 237 if ( roar_buffer_new(&n, len) == -1 ) 242 238 return -1; … … 576 572 577 573 int roar_buffer_ring_write (struct roar_buffer * buf, void * data, size_t * len) { 574 struct roar_buffer_ring * ring; 575 size_t havelen; 576 size_t done; 577 size_t tmp; 578 578 579 if ( buf == NULL || len == NULL ) 579 580 return -1; … … 611 612 } 612 613 } else { 614 ring = &(buf->meta.ring); 615 done = 0; 616 617 ROAR_DBG("roar_buffer_ring_write(buf=%p, data=%p, len=%p): write_pos=%u, read_pos=%u, user_len=%u", buf, data, len, (unsigned int)ring->write_pos, (unsigned int)ring->read_pos, (unsigned int)buf->user_len); 618 619 if ( ring->write_pos >= ring->read_pos ) { 620 havelen = buf->user_len - ring->write_pos; 621 622 if ( ring->read_pos == 0 ) 623 havelen--; 624 625 if ( havelen > *len ) 626 havelen = *len; 627 628 memcpy(buf->user_data+ring->write_pos, data, havelen); 629 630 done += havelen; 631 ring->write_pos += havelen; 632 633 if ( ring->write_pos == buf->user_len ) 634 ring->write_pos = 0; 635 636 if ( *len > done && ring->read_pos != 0 ) { 637 tmp = *len - done; 638 if ( roar_buffer_ring_write(buf, data+done, &tmp) == 0 ) { 639 done += tmp; 640 } 641 } 642 643 *len = done; 644 return 0; 645 } else { 646 // test for buffer-is-full: 647 if ( (ring->write_pos + 1) == ring->read_pos ) { 648 *len = 0; 649 return 0; 650 } 651 652 havelen = ring->read_pos - ring->write_pos - 1; 653 654 if ( havelen > *len ) 655 havelen = *len; 656 657 memcpy(buf->user_data+ring->write_pos, data, havelen); 658 659 *len = havelen; 660 return 0; 661 } 662 613 663 return -1; 614 664 }
Note: See TracChangeset
for help on using the changeset viewer.