mirror of
https://github.com/Rockbox/rockbox.git
synced 2025-11-20 18:42:41 -05:00
SPC codec on Coldfire: Urgh. There was a whole gain stage I overlooked. :P Kill another several boost points.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@12561 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
fa9ea27e11
commit
9764e09acb
1 changed files with 40 additions and 6 deletions
|
|
@ -6,6 +6,8 @@
|
||||||
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
||||||
* \/ \/ \/ \/ \/
|
* \/ \/ \/ \/ \/
|
||||||
*
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
* Copyright (C) 2006-2007 Adam Gashlin (hcs)
|
* Copyright (C) 2006-2007 Adam Gashlin (hcs)
|
||||||
* Copyright (C) 2004-2007 Shay Green (blargg)
|
* Copyright (C) 2004-2007 Shay Green (blargg)
|
||||||
* Copyright (C) 2002 Brad Martin
|
* Copyright (C) 2002 Brad Martin
|
||||||
|
|
@ -880,7 +882,7 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
#if !SPC_NOINTERP
|
#if !SPC_NOINTERP
|
||||||
/* Interleved gauss table (to improve cache coherency). */
|
/* Interleved gauss table (to improve cache coherency). */
|
||||||
/* gauss [i * 2 + j] = normal_gauss [(1 - j) * 256 + i] */
|
/* gauss [i * 2 + j] = normal_gauss [(1 - j) * 256 + i] */
|
||||||
static short const gauss [512] =
|
static short const gauss [512] ICONST_ATTR =
|
||||||
{
|
{
|
||||||
370,1305, 366,1305, 362,1304, 358,1304, 354,1304, 351,1304, 347,1304, 343,1303,
|
370,1305, 366,1305, 362,1304, 358,1304, 354,1304, 351,1304, 347,1304, 343,1303,
|
||||||
339,1303, 336,1303, 332,1302, 328,1302, 325,1301, 321,1300, 318,1300, 314,1299,
|
339,1303, 336,1303, 332,1302, 328,1302, 325,1301, 321,1300, 318,1300, 314,1299,
|
||||||
|
|
@ -915,7 +917,6 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
0, 434, 0, 430, 0, 426, 0, 422, 0, 418, 0, 414, 0, 410, 0, 405,
|
0, 434, 0, 430, 0, 426, 0, 422, 0, 418, 0, 414, 0, 410, 0, 405,
|
||||||
0, 401, 0, 397, 0, 393, 0, 389, 0, 385, 0, 381, 0, 378, 0, 374,
|
0, 401, 0, 397, 0, 393, 0, 389, 0, 385, 0, 381, 0, 378, 0, 374,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Gaussian interpolation using most recent 4 samples */
|
/* Gaussian interpolation using most recent 4 samples */
|
||||||
long position = voice->position;
|
long position = voice->position;
|
||||||
voice->position += rate;
|
voice->position += rate;
|
||||||
|
|
@ -969,7 +970,8 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
#else
|
#else
|
||||||
/* two-point linear interpolation */
|
/* two-point linear interpolation */
|
||||||
#ifdef CPU_COLDFIRE
|
#ifdef CPU_COLDFIRE
|
||||||
int32_t output = (int16_t)this->noise;
|
int amp_0 = (int16_t)this->noise;
|
||||||
|
int amp_1;
|
||||||
|
|
||||||
if ( (this->r.g.noise_enables & vbit) == 0 )
|
if ( (this->r.g.noise_enables & vbit) == 0 )
|
||||||
{
|
{
|
||||||
|
|
@ -1001,12 +1003,45 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
/* output = y0 + (result >> 12) */
|
/* output = y0 + (result >> 12) */
|
||||||
"asr.l %[sh], %[y1] \r\n"
|
"asr.l %[sh], %[y1] \r\n"
|
||||||
"add.l %[y0], %[y1] \r\n"
|
"add.l %[y0], %[y1] \r\n"
|
||||||
: [f]"+&d"(f), [y0]"=&a"(y0), [y1]"=&d"(output)
|
: [f]"+&d"(f), [y0]"=&a"(y0), [y1]"=&d"(amp_0)
|
||||||
: [s]"a"(voice->samples), [sh]"d"(12)
|
: [s]"a"(voice->samples), [sh]"d"(12)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* apply voice envelope to output */
|
||||||
|
asm volatile (
|
||||||
|
"mac.w %[output]l, %[envx]l, %%acc0 \r\n"
|
||||||
|
:
|
||||||
|
: [output]"r"(amp_0), [envx]"r"(voice->envx)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* advance voice position */
|
||||||
voice->position += rate;
|
voice->position += rate;
|
||||||
|
|
||||||
|
/* fetch output, scale and apply left and right
|
||||||
|
voice volume */
|
||||||
|
asm volatile (
|
||||||
|
"movclr.l %%acc0, %[output] \r\n"
|
||||||
|
"asr.l %[sh], %[output] \r\n"
|
||||||
|
"mac.l %[vvol_0], %[output], %%acc0 \r\n"
|
||||||
|
"mac.l %[vvol_1], %[output], %%acc1 \r\n"
|
||||||
|
: [output]"=&r"(amp_0)
|
||||||
|
: [vvol_0]"r"((int)voice->volume[0]),
|
||||||
|
[vvol_1]"r"((int)voice->volume[1]),
|
||||||
|
[sh]"d"(11)
|
||||||
|
);
|
||||||
|
|
||||||
|
/* save this output into previous, scale and save in
|
||||||
|
output register */
|
||||||
|
prev_outx = amp_0;
|
||||||
|
raw_voice->outx = amp_0 >> 8;
|
||||||
|
|
||||||
|
/* fetch final voice output */
|
||||||
|
asm volatile (
|
||||||
|
"movclr.l %%acc0, %[amp_0] \r\n"
|
||||||
|
"movclr.l %%acc1, %[amp_1] \r\n"
|
||||||
|
: [amp_0]"=r"(amp_0), [amp_1]"=r"(amp_1)
|
||||||
|
);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* Try this one out on ARM and see - similar to above but the asm
|
/* Try this one out on ARM and see - similar to above but the asm
|
||||||
|
|
@ -1043,8 +1078,6 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
if ( this->r.g.noise_enables & vbit )
|
if ( this->r.g.noise_enables & vbit )
|
||||||
output = *(int16_t*) &this->noise;
|
output = *(int16_t*) &this->noise;
|
||||||
#endif
|
#endif
|
||||||
#endif /* CPU_COLDFIRE */
|
|
||||||
|
|
||||||
output = (output * voice->envx) >> 11;
|
output = (output * voice->envx) >> 11;
|
||||||
|
|
||||||
/* duplicated here to give compiler more to run in parallel */
|
/* duplicated here to give compiler more to run in parallel */
|
||||||
|
|
@ -1053,6 +1086,7 @@ static void DSP_run_( struct Spc_Dsp* this, long count, int32_t* out_buf )
|
||||||
|
|
||||||
prev_outx = output;
|
prev_outx = output;
|
||||||
raw_voice->outx = (int8_t) (output >> 8);
|
raw_voice->outx = (int8_t) (output >> 8);
|
||||||
|
#endif /* CPU_COLDFIRE */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if SPC_BRRCACHE
|
#if SPC_BRRCACHE
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue