diff options
author | Rob Sykes <rob@rob-Ideapad-S205.(none)> | 2013-01-05 17:43:05 +0400 |
---|---|---|
committer | Rob Sykes <rob@rob-Ideapad-S205.(none)> | 2013-01-05 17:43:05 +0400 |
commit | 3aeaf0a1d769b0a3654cbbf12cdcca23bfaa96b5 (patch) | |
tree | b96be505422c66e432b2a75f4713e66a65763b86 | |
parent | caf7d625726cbad2856084858ec6c0a3f469521c (diff) |
fix linker warnings with MSVC /GL; fix openmp loop variable type for MSVC; fix warning for cast size_t to double on some archs
-rw-r--r-- | soxr-config.h.in | 2 | ||||
-rw-r--r-- | src/rate.h | 44 | ||||
-rw-r--r-- | src/soxr.c | 72 |
3 files changed, 46 insertions, 72 deletions
diff --git a/soxr-config.h.in b/soxr-config.h.in index 8e2a603..c44a378 100644 --- a/soxr-config.h.in +++ b/soxr-config.h.in @@ -32,7 +32,6 @@ #if LONG_MAX > 2147483647L #define int32_t int #define int64_t long - #define DBL (double) #elif LONG_MAX < 2147483647L #error this library requires that 'long int' has at least 32-bits #else @@ -42,7 +41,6 @@ #else #define int64_t long long #endif - #define DBL #endif #define uint32_t unsigned int32_t #define uint64_t unsigned int64_t @@ -11,31 +11,20 @@ #if defined SOXR_LIB -extern struct { - void * (* forward_setup)(int); - void * (* backward_setup)(int); - void (* delete_setup)(void *); - void (* forward)(int, void *, sample_t *, sample_t *); - void (* oforward)(int, void *, sample_t *, sample_t *); - void (* backward)(int, void *, sample_t *, sample_t *); - void (* obackward)(int, void *, sample_t *, sample_t *); - void (* convolve)(int, void *, sample_t *, sample_t const *); - void (* convolve_portion)(int, sample_t *, sample_t const *); - int (* multiplier)(void); - void (* reorder_back)(int, void *, sample_t *, sample_t *); -} RDFT_CB; - -#define rdft_forward_setup (*RDFT_CB.forward_setup) -#define rdft_backward_setup (*RDFT_CB.backward_setup) -#define rdft_delete_setup (*RDFT_CB.delete_setup) -#define rdft_forward (*RDFT_CB.forward) -#define rdft_oforward (*RDFT_CB.oforward) -#define rdft_backward (*RDFT_CB.backward) -#define rdft_obackward (*RDFT_CB.obackward) -#define rdft_convolve (*RDFT_CB.convolve) -#define rdft_convolve_portion (*RDFT_CB.convolve_portion) -#define rdft_multiplier (*RDFT_CB.multiplier) -#define rdft_reorder_back (*RDFT_CB.reorder_back) +typedef void (* fn_t)(void); +extern fn_t RDFT_CB[11]; + +#define rdft_forward_setup (*(void * (*)(int))RDFT_CB[0]) +#define rdft_backward_setup (*(void * (*)(int))RDFT_CB[1]) +#define rdft_delete_setup (*(void (*)(void *))RDFT_CB[2]) +#define rdft_forward (*(void (*)(int, void *, sample_t *, sample_t *))RDFT_CB[3]) +#define rdft_oforward (*(void (*)(int, void *, sample_t *, sample_t *))RDFT_CB[4]) +#define rdft_backward (*(void (*)(int, void *, sample_t *, sample_t *))RDFT_CB[5]) +#define rdft_obackward (*(void (*)(int, void *, sample_t *, sample_t *))RDFT_CB[6]) +#define rdft_convolve (*(void (*)(int, void *, sample_t *, sample_t const *))RDFT_CB[7]) +#define rdft_convolve_portion (*(void (*)(int, sample_t *, sample_t const *))RDFT_CB[8]) +#define rdft_multiplier (*(int (*)(void))RDFT_CB[9]) +#define rdft_reorder_back (*(void (*)(int, void *, sample_t *, sample_t *))RDFT_CB[10]) #endif @@ -427,7 +416,7 @@ static char const * rate_init( p->factor = factor; if (bits) while (!n++) { /* Determine stages: */ int try, L, M, x, maxL = interpolator > 0? 1 : mode? 2048 : - (int)ceil(DBL max_coefs_size * 1000. / (U100_l * sizeof(sample_t))); + (int)ceil((double)max_coefs_size * 1000. / (U100_l * sizeof(sample_t))); double d, epsilon = 0, frac; upsample = arbM < 1; for (i = (int)(arbM * .5), shift = 0; i >>= 1; arbM *= .5, ++shift); @@ -545,7 +534,7 @@ static char const * rate_init( arb_stage.shared->poly_fir_coefs = prepare_coefs( coefs, num_coefs, phases, order, multiplier); lsx_debug("fir_len=%i phases=%i coef_interp=%i size=%.3gk", - num_coefs, phases, order, DBL coefs_size / 1000.); + num_coefs, phases, order, (double)coefs_size / 1000.); free(coefs); } multiplier = 1; @@ -718,7 +707,6 @@ static char const * id(void) return RATE_ID; } -typedef void (* fn_t)(void); fn_t RATE_CB[] = { (fn_t)rate_input, (fn_t)rate_process, @@ -20,33 +20,19 @@ char const * soxr_version(void) typedef void sample_t; /* float or double */ - -typedef struct { - sample_t * (* input)(void *, sample_t * samples, size_t n); - void (* process)(void *, size_t); - sample_t const * (* output)(void *, sample_t * samples, size_t * n); - void (* flush)(void *); - void (* close)(void *); - double (* delay)(void *); - void (* sizes)(size_t * shared, size_t * channel); - char const * (* create)(void * channel, void * shared, double io_ratio, - soxr_quality_spec_t * q_spec, soxr_runtime_spec_t * r_spec, double scale); - void (* set_io_ratio)(void *, double io_ratio, size_t len); - char const * (* id)(void); -} control_block_t; - -#define resampler_input (*p->control_block.input) -#define resampler_process (*p->control_block.process) -#define resampler_output (*p->control_block.output) -#define resampler_flush (*p->control_block.flush) -#define resampler_close (*p->control_block.close) -#define resampler_delay (*p->control_block.delay) -#define resampler_sizes (*p->control_block.sizes) -#define resampler_create (*p->control_block.create) -#define resampler_set_io_ratio (*p->control_block.set_io_ratio) -#define resampler_id (*p->control_block.id) - - +typedef void (* fn_t)(void); +typedef fn_t control_block_t[10]; + +#define resampler_input (*(sample_t * (*)(void *, sample_t * samples, size_t n))p->control_block[0]) +#define resampler_process (*(void (*)(void *, size_t))p->control_block[1]) +#define resampler_output (*(sample_t const * (*)(void *, sample_t * samples, size_t * n))p->control_block[2]) +#define resampler_flush (*(void (*)(void *))p->control_block[3]) +#define resampler_close (*(void (*)(void *))p->control_block[4]) +#define resampler_delay (*(double (*)(void *))p->control_block[5]) +#define resampler_sizes (*(void (*)(size_t * shared, size_t * channel))p->control_block[6]) +#define resampler_create (*(char const * (*)(void * channel, void * shared, double io_ratio, soxr_quality_spec_t * q_spec, soxr_runtime_spec_t * r_spec, double scale))p->control_block[7]) +#define resampler_set_io_ratio (*(void (*)(void *, double io_ratio, size_t len))p->control_block[8]) +#define resampler_id (*(char const * (*)(void))p->control_block[9]) typedef void * resampler_t; /* For one channel. */ typedef void * resampler_shared_t; /* Between channels. */ @@ -241,7 +227,7 @@ soxr_t soxr_create( p->runtime_spec = runtime_spec? *runtime_spec : soxr_runtime_spec(1); p->io_spec.scale *= datatype_full_scale[p->io_spec.otype & 3] / datatype_full_scale[p->io_spec.itype & 3]; - p->seed = (unsigned long)time(0) ^ (unsigned long)p; + p->seed = (unsigned long)time(0) ^ (unsigned long)(size_t)p; #if HAVE_SINGLE_PRECISION if (!HAVE_DOUBLE_PRECISION || (p->q_spec.precision <= 20 && !(p->q_spec.flags & SOXR_DOUBLE_PRECISION)) @@ -383,7 +369,7 @@ soxr_error_t soxr_set_io_ratio(soxr_t p, double io_ratio, size_t slew_len) p->io_ratio = io_ratio; return initialise(p); } - if (p->control_block.set_io_ratio) { + if (p->control_block[8]) { for (i = 0; !error && i < p->num_channels; ++i) resampler_set_io_ratio(p->resamplers[i], io_ratio, slew_len); return error; @@ -414,7 +400,7 @@ soxr_error_t soxr_clear(soxr_t p) /* TODO: this, properly. */ p->io_spec = tmp.io_spec; p->num_channels = tmp.num_channels; p->input_fn_state = tmp.input_fn_state; - p->control_block = tmp.control_block; + memcpy(p->control_block, tmp.control_block, sizeof(p->control_block)); p->deinterleave = tmp.deinterleave; p->interleave = tmp.interleave; return 0; @@ -474,21 +460,22 @@ static size_t soxr_output_1ch(soxr_t p, unsigned i, soxr_buf_t dest, size_t len, static size_t soxr_output_no_callback(soxr_t p, soxr_buf_t out, size_t len) { - unsigned i; + unsigned u; size_t done = 0; bool separated = !!(p->io_spec.otype & SOXR_SPLIT); #if defined _OPENMP + int i; if (!p->runtime_spec.num_threads && p->num_channels > 1) #pragma omp parallel for - for (i = 0; i < p->num_channels; ++i) { + for (i = 0; i < (int)p->num_channels; ++i) { size_t done1; - done1 = soxr_output_1ch(p, i, ((soxr_bufs_t)out)[i], len, separated); + done1 = soxr_output_1ch(p, (unsigned)i, ((soxr_bufs_t)out)[i], len, separated); if (!i) done = done1; } else #endif - for (i = 0; i < p->num_channels; ++i) - done = soxr_output_1ch(p, i, ((soxr_bufs_t)out)[i], len, separated); + for (u = 0; u < p->num_channels; ++u) + done = soxr_output_1ch(p, u, ((soxr_bufs_t)out)[u], len, separated); if (!separated) p->clips += (p->interleave)(p->io_spec.otype, &out, (sample_t const * const *)p->channel_ptrs, @@ -557,7 +544,7 @@ soxr_error_t soxr_process(soxr_t p, void * out, size_t olen , size_t * odone0) { size_t ilen, idone, odone = 0; - unsigned i; + unsigned u; bool flush_requested = false; if (!p) return "null pointer"; @@ -578,21 +565,22 @@ soxr_error_t soxr_process(soxr_t p, idone = ilen; else if (p->io_spec.itype & p->io_spec.otype & SOXR_SPLIT) { /* Both i & o */ #if defined _OPENMP + int i; if (!p->runtime_spec.num_threads && p->num_channels > 1) #pragma omp parallel for - for (i = 0; i < p->num_channels; ++i) { + for (i = 0; i < (int)p->num_channels; ++i) { size_t done; if (in) - soxr_input_1ch(p, i, ((soxr_cbufs_t)in)[i], ilen); - done = soxr_output_1ch(p, i, ((soxr_bufs_t)out)[i], olen, true); + soxr_input_1ch(p, (unsigned)i, ((soxr_cbufs_t)in)[i], ilen); + done = soxr_output_1ch(p, (unsigned)i, ((soxr_bufs_t)out)[i], olen, true); if (!i) odone = done; } else #endif - for (i = 0; i < p->num_channels; ++i) { + for (u = 0; u < p->num_channels; ++u) { if (in) - soxr_input_1ch(p, i, ((soxr_cbufs_t)in)[i], ilen); - odone = soxr_output_1ch(p, i, ((soxr_bufs_t)out)[i], olen, true); + soxr_input_1ch(p, u, ((soxr_cbufs_t)in)[u], ilen); + odone = soxr_output_1ch(p, u, ((soxr_bufs_t)out)[u], olen, true); } idone = ilen; } |