Changeset 2386:0ff0440ba500 in roaraudio


Ignore:
Timestamp:
08/16/09 05:36:30 (15 years ago)
Author:
phi
Branch:
default
Phase:
public
Message:

added SRC (libsamplerate) based resampler

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • Makefile.inc

    r2380 r2386  
    77# libroardsp: 
    88DSP_CODECLIBS   = $(lib_celt) $(lib_speex) 
    9 LIBROARDSP_NS   = $(DSP_CODECLIBS) $(LIBROAR) $(lib_m) 
     9DSP_AUXLIBS     = $(lib_samplerate) 
     10LIBROARDSP_NS   = $(DSP_CODECLIBS) $(DSP_AUXLIBS) $(LIBROAR) $(lib_m) 
    1011LIBROARDSP      = -lroardsp $(LIBROARDSP_NS) 
    1112 
  • include/libroardsp/convert.h

    r2093 r2386  
    7272int roar_conv_rate_162zoh(void * out, void * in, int samples, int from, int to); 
    7373int roar_conv_rate_16nzoh(void * out, void * in, int samples, int from, int to, int channels); 
     74int roar_conv_rate_SRC   (void * out, void * in, int samples, int from, int to, int bits, int channels); 
    7475 
    7576int roar_conv_codec (void * out, void * in, int samples, int from, int to, int bits); 
  • include/libroardsp/libroardsp.h

    r2316 r2386  
    4444#ifdef ROAR_HAVE_LIBSPEEX 
    4545#include "transcode_speex.h" 
     46#endif 
     47 
     48#ifdef ROAR_HAVE_LIBSAMPLERATE 
     49#include <samplerate.h> 
    4650#endif 
    4751 
  • libroardsp/convert.c

    r2103 r2386  
    313313 
    314314int roar_conv_rate (void * out, void * in, int samples, int from, int to, int bits, int channels) { 
     315#ifdef ROAR_HAVE_LIBSAMPLERATE 
     316 return roar_conv_rate_SRC(out, in, samples, from, to, bits, channels); 
     317#else 
    315318 if ( bits == 8  ) 
    316319  return roar_conv_rate_8(out, in, samples, from, to, channels); 
     
    320323 
    321324 return -1; 
     325#endif 
    322326} 
    323327 
     
    371375 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples); 
    372376 samples /= 2; 
    373  samples -= 1; 
     377// samples -= 1; 
    374378 ROAR_DBG("roar_conv_rate_162zoh(*): samples=%i", samples); 
    375379 
     
    382386 
    383387 return 0; 
     388} 
     389 
     390int roar_conv_rate_SRC   (void * out, void * in, int samples, int from, int to, int bits, int channels) { 
     391#ifdef ROAR_HAVE_LIBSAMPLERATE 
     392 double radio = (double) to / (double) from; 
     393 int outsamples = radio * samples; 
     394 float * inf  = malloc(samples*sizeof(float)); 
     395 float * outf = malloc(outsamples*sizeof(float)); 
     396 int i; 
     397 SRC_DATA srcdata; 
     398 
     399 ROAR_DBG("roar_conv_rate_SRC(*): radio=%lf, samples=%i, outsamples=%i", radio, samples, outsamples); 
     400 
     401 if ( inf == NULL ) { 
     402  if ( outf != NULL ) 
     403   free(outf); 
     404 
     405  return -1; 
     406 } 
     407 
     408 if ( outf == NULL ) { 
     409  if ( inf != NULL ) 
     410   free(inf); 
     411 
     412  return -1; 
     413 } 
     414 
     415 switch (bits) { 
     416  case  8: 
     417    for (i = 0; i < samples; i++) 
     418     inf[i] = *(((int8_t *)in)+i) / 128.0; 
     419   break; 
     420  case 16: 
     421    for (i = 0; i < samples; i++) 
     422     inf[i] = *(((int16_t*)in)+i) / 32768.0; 
     423   break; 
     424  case 32: 
     425    for (i = 0; i < samples; i++) 
     426     inf[i] = *(((int32_t*)in)+i) / 2147483648.0; 
     427   break; 
     428  default: 
     429    free(outf); 
     430    free(inf); 
     431    return -1; 
     432 } 
     433 
     434 srcdata.data_in       = inf; 
     435 srcdata.data_out      = outf; 
     436 srcdata.input_frames  = samples/channels; 
     437 srcdata.output_frames = outsamples/channels; 
     438 srcdata.src_ratio     = radio; 
     439 
     440 if ( src_simple(&srcdata, SRC_SINC_FASTEST, channels) != 0 ) { 
     441  free(outf); 
     442  free(inf); 
     443  return -1; 
     444 } 
     445 
     446 switch (bits) { 
     447  case  8: 
     448    for (i = 0; i < samples; i++) 
     449     *(((int8_t *)out)+i) = outf[i] * 128.0; 
     450   break; 
     451  case 16: 
     452    for (i = 0; i < samples; i++) 
     453     *(((int16_t*)out)+i) = outf[i] * 32768.0; 
     454   break; 
     455  case 32: 
     456    for (i = 0; i < samples; i++) 
     457     *(((int32_t*)out)+i) = outf[i] * 2147483648.0; 
     458   break; 
     459   // no errors here, they are handled above 
     460 } 
     461 
     462 free(outf); 
     463 free(inf); 
     464 
     465 return 0; 
     466#else 
     467 return -1; 
     468#endif 
    384469} 
    385470 
     
    743828 
    744829 memcpy(&cinfo, from, sizeof(cinfo)); 
     830 
     831/* 
     832 if ( in != out ) { 
     833  memset(out, 0xA0, bufsize); 
     834 } else { 
     835  ROAR_WARN("roar_conv2(*): in==out!"); 
     836 } 
     837*/ 
    745838 
    746839 // calcumate number of input samples: 
Note: See TracChangeset for help on using the changeset viewer.