Changeset 4615:1406da02b52e in roaraudio for libroar/buffer.c
- Timestamp:
- 11/21/10 20:41:21 (13 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroar/buffer.c
r4522 r4615 481 481 482 482 int 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 483 488 if ( buf == NULL || len == NULL ) 484 489 return -1; … … 497 502 return -1; 498 503 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 } 510 522 } 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; 515 572 } 516 573 … … 535 592 return -1; 536 593 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 } 548 612 } 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; 553 614 } 554 615
Note: See TracChangeset
for help on using the changeset viewer.