fix linker warnings with MSVC /GL; fix openmp loop variable type for MSVC; fix warning for cast size_t to double on some archs

master
Rob Sykes 2013-01-05 13:43:05 +00:00
parent caf7d62572
commit 3aeaf0a1d7
3 changed files with 44 additions and 70 deletions

View File

@ -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

View File

@ -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;
typedef void (* fn_t)(void);
extern fn_t RDFT_CB[11];
#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)
#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,

View File

@ -20,33 +20,19 @@ char const * soxr_version(void)
typedef void sample_t; /* float or double */
typedef void (* fn_t)(void);
typedef fn_t control_block_t[10];
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)
#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;
}