Changeset 1059:dcb32066a3d6 in roaraudio


Ignore:
Timestamp:
12/24/08 12:13:14 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added support for conv from bigger to smaller size

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/convert.c

    r876 r1059  
    574574int roar_conv       (void * out, void * in, int samples, struct roar_audio_info * from, struct roar_audio_info * to) { 
    575575 void * ip = in; 
     576 void * real_out; 
     577 size_t from_size, to_size; 
    576578 
    577579 // TODO: decide how to work around both in and out beeing to small to hold all 
     
    579581 //       for the moment: guess out >= in 
    580582 
     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 
    581593 ROAR_DBG("roar_conv(*): bo conv: %i->%i(native)", ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN); 
    582594 
    583595 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 
    584596  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 { 
    588602   ip = out; 
     603  } 
    589604 } 
    590605 
    591606 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 { 
    595612   ip = out; 
     613  } 
    596614 } 
    597615 
    598616 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 { 
    602622   ip = out; 
     623  } 
    603624 } 
    604625 
     
    613634 
    614635 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 { 
    618641   ip = out; 
     642  } 
    619643 } 
    620644 
    621645 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 { 
    625651   ip = out; 
     652  } 
    626653 } 
    627654 
    628655 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 { 
    632661   ip = out; 
     662  } 
     663 } 
     664 
     665 if ( to_size < from_size ) { 
     666  memcpy(real_out, out, to_size); 
     667  free(out); 
    633668 } 
    634669 
Note: See TracChangeset for help on using the changeset viewer.