Changeset 850:b498ce53df3a in roaraudio for libroardsp/convert.c


Ignore:
Timestamp:
09/28/08 12:45:25 (16 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added new more optimized roar_conv_chans_*() funcs

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/convert.c

    r849 r850  
    132132 
    133133int roar_conv_chans (void * out, void * in, int samples, int from, int to, int bits) { 
    134  if ( from == 1 ) { 
    135   if ( bits == 8 ) { 
    136    return roar_conv_chans_1ton8(out, in, samples, to); 
    137   } else if ( bits == 16 ) { 
    138    return roar_conv_chans_1ton16(out, in, samples, to); 
    139   } else { 
    140    return -1; 
    141   } 
    142  } else if ( to == 1 ) { 
    143   if ( bits == 8 ) { 
    144    return roar_conv_chans_nto18(out, in, samples, from); 
    145   } else if ( bits == 16 ) { 
    146    return roar_conv_chans_nto116(out, in, samples, from); 
    147   } else { 
    148    return -1; 
    149   } 
     134 if ( from == to ) { 
     135  if ( in == out ) 
     136   return 0; 
     137 
     138  memcpy(out, in, samples * from * bits / 8); 
     139  return 0; 
     140 } 
     141 
     142 switch (bits) { 
     143  case 8: 
     144   switch (from) { 
     145    case 1: 
     146     switch (to) { 
     147      case  2: return roar_conv_chans_1to28(out, in, samples); 
     148      default: return roar_conv_chans_1ton8(out, in, samples, to); 
     149     } 
     150     break; 
     151    case 2: 
     152     switch (to) { 
     153      case  1: return roar_conv_chans_2to18(out, in, samples); 
     154      default: return -1; 
     155     } 
     156     break; 
     157    default: 
     158     switch (to) { 
     159      case  1: return roar_conv_chans_nto18(out, in, samples, from); 
     160      default: return -1; 
     161     } 
     162   } 
     163  break; 
     164  case 16: 
     165   switch (from) { 
     166    case 1: 
     167     switch (to) { 
     168      case  2: return roar_conv_chans_1to216(out, in, samples); 
     169      default: return roar_conv_chans_1ton16(out, in, samples, to); 
     170     } 
     171     break; 
     172    case 2: 
     173     switch (to) { 
     174      case  1: return roar_conv_chans_2to116(out, in, samples); 
     175      default: return -1; 
     176     } 
     177     break; 
     178    default: 
     179     switch (to) { 
     180      case  1: return roar_conv_chans_nto116(out, in, samples, from); 
     181      default: return -1; 
     182     } 
     183   } 
     184  break; 
     185  default: return -1; 
    150186 } 
    151187 
     
    165201} 
    166202 
     203int roar_conv_chans_1to28  (void * out, void * in, int samples) { 
     204 char * ip = (char*) in, * op = (char*) out; 
     205 int i; 
     206 
     207 samples = (samples - 1) * 2; 
     208 
     209 for (i = samples; i >= 0; i -= 2) { 
     210  op[i + 0] = ip[i]; 
     211  op[i + 1] = ip[i]; 
     212 } 
     213 
     214 return 0; 
     215} 
     216 
    167217int roar_conv_chans_1ton16 (void * out, void * in, int samples, int to) { 
    168218 int16_t * ip = (int16_t*) in, * op = (int16_t*) out; 
     
    177227} 
    178228 
     229int roar_conv_chans_1to216 (void * out, void * in, int samples) { 
     230 int16_t * ip = (int16_t*) in, * op = (int16_t*) out; 
     231 int i; 
     232 
     233 samples = (samples - 1) * 2; 
     234 
     235 for (i = samples; i >= 0; i -= 2) { 
     236  op[i + 0] = ip[i]; 
     237  op[i + 1] = ip[i]; 
     238 } 
     239 
     240 return 0; 
     241} 
     242 
    179243int roar_conv_chans_nto18  (void * out, void * in, int samples, int from) { 
    180244 int8_t * ip = (int8_t*) in, * op = (int8_t*) out; 
     
    198262} 
    199263 
     264int roar_conv_chans_2to18  (void * out, void * in, int samples) { 
     265 int8_t * ip = (int8_t*) in, * op = (int8_t*) out; 
     266 int i; 
     267 
     268 samples -= 2; 
     269 
     270 for (i = samples; i >= 0; i -= 2) 
     271  op[i] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2; 
     272 
     273 return 0; 
     274} 
     275 
    200276int roar_conv_chans_nto116 (void * out, void * in, int samples, int from) { 
    201277 int16_t * ip = (int16_t*) in, * op = (int16_t*) out; 
     
    215291  op[i] = s; 
    216292 } 
     293 
     294 return 0; 
     295} 
     296 
     297int roar_conv_chans_2to116  (void * out, void * in, int samples) { 
     298 int16_t * ip = (int16_t*) in, * op = (int16_t*) out; 
     299 int i; 
     300 
     301 samples -= 2; 
     302 
     303 for (i = samples; i >= 0; i -= 2) 
     304  op[i] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2; 
    217305 
    218306 return 0; 
Note: See TracChangeset for help on using the changeset viewer.