Samples should always be 32 bit on all platforms, so change most
occurences of long to int32_t to enable working sounds also on 64 bit sims. Note that some codecs (MP3 and Wavpack) still have other 64 bit related problems. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@9120 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
f383cc14bd
commit
ea4ccb5aba
3 changed files with 56 additions and 53 deletions
98
apps/dsp.c
98
apps/dsp.c
|
@ -192,7 +192,7 @@ struct dsp_config
|
|||
struct resample_data
|
||||
{
|
||||
long phase, delta;
|
||||
long last_sample[2];
|
||||
int32_t last_sample[2];
|
||||
};
|
||||
|
||||
struct dither_data
|
||||
|
@ -203,9 +203,9 @@ struct dither_data
|
|||
|
||||
struct crossfeed_data
|
||||
{
|
||||
long lowpass[2];
|
||||
long highpass[2];
|
||||
long delay[2][13];
|
||||
int32_t lowpass[2];
|
||||
int32_t highpass[2];
|
||||
int32_t delay[2][13];
|
||||
int index;
|
||||
};
|
||||
|
||||
|
@ -233,8 +233,8 @@ struct dsp_config *dsp;
|
|||
* of copying needed is minimized for that case.
|
||||
*/
|
||||
|
||||
static long sample_buf[SAMPLE_BUF_SIZE] IBSS_ATTR;
|
||||
static long resample_buf[RESAMPLE_BUF_SIZE] IBSS_ATTR;
|
||||
static int32_t sample_buf[SAMPLE_BUF_SIZE] IBSS_ATTR;
|
||||
static int32_t resample_buf[RESAMPLE_BUF_SIZE] IBSS_ATTR;
|
||||
|
||||
int sound_get_pitch(void)
|
||||
{
|
||||
|
@ -254,7 +254,7 @@ void sound_set_pitch(int permille)
|
|||
* consume. Note that for mono, dst[0] equals dst[1], as there is no point
|
||||
* in processing the same data twice.
|
||||
*/
|
||||
static int convert_to_internal(const char* src[], int count, long* dst[])
|
||||
static int convert_to_internal(const char* src[], int count, int32_t* dst[])
|
||||
{
|
||||
count = MIN(SAMPLE_BUF_SIZE / 2, count);
|
||||
|
||||
|
@ -267,15 +267,15 @@ static int convert_to_internal(const char* src[], int count, long* dst[])
|
|||
}
|
||||
else
|
||||
{
|
||||
dst[0] = (long*) src[0];
|
||||
dst[1] = (long*) ((dsp->stereo_mode == STEREO_MONO) ? src[0] : src[1]);
|
||||
dst[0] = (int32_t*) src[0];
|
||||
dst[1] = (int32_t*) ((dsp->stereo_mode == STEREO_MONO) ? src[0] : src[1]);
|
||||
}
|
||||
|
||||
if (dsp->sample_depth <= NATIVE_DEPTH)
|
||||
{
|
||||
short* s0 = (short*) src[0];
|
||||
long* d0 = dst[0];
|
||||
long* d1 = dst[1];
|
||||
int32_t* d0 = dst[0];
|
||||
int32_t* d1 = dst[1];
|
||||
int scale = WORD_SHIFT;
|
||||
int i;
|
||||
|
||||
|
@ -307,9 +307,9 @@ static int convert_to_internal(const char* src[], int count, long* dst[])
|
|||
}
|
||||
else if (dsp->stereo_mode == STEREO_INTERLEAVED)
|
||||
{
|
||||
long* s0 = (long*) src[0];
|
||||
long* d0 = dst[0];
|
||||
long* d1 = dst[1];
|
||||
int32_t* s0 = (int32_t*) src[0];
|
||||
int32_t* d0 = dst[0];
|
||||
int32_t* d1 = dst[1];
|
||||
int i;
|
||||
|
||||
for (i = 0; i < count; i++)
|
||||
|
@ -348,13 +348,13 @@ static void resampler_set_delta(int frequency)
|
|||
|
||||
/* TODO: we really should have a separate set of resample functions for both
|
||||
mono and stereo to avoid all this internal branching and looping. */
|
||||
static long downsample(long **dst, long **src, int count,
|
||||
static long downsample(int32_t **dst, int32_t **src, int count,
|
||||
struct resample_data *r)
|
||||
{
|
||||
long phase = r->phase;
|
||||
long delta = r->delta;
|
||||
long last_sample;
|
||||
long *d[2] = { dst[0], dst[1] };
|
||||
int32_t last_sample;
|
||||
int32_t *d[2] = { dst[0], dst[1] };
|
||||
int pos = phase >> 16;
|
||||
int i = 1, j;
|
||||
int num_channels = dsp->stereo_mode == STEREO_MONO ? 1 : 2;
|
||||
|
@ -388,11 +388,11 @@ static long downsample(long **dst, long **src, int count,
|
|||
return i;
|
||||
}
|
||||
|
||||
static long upsample(long **dst, long **src, int count, struct resample_data *r)
|
||||
static long upsample(int32_t **dst, int32_t **src, int count, struct resample_data *r)
|
||||
{
|
||||
long phase = r->phase;
|
||||
long delta = r->delta;
|
||||
long *d[2] = { dst[0], dst[1] };
|
||||
int32_t *d[2] = { dst[0], dst[1] };
|
||||
int i = 0, j;
|
||||
int pos;
|
||||
int num_channels = dsp->stereo_mode == STEREO_MONO ? 1 : 2;
|
||||
|
@ -427,13 +427,13 @@ static long upsample(long **dst, long **src, int count, struct resample_data *r)
|
|||
* done, to refer to the resampled data. Returns number of stereo samples
|
||||
* for further processing.
|
||||
*/
|
||||
static inline int resample(long* src[], int count)
|
||||
static inline int resample(int32_t* src[], int count)
|
||||
{
|
||||
long new_count;
|
||||
|
||||
if (dsp->frequency != NATIVE_FREQUENCY)
|
||||
{
|
||||
long* dst[2] = {&resample_buf[0], &resample_buf[RESAMPLE_BUF_SIZE / 2]};
|
||||
int32_t* dst[2] = {&resample_buf[0], &resample_buf[RESAMPLE_BUF_SIZE / 2]};
|
||||
|
||||
if (dsp->frequency < NATIVE_FREQUENCY)
|
||||
{
|
||||
|
@ -460,7 +460,7 @@ static inline int resample(long* src[], int count)
|
|||
return new_count;
|
||||
}
|
||||
|
||||
static inline long clip_sample(long sample, long min, long max)
|
||||
static inline long clip_sample(int32_t sample, int32_t min, int32_t max)
|
||||
{
|
||||
if (sample > max)
|
||||
{
|
||||
|
@ -478,13 +478,13 @@ static inline long clip_sample(long sample, long min, long max)
|
|||
* taken from the coolplayer project - coolplayer.sourceforge.net
|
||||
*/
|
||||
|
||||
static long dither_sample(long sample, long bias, long mask,
|
||||
static long dither_sample(int32_t sample, int32_t bias, int32_t mask,
|
||||
struct dither_data* dither)
|
||||
{
|
||||
long output;
|
||||
long random;
|
||||
long min;
|
||||
long max;
|
||||
int32_t output;
|
||||
int32_t random;
|
||||
int32_t min;
|
||||
int32_t max;
|
||||
|
||||
/* Noise shape and bias */
|
||||
|
||||
|
@ -523,7 +523,7 @@ static const long crossfeed_coefs[6] ICONST_ATTR = {
|
|||
LOW, LOW_COMP, HIGH_NEG, HIGH_COMP, ATT, ATT_COMP
|
||||
};
|
||||
|
||||
static void apply_crossfeed(long* src[], int count)
|
||||
static void apply_crossfeed(int32_t* src[], int count)
|
||||
{
|
||||
asm volatile (
|
||||
"lea.l crossfeed_data, %%a1 \n"
|
||||
|
@ -598,20 +598,20 @@ static void apply_crossfeed(long* src[], int count)
|
|||
);
|
||||
}
|
||||
#else
|
||||
static void apply_crossfeed(long* src[], int count)
|
||||
static void apply_crossfeed(int32_t* src[], int count)
|
||||
{
|
||||
long a; /* accumulator */
|
||||
int32_t a; /* accumulator */
|
||||
|
||||
long low_left = crossfeed_data.lowpass[0];
|
||||
long low_right = crossfeed_data.lowpass[1];
|
||||
long high_left = crossfeed_data.highpass[0];
|
||||
long high_right = crossfeed_data.highpass[1];
|
||||
int32_t low_left = crossfeed_data.lowpass[0];
|
||||
int32_t low_right = crossfeed_data.lowpass[1];
|
||||
int32_t high_left = crossfeed_data.highpass[0];
|
||||
int32_t high_right = crossfeed_data.highpass[1];
|
||||
unsigned int index = crossfeed_data.index;
|
||||
|
||||
long left, right;
|
||||
int32_t left, right;
|
||||
|
||||
long * delay_l = crossfeed_data.delay[0];
|
||||
long * delay_r = crossfeed_data.delay[1];
|
||||
int32_t* delay_l = crossfeed_data.delay[0];
|
||||
int32_t* delay_r = crossfeed_data.delay[1];
|
||||
|
||||
int i;
|
||||
|
||||
|
@ -711,7 +711,7 @@ void dsp_eq_update_data(bool enabled, int band)
|
|||
}
|
||||
|
||||
/* Apply EQ filters to those bands that have got it switched on. */
|
||||
static void eq_process(long **x, unsigned num)
|
||||
static void eq_process(int32_t **x, unsigned num)
|
||||
{
|
||||
int i;
|
||||
unsigned int channels = dsp->stereo_mode != STEREO_MONO ? 2 : 1;
|
||||
|
@ -736,19 +736,19 @@ static void eq_process(long **x, unsigned num)
|
|||
* the src array if gain was applied.
|
||||
* Note that this must be called before the resampler.
|
||||
*/
|
||||
static void apply_gain(long* _src[], int _count)
|
||||
static void apply_gain(int32_t* _src[], int _count)
|
||||
{
|
||||
struct dsp_config *my_dsp = dsp;
|
||||
if (my_dsp->replaygain)
|
||||
{
|
||||
long** src = _src;
|
||||
int32_t** src = _src;
|
||||
int count = _count;
|
||||
long* s0 = src[0];
|
||||
long* s1 = src[1];
|
||||
int32_t* s0 = src[0];
|
||||
int32_t* s1 = src[1];
|
||||
long gain = my_dsp->replaygain;
|
||||
long s;
|
||||
int32_t s;
|
||||
int i;
|
||||
long *d;
|
||||
int32_t *d;
|
||||
|
||||
if (s0 != s1)
|
||||
{
|
||||
|
@ -773,10 +773,10 @@ static void apply_gain(long* _src[], int _count)
|
|||
}
|
||||
}
|
||||
|
||||
static void write_samples(short* dst, long* src[], int count)
|
||||
static void write_samples(short* dst, int32_t* src[], int count)
|
||||
{
|
||||
long* s0 = src[0];
|
||||
long* s1 = src[1];
|
||||
int32_t* s0 = src[0];
|
||||
int32_t* s1 = src[1];
|
||||
int scale = dsp->frac_bits + 1 - NATIVE_DEPTH;
|
||||
|
||||
if (dsp->dither_enabled)
|
||||
|
@ -815,7 +815,7 @@ static void write_samples(short* dst, long* src[], int count)
|
|||
*/
|
||||
long dsp_process(char* dst, const char* src[], long size)
|
||||
{
|
||||
long* tmp[2];
|
||||
int32_t* tmp[2];
|
||||
long written = 0;
|
||||
long factor;
|
||||
int samples;
|
||||
|
@ -980,7 +980,7 @@ bool dsp_configure(int setting, void *value)
|
|||
else
|
||||
{
|
||||
dsp->frac_bits = (long) value;
|
||||
dsp->sample_bytes = sizeof(long);
|
||||
dsp->sample_bytes = 4; /* samples are 32 bits */
|
||||
dsp->clip_max = (1 << (long)value) - 1;
|
||||
dsp->clip_min = -(1 << (long)value);
|
||||
}
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
*
|
||||
****************************************************************************/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "config.h"
|
||||
#include "eq.h"
|
||||
|
||||
|
@ -214,7 +215,7 @@ void eq_hs_coefs(unsigned long cutoff, unsigned long Q, long db, long *c)
|
|||
}
|
||||
|
||||
#if (!defined(CPU_COLDFIRE) && !defined(CPU_ARM)) || defined(SIMULATOR)
|
||||
void eq_filter(long **x, struct eqfilter *f, unsigned num,
|
||||
void eq_filter(int32_t **x, struct eqfilter *f, unsigned num,
|
||||
unsigned channels, unsigned shift)
|
||||
{
|
||||
unsigned c, i;
|
||||
|
|
|
@ -20,6 +20,8 @@
|
|||
#ifndef _EQ_H
|
||||
#define _EQ_H
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
/* These depend on the fixed point formats used by the different filter types
|
||||
and need to be changed when they change.
|
||||
*/
|
||||
|
@ -27,14 +29,14 @@
|
|||
#define EQ_SHELF_SHIFT 8
|
||||
|
||||
struct eqfilter {
|
||||
long coefs[5]; /* Order is b0, b1, b2, a1, a2 */
|
||||
long history[2][4];
|
||||
int32_t coefs[5]; /* Order is b0, b1, b2, a1, a2 */
|
||||
int32_t history[2][4];
|
||||
};
|
||||
|
||||
void eq_pk_coefs(unsigned long cutoff, unsigned long Q, long db, long *c);
|
||||
void eq_ls_coefs(unsigned long cutoff, unsigned long Q, long db, long *c);
|
||||
void eq_hs_coefs(unsigned long cutoff, unsigned long Q, long db, long *c);
|
||||
void eq_filter(long **x, struct eqfilter *f, unsigned num,
|
||||
void eq_filter(int32_t **x, struct eqfilter *f, unsigned num,
|
||||
unsigned channels, unsigned shift);
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue