fix linker warnings with MSVC /GL; fix openmp loop variable type for MSVC; fix warning for cast size_t to double on some archs
parent
caf7d62572
commit
3aeaf0a1d7
|
@ -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
|
||||
|
|
42
src/rate.h
42
src/rate.h
|
@ -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,
|
||||
|
|
70
src/soxr.c
70
src/soxr.c
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue