Changeset 875:3df25f7ae32d in roaraudio for libroardsp/convert.c


Ignore:
Timestamp:
10/21/08 22:31:28 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added roar_conv_signedness() and roar_conv_endian(), changed roar_conv_codec() and roar_conv(), at least its not working less good than before

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/convert.c

    r871 r875  
    331331} 
    332332 
    333 int raor_conv_codec (void * out, void * in, int samples, int from, int to, int bits) { 
    334  int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to); 
    335  int ins  = ROAR_CODEC_IS_SIGNED(from),  outs  = ROAR_CODEC_IS_SIGNED(to); 
    336  void * nin = in; 
    337  
    338  if ( bits == 8 ) { 
    339   inbo = outbo = ROAR_CODEC_NATIVE_ENDIAN; 
    340  
    341  } else if ( bits == 16 ) { 
    342   if ( inbo  == ROAR_CODEC_PDP ) 
    343    inbo  = ROAR_CODEC_LE; 
    344   if ( outbo == ROAR_CODEC_PDP ) 
    345    outbo = ROAR_CODEC_LE; 
    346  } 
    347  
    348  ROAR_DBG("raor_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?", 
    349               out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits); 
    350  
    351  if ( inbo != outbo ) { 
    352    if ( bits == 16 ) { 
    353     // in this case we can only have LE vs. BE, so, only need to swap: 
    354     roar_conv_endian_16(out, nin, samples); 
    355     nin = out; 
    356    } else if ( bits == 24 ) { 
    357     if ( (inbo == ROAR_CODEC_LE || inbo == ROAR_CODEC_BE) && (outbo == ROAR_CODEC_LE || outbo == ROAR_CODEC_BE) ) { 
    358      roar_conv_endian_24(out, nin, samples); 
    359      nin = out; 
    360     } else { // what the hell is PDP eddines in 24 bit mode? 
    361      return -1; 
    362     } 
    363    } else if ( bits == 32 ) { 
    364     if ( (inbo == ROAR_CODEC_LE || inbo == ROAR_CODEC_BE) && (outbo == ROAR_CODEC_LE || outbo == ROAR_CODEC_BE) ) { 
    365      roar_conv_endian_32(out, nin, samples); 
    366      nin = out; 
    367     } else { // need to handle 32 PDP eddines here? 
    368      return -1; 
    369     } 
    370    } else { 
    371     return -1; 
    372    } 
    373  } 
    374  
    375  if ( ins != outs ) { 
    376   if ( ins && !outs ) { 
     333int roar_conv_signedness  (void * out, void * in, int samples, int from, int to, int bits) { 
     334 
     335 if ( from != to ) { 
     336  if ( from && !to ) { 
    377337   switch (bits) { 
    378     case  8: roar_conv_codec_s2u8( out, nin, samples); break; 
    379     case 16: roar_conv_codec_s2u16(out, nin, samples); break; 
    380     case 32: roar_conv_codec_s2u32(out, nin, samples); break; 
     338    case  8: roar_conv_codec_s2u8( out, in, samples); break; 
     339    case 16: roar_conv_codec_s2u16(out, in, samples); break; 
     340    case 32: roar_conv_codec_s2u32(out, in, samples); break; 
    381341    default: 
    382342     errno = ENOSYS; 
    383343     return -1; 
    384344   } 
    385   } else if ( !ins && outs ) { 
     345  } else if ( !from && to ) { 
    386346   switch (bits) { 
    387     case  8: roar_conv_codec_u2s8( out, nin, samples); break; 
    388     case 16: roar_conv_codec_u2s16(out, nin, samples); break; 
    389     case 32: roar_conv_codec_u2s32(out, nin, samples); break; 
     347    case  8: roar_conv_codec_u2s8( out, in, samples); break; 
     348    case 16: roar_conv_codec_u2s16(out, in, samples); break; 
     349    case 32: roar_conv_codec_u2s32(out, in, samples); break; 
    390350    default: 
    391351     errno = ENOSYS; 
     
    393353   } 
    394354  } else { 
    395    return -1; 
    396   } 
    397  } 
    398  
    399  return 0; 
     355   if ( out == in ) 
     356    return 0; 
     357 
     358   memcpy(out, in, samples * bits / 8); 
     359   return 0; 
     360  } 
     361 } 
     362 
     363 return -1; 
     364} 
     365 
     366int raor_conv_codec (void * out, void * in, int samples, int from, int to, int bits) { 
     367 int inbo = ROAR_CODEC_BYTE_ORDER(from), outbo = ROAR_CODEC_BYTE_ORDER(to); 
     368 int ins  = ROAR_CODEC_IS_SIGNED(from),  outs  = ROAR_CODEC_IS_SIGNED(to); 
     369 void * nin = in; 
     370 
     371 
     372 ROAR_DBG("raor_conv_codec(out=%p, in=%p, samples=%i, from=%i(%s), to=%i(%s), bits=%i) = ?", 
     373              out, in, samples, from, roar_codec2str(from), to, roar_codec2str(to), bits); 
     374 
     375 roar_conv_endian(out, in, samples, inbo, outbo, bits); 
     376 nin = out; 
     377 
     378 return roar_conv_signedness(out, in, samples, ins, outs, bits); 
    400379} 
    401380 
     
    465444 return 0; 
    466445} 
     446 
     447 
     448int roar_conv_endian      (void * out, void * in, int samples, int from, int to, int bits) { 
     449 
     450 if ( bits == 8 ) { 
     451  from = to = ROAR_CODEC_NATIVE_ENDIAN; 
     452 
     453 } else if ( bits == 16 ) { 
     454  if ( from  == ROAR_CODEC_PDP ) 
     455   from = ROAR_CODEC_LE; 
     456  if ( to    == ROAR_CODEC_PDP ) 
     457   to   = ROAR_CODEC_LE; 
     458 } 
     459 
     460 if ( from == to ) { 
     461  if ( in != out ) { 
     462   memcpy(out, in, samples * bits / 8); 
     463   return 0; 
     464  } 
     465 
     466  if ( bits == 16 ) { 
     467   // in this case we can only have LE vs. BE, so, only need to swap: 
     468   return roar_conv_endian_16(out, in, samples); 
     469  } else if ( bits == 24 ) { 
     470   if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) { 
     471    return roar_conv_endian_24(out, in, samples); 
     472   } else { // what the hell is PDP eddines in 24 bit mode? 
     473    return -1; 
     474   } 
     475  } else if ( bits == 32 ) { 
     476   if ( (from == ROAR_CODEC_LE || from == ROAR_CODEC_BE) && (to == ROAR_CODEC_LE || to == ROAR_CODEC_BE) ) { 
     477    return roar_conv_endian_32(out, in, samples); 
     478   } else { // need to handle 32 PDP eddines here? 
     479    return -1; 
     480   } 
     481  } else { 
     482   return -1; 
     483  } 
     484 } 
     485 
     486 return -1; 
     487} 
     488 
    467489 
    468490int roar_conv_endian_16   (void * out, void * in, int samples) { 
     
    552574 //       for the moment: guess out >= in 
    553575 
     576 if ( ROAR_CODEC_BYTE_ORDER(from->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 
     577  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_BYTE_ORDER(from->codec), ROAR_CODEC_NATIVE_ENDIAN, to->bits) == -1 ) 
     578   return -1; 
     579  else 
     580   ip = out; 
     581 } 
     582 
    554583 if ( from->bits != to->bits ) { 
    555584  if ( roar_conv_bits(out, ip, samples, from->bits, to->bits) == -1 ) 
     
    559588 } 
    560589 
     590 if ( ROAR_CODEC_IS_SIGNED(from->codec) != ROAR_CODEC_IS_SIGNED(to->codec) ) { 
     591  if ( roar_conv_signedness(out, ip, samples, ROAR_CODEC_IS_SIGNED(from->codec), ROAR_CODEC_IS_SIGNED(to->codec), to->bits) == -1 ) 
     592   return -1; 
     593  else 
     594   ip = out; 
     595 } 
     596 
     597/* 
    561598 if ( from->codec != to->codec ) { 
    562599  if ( raor_conv_codec (out, ip, samples, from->codec, to->codec, to->bits) == -1 ) 
     
    565602   ip = out; 
    566603 } 
     604*/ 
    567605 
    568606 if ( from->rate != to->rate ) { 
     
    575613 if ( from->channels != to->channels ) { 
    576614  if ( roar_conv_chans(out, ip, samples, from->channels, to->channels, to->bits) == -1 ) 
     615   return -1; 
     616  else 
     617   ip = out; 
     618 } 
     619 
     620 if ( ROAR_CODEC_BYTE_ORDER(to->codec) != ROAR_CODEC_NATIVE_ENDIAN ) { 
     621  if ( roar_conv_endian(out, ip, samples, ROAR_CODEC_NATIVE_ENDIAN, ROAR_CODEC_BYTE_ORDER(to->codec), to->bits) == -1 ) 
    577622   return -1; 
    578623  else 
Note: See TracChangeset for help on using the changeset viewer.