forked from len0rd/rockbox
Change loop structure for sample synthesizing. Gives a nice speedup on both coldfire and arm targets.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15036 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
d712e252fe
commit
f619f81676
3 changed files with 64 additions and 76 deletions
|
@ -255,8 +255,7 @@ inline void stopVoice(struct SynthObject * so)
|
|||
so->decay = 0;
|
||||
}
|
||||
|
||||
int synthVoice(struct SynthObject * so) ICODE_ATTR;
|
||||
int synthVoice(struct SynthObject * so)
|
||||
static inline int synthVoice(struct SynthObject * so)
|
||||
{
|
||||
struct GWaveform * wf;
|
||||
register int s;
|
||||
|
@ -404,3 +403,46 @@ int synthVoice(struct SynthObject * so)
|
|||
return s*so->volscale>>14;
|
||||
}
|
||||
|
||||
/* synth num_samples samples and write them to the */
|
||||
/* buffer pointed to by buf_ptr */
|
||||
void synthSamples(int32_t *buf_ptr, unsigned int num_samples) ICODE_ATTR;
|
||||
void synthSamples(int32_t *buf_ptr, unsigned int num_samples)
|
||||
{
|
||||
int i;
|
||||
register int dL;
|
||||
register int dR;
|
||||
register int sample;
|
||||
register struct SynthObject *voicept;
|
||||
while(num_samples>0)
|
||||
{
|
||||
dL=0;
|
||||
dR=0;
|
||||
voicept=&voices[0];
|
||||
|
||||
for(i=MAX_VOICES; i > 0; i--)
|
||||
{
|
||||
if(voicept->isUsed==1)
|
||||
{
|
||||
sample = synthVoice(voicept);
|
||||
dL += sample;
|
||||
sample *= chPan[voicept->ch];
|
||||
dR += sample;
|
||||
}
|
||||
voicept++;
|
||||
}
|
||||
|
||||
dL = (dL << 7) - dR;
|
||||
|
||||
/* combine the left and right 16 bit samples into 32 bits and write */
|
||||
/* to the buffer, left sample in the high word and right in the low word */
|
||||
*buf_ptr=(((dL&0x7FFF80) << 9) | ((dR&0x7FFF80) >> 7));
|
||||
|
||||
buf_ptr++;
|
||||
num_samples--;
|
||||
}
|
||||
/* TODO: Automatic Gain Control, anyone? */
|
||||
/* Or, should this be implemented on the DSP's output volume instead? */
|
||||
|
||||
return; /* No more ghetto lowpass filter. Linear interpolation works well. */
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue