Changeset 1059:dcb32066a3d6 in roaraudio
- Timestamp:
- 12/24/08 12:13:14 (15 years ago)
- Branch:
- default
- Phase:
- public
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libroardsp/convert.c
r876 r1059 574 574 int roar_conv (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) { 575 575 void * ip = in; 576 void * real_out; 577 size_t from_size, to_size; 576 578 577 579 // TODO: decide how to work around both in and out beeing to small to hold all … … 579 581 // for the moment: guess out >= in 580 582 583 from_size = from->channels * from->bits * samples / 8; 584 to_size = to->channels * to->bits * samples / 8; 585 586 if ( to_size < from_size ) { 587 real_out = out; 588 589 if ( (out = malloc(from_size)) == NULL ) 590 return -1; 591 } 592 581 593 ROAR_DBG("roar_conv(*): bo conv: %i->%i(native)", ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN); 582 594 583 595 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 584 596 ROAR_DBG("roar_conv(*): doing bo input conv"); 585 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, from->bits) == -1 ) 586 return -1; 587 else 597 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, from->bits) == -1 ) { 598 if ( to_size < from_size ) 599 free(out); 600 return -1; 601 } else { 588 602 ip = out; 603 } 589 604 } 590 605 591 606 if ( from->bits != to->bits ) { 592 if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) 593 return -1; 594 else 607 if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) { 608 if ( to_size < from_size ) 609 free(out); 610 return -1; 611 } else { 595 612 ip = out; 613 } 596 614 } 597 615 598 616 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) { 599 if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) 600 return -1; 601 else 617 if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) { 618 if ( to_size < from_size ) 619 free(out); 620 return -1; 621 } else { 602 622 ip = out; 623 } 603 624 } 604 625 … … 613 634 614 635 if ( from->rate != to->rate ) { 615 if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) 616 return -1; 617 else 636 if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) { 637 if ( to_size < from_size ) 638 free(out); 639 return -1; 640 } else { 618 641 ip = out; 642 } 619 643 } 620 644 621 645 if ( from->channels != to->channels ) { 622 if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) 623 return -1; 624 else 646 if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) { 647 if ( to_size < from_size ) 648 free(out); 649 return -1; 650 } else { 625 651 ip = out; 652 } 626 653 } 627 654 628 655 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 629 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) 630 return -1; 631 else 656 if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) { 657 if ( to_size < from_size ) 658 free(out); 659 return -1; 660 } else { 632 661 ip = out; 662 } 663 } 664 665 if ( to_size < from_size ) { 666 memcpy(real_out, out, to_size); 667 free(out); 633 668 } 634 669
Note: See TracChangeset
for help on using the changeset viewer.