Changeset 1064:cc490b4af5df in roaraudio


Ignore:
Timestamp:
12/25/08 17:06:29 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

ha, seems that I got downsampling code working, ha, zoh even for 2 channel

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libroardsp/convert.c

    r1061 r1064  
    3434 
    3535#include "libroar.h" 
     36//#define free(p) {ROAR_WARN("free(%p) = ?", (p)); free((p)); ROAR_WARN("free(%p): OK", (p));} 
    3637 
    3738int roar_conv_bits (void * out, void * in, int samples, int from, int to) { 
     
    299300 int i, h; 
    300301 
     302 ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i) = ?", out, in, samples); 
     303 
    301304 samples -= 2; 
    302305 
    303  for (h = (i = samples) / 2; i >= 0; i -= 2, h--) 
     306 for (h = (i = samples) / 2; i >= 0; i -= 2, h--) { 
     307  ROAR_DBG("roar_conv_chans_2to116(out=%p, in=%p, samples=%i): op[%i] = (ip[%i] + ip[%i])/2", out, in, samples, h, i, i+1); 
    304308  op[h] = ((int)ip[i + 0] + (int)ip[i + 1]) / 2; 
     309 } 
    305310 
    306311 return 0; 
     
    327332     return roar_conv_rate_161zoh(out, in, samples, from, to); 
    328333   case 2: 
     334     return roar_conv_rate_162zoh(out, in, samples, from, to); 
    329335   default: 
    330336     return -1; 
     
    350356 for (i= 0; i < samples; i++) { 
    351357  op[(int)t] = ip[i]; 
     358  t += step; 
     359 } 
     360 
     361 return 0; 
     362} 
     363 
     364int roar_conv_rate_162zoh(void * out, void * in, int samples, int from, int to) { 
     365 int16_t * ip = in; 
     366 int16_t * op = out; 
     367 float t = 0; 
     368 float step = (float)to/from; 
     369 int i; 
     370 
     371 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples); 
     372 samples /= 2; 
     373 samples -= 1; 
     374 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples); 
     375 
     376 for (i= 0; i < samples; i++) { 
     377  ROAR_DBG("roar_conv_rate_162zoh(*): t=%f, i=%i // op[%i] = ip[%i]", t, i, 2*(int)t, 2*i); 
     378  op[2*(int)t    ] = ip[2*i    ]; 
     379  op[2*(int)t + 1] = ip[2*i + 1]; 
    352380  t += step; 
    353381 } 
     
    607635 
    608636 from_size = (from->bits * samples) / 8; 
    609  to_size   = (  to->bits * samples) / 8; 
     637 to_size   = (  to->bits * samples * to->rate * to->channels) / (8 * from->rate * from->channels); 
     638 
     639 ROAR_DBG("roar_conv(*): size: %i->%i", from_size, to_size); 
    610640 
    611641 if ( to_size < from_size ) { 
     
    663693  if ( roar_conv_rate(out, ip, samples, from->rate, to->rate, to->bits, from->channels) == -1 ) { 
    664694   ROAR_DBG("roar_conv(*): failed to convert rate %i->%i (%ich%ibits)", from->rate, to->rate, to->bits, from->channels); 
     695   if ( to_size < from_size ) 
     696    free(out); 
    665697   return -1; 
    666698  } else { 
    667699   ip = out; 
     700   samples = (samples * to->rate) / from->rate; 
    668701  } 
    669702 } 
     
    693726  memcpy(real_out, out, to_size); 
    694727  free(out); 
     728  ROAR_DBG("roar_conv(*): free(%p): OK!", out); 
    695729 } 
    696730 
Note: See TracChangeset for help on using the changeset viewer.