diff --git a/Makefile b/Makefile index 6a03833eba..d47f4c23b9 100644 --- a/Makefile +++ b/Makefile @@ -43,6 +43,7 @@ OBJ = frontend/frontend.o \ audio/resamplers/resampler.o \ audio/dsp_filter.o \ audio/resamplers/sinc.o \ + audio/resamplers/nearest.o \ audio/resamplers/cc_resampler.o \ location/nulllocation.o \ camera/nullcamera.o \ diff --git a/Makefile.emscripten b/Makefile.emscripten index 739ee98524..7f5b6678d8 100644 --- a/Makefile.emscripten +++ b/Makefile.emscripten @@ -47,6 +47,7 @@ OBJ = frontend/platform/platform_emscripten.o \ gfx/filter.o \ audio/resamplers/resampler.o \ audio/resamplers/sinc.o \ + audio/resamplers/nearest.o \ audio/resamplers/cc_resampler.o \ audio/nullaudio.o \ performance.o \ diff --git a/Makefile.win b/Makefile.win index d3ca47619c..fa091dece8 100644 --- a/Makefile.win +++ b/Makefile.win @@ -48,6 +48,7 @@ OBJ = frontend/frontend.o \ audio/resamplers/resampler.o \ audio/dsp_filter.o \ audio/resamplers/sinc.o \ + audio/resamplers/nearest.o \ audio/resamplers/cc_resampler.o \ location/nulllocation.o \ camera/nullcamera.o \ diff --git a/audio/resamplers/cc_resampler.c b/audio/resamplers/cc_resampler.c index 238f6b1b4c..86d8ae3a25 100644 --- a/audio/resamplers/cc_resampler.c +++ b/audio/resamplers/cc_resampler.c @@ -320,7 +320,7 @@ static void *resampler_CC_init(double bandwidth_mod) } #endif -const rarch_resampler_t CC_resampler = { +rarch_resampler_t CC_resampler = { resampler_CC_init, resampler_CC_process, resampler_CC_free, diff --git a/audio/resamplers/nearest.c b/audio/resamplers/nearest.c new file mode 100644 index 0000000000..ed5b703a18 --- /dev/null +++ b/audio/resamplers/nearest.c @@ -0,0 +1,78 @@ +#include "resampler.h" +#include "../../libretro.h" +#include "../../performance.h" +#include +#include +#include +#include + +#ifndef RESAMPLER_TEST +#include "../../general.h" +#else +#define RARCH_LOG(...) fprintf(stderr, __VA_ARGS__) +#endif + +typedef struct rarch_nearest_resampler +{ + float fraction; +}rarch_nearest_resampler_t; + + +static void resampler_nearest_process(void *re_, struct resampler_data *data) +{ + (void)re_; + float ratio; + + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*)re_; + + typedef struct audio_frame_float + { + float l; + float r; + }audio_frame_float_t; + + + audio_frame_float_t *inp = (audio_frame_float_t*)data->data_in; + audio_frame_float_t *inp_max = inp + data->input_frames; + audio_frame_float_t *outp = (audio_frame_float_t*)data->data_out; + + ratio = 1.0/data->ratio; + + while(inp!=inp_max){ + while(re->fraction>1){ + *outp++=*inp; + re->fraction-=ratio; + } + re->fraction++; + inp++; + } + + data->output_frames = (outp - (audio_frame_float_t*)data->data_out); +} + +static void resampler_nearest_free(void *re_) +{ + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*)re_; + if (re) + free(re); +} + +static void *resampler_nearest_init(double bandwidth_mod) +{ + rarch_nearest_resampler_t *re = (rarch_nearest_resampler_t*)calloc(1, sizeof(rarch_nearest_resampler_t)); + if (!re) + return NULL; + + re->fraction = 0; + + RARCH_LOG("\nNearest resampler : \n"); + + return re; +} + +rarch_resampler_t nearest_resampler = { + resampler_nearest_init, + resampler_nearest_process, + resampler_nearest_free, + "nearest", +}; diff --git a/audio/resamplers/resampler.c b/audio/resamplers/resampler.c index 80f84e85b0..ca6d0e662f 100644 --- a/audio/resamplers/resampler.c +++ b/audio/resamplers/resampler.c @@ -27,6 +27,7 @@ static const rarch_resampler_t *resampler_drivers[] = { #ifdef HAVE_CC_RESAMPLER &CC_resampler, #endif + &nearest_resampler, NULL, }; @@ -107,4 +108,3 @@ bool rarch_resampler_realloc(void **re, const rarch_resampler_t **backend, return true; } - diff --git a/audio/resamplers/resampler.h b/audio/resamplers/resampler.h index 7cf7cf042c..e1ac2eb967 100644 --- a/audio/resamplers/resampler.h +++ b/audio/resamplers/resampler.h @@ -52,8 +52,9 @@ typedef struct rarch_resampler const char *ident; } rarch_resampler_t; -extern const rarch_resampler_t sinc_resampler; -extern const rarch_resampler_t CC_resampler; +extern rarch_resampler_t sinc_resampler; +extern rarch_resampler_t CC_resampler; +extern rarch_resampler_t nearest_resampler; /* Reallocs resampler. Will free previous handle before * allocating a new one. If ident is NULL, first resampler will be used. */ diff --git a/audio/resamplers/sinc.c b/audio/resamplers/sinc.c index be0a7873c9..45ac23493c 100644 --- a/audio/resamplers/sinc.c +++ b/audio/resamplers/sinc.c @@ -541,7 +541,7 @@ error: return NULL; } -const rarch_resampler_t sinc_resampler = { +rarch_resampler_t sinc_resampler = { resampler_sinc_new, resampler_sinc_process, resampler_sinc_free, diff --git a/griffin/griffin.c b/griffin/griffin.c index 6c3c090baa..1ce1daa1e1 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -363,6 +363,7 @@ AUDIO RESAMPLER ============================================================ */ #include "../audio/resamplers/resampler.c" #include "../audio/resamplers/sinc.c" +#include "../audio/resamplers/nearest.c" #ifdef HAVE_CC_RESAMPLER #include "../audio/resamplers/cc_resampler.c" #endif diff --git a/msvc/msvc-2010/RetroArch-msvc2010.vcxproj b/msvc/msvc-2010/RetroArch-msvc2010.vcxproj index 21a1407b83..85718f3720 100644 --- a/msvc/msvc-2010/RetroArch-msvc2010.vcxproj +++ b/msvc/msvc-2010/RetroArch-msvc2010.vcxproj @@ -191,6 +191,7 @@ +