Rearrange logic in the synthVoice loop to do less tests and remove need of a struct member for a small speedup, move some memory lookups out of the loop for a small speedup, further cosmetic changes to the synthVoice function. Change isUsed to a bool for clearer logic and also a tiny speedup

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15563 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Nils Wallménius 2007-11-11 01:02:45 +00:00
parent d185f9eba8
commit 0fd4c2e455
4 changed files with 43 additions and 45 deletions

View file

@ -263,7 +263,7 @@ static int midimain(void * filename)
{
notesUsed = 0;
for(a=0; a<MAX_VOICES; a++)
if(voices[a].isUsed == 1)
if(voices[a].isUsed)
notesUsed++;
tick();
} while(notesUsed == 0);

View file

@ -109,11 +109,12 @@ struct SynthObject
int delta;
int decay;
unsigned int cp; /* unsigned int */
int state, loopState;
int note, vol, ch, isUsed;
int state;
int note, vol, ch;
int curRate, curOffset, targetOffset;
int curPoint;
signed short int volscale;
bool isUsed;
};
struct Event

View file

@ -156,7 +156,7 @@ static inline void computeDeltas(int ch)
int a=0;
for(a = 0; a<MAX_VOICES; a++)
{
if(voices[a].isUsed==1 && voices[a].ch == ch)
if(voices[a].isUsed && voices[a].ch == ch)
{
findDelta(&voices[a], ch, voices[a].note);
}
@ -202,7 +202,7 @@ inline void pressNote(int ch, int note, int vol)
if(voices[a].ch == ch && voices[a].note == note)
break;
if(voices[a].isUsed==0)
if(!voices[a].isUsed)
break;
}
if(a==MAX_VOICES)
@ -227,7 +227,6 @@ inline void pressNote(int ch, int note, int vol)
setVolScale(a);
voices[a].loopState=STATE_NONLOOPING;
/*
* OKAY. Gt = Gus Table value
* rf = Root Frequency of wave
@ -239,7 +238,7 @@ inline void pressNote(int ch, int note, int vol)
{
findDelta(&voices[a], ch, note);
/* Turn it on */
voices[a].isUsed=1;
voices[a].isUsed=true;
setPoint(&voices[a], 0);
} else
{
@ -256,7 +255,7 @@ inline void pressNote(int ch, int note, int vol)
wf->mode = wf->mode & (255-28);
/* Turn it on */
voices[a].isUsed=1;
voices[a].isUsed=true;
setPoint(&voices[a], 0);
} else
@ -411,7 +410,7 @@ void seekBackward(int nsec)
{
notesUsed = 0;
for(a=0; a<MAX_VOICES; a++)
if(voices[a].isUsed == 1)
if(voices[a].isUsed)
notesUsed++;
tick();
} while(notesUsed == 0);

View file

@ -51,7 +51,7 @@ void resetControllers()
voices[a].cp=0;
voices[a].vol=0;
voices[a].ch=0;
voices[a].isUsed=0;
voices[a].isUsed=false;
voices[a].note=0;
}
@ -271,7 +271,6 @@ inline void stopVoice(struct SynthObject * so)
static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned int samples)
{
struct GWaveform * wf;
register int s;
register int s1;
register int s2;
@ -279,6 +278,9 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
wf = so->wf;
const unsigned int pan = chPan[so->ch];
const int volscale = so->volscale;
const int mode_mask24 = wf->mode&24;
const int mode_mask28 = wf->mode&28;
const int mode_mask_looprev = wf->mode&LOOP_REVERSE;
@ -289,9 +291,8 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
const unsigned int start_loop = wf->startLoop << FRACTSIZE;
const int diff_loop = end_loop-start_loop;
while(samples > 0)
while(samples-- > 0)
{
samples--;
/* Is voice being ramped? */
if(so->state == STATE_RAMPDOWN)
{
@ -300,12 +301,12 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
so->decay = so->decay / 2;
if(so->decay < 10 && so->decay > -10)
so->isUsed = 0;
so->isUsed = false;
s1=so->decay;
s2 = s1*chPan[so->ch];
s2 = s1*pan;
s1 = (s1<<7) -s2;
*(out++)+=(((s1&0x7FFF80) << 9) | ((s2&0x7FFF80) >> 7));
*(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF);
continue;
}
} else /* OK to advance voice */
@ -315,23 +316,8 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
s2 = getSample((cp_temp >> FRACTSIZE)+1, wf);
/* LOOP_REVERSE|LOOP_PINGPONG = 24 */
if(mode_mask24 && so->loopState == STATE_LOOPING && (cp_temp < start_loop))
if(mode_mask28 && cp_temp >= end_loop)
{
if(mode_mask_looprev)
{
cp_temp += diff_loop;
s2=getSample((cp_temp >> FRACTSIZE), wf);
}
else
{
so->delta = -so->delta; /* At this point cp_temp is wrong. We need to take a step */
}
}
if(mode_mask28 && (cp_temp >= end_loop))
{
so->loopState = STATE_LOOPING;
if(!mode_mask24)
{
cp_temp -= diff_loop;
@ -340,6 +326,20 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
else
{
so->delta = -so->delta;
/* LOOP_REVERSE|LOOP_PINGPONG = 24 */
if(cp_temp < start_loop) /* this appears to never be true in here */
{
if(mode_mask_looprev)
{
cp_temp += diff_loop;
s2=getSample((cp_temp >> FRACTSIZE), wf);
}
else
{
so->delta = -so->delta; /* At this point cp_temp is wrong. We need to take a step */
}
}
}
}
@ -354,12 +354,12 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
/* Better, working, linear interpolation */
s1=getSample((cp_temp >> FRACTSIZE), wf);
s = s1 + ((signed)((s2 - s1) * (cp_temp & ((1<<FRACTSIZE)-1)))>>FRACTSIZE);
s1 +=((signed)((s2 - s1) * (cp_temp & ((1<<FRACTSIZE)-1)))>>FRACTSIZE);
if(so->curRate == 0)
{
stopVoice(so);
// so->isUsed = 0;
// so->isUsed = false;
}
@ -404,25 +404,23 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
stopVoice(so);
}
s = (s * (so->curOffset >> 22) >> 8);
s1 = s1 * (so->curOffset >> 22) >> 8;
/* Scaling by channel volume and note volume is done in sequencer.c */
/* That saves us some multiplication and pointer operations */
s1 = s1 * volscale >> 14;
/* need to set ramp beginning */
if(so->state == STATE_RAMPDOWN && so->decay == 0)
{
so->decay = s*so->volscale>>14;
so->decay = s1;
if(so->decay == 0)
so->decay = 1; /* stupid junk.. */
}
/* Scaling by channel volume and note volume is done in sequencer.c */
/* That saves us some multiplication and pointer operations */
s1=s*so->volscale>>14;
s2 = s1*chPan[so->ch];
s2 = s1*pan;
s1 = (s1<<7) - s2;
*(out++)+=(((s1&0x7FFF80) << 9) | ((s2&0x7FFF80) >> 7));
*(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF);
}
so->cp=cp_temp; /* store this again */
@ -451,7 +449,7 @@ void synthSamples(int32_t *buf_ptr, unsigned int num_samples)
for(i=0; i < MAX_VOICES; i++)
{
voicept=&voices[i];
if(voicept->isUsed==1)
if(voicept->isUsed)
{
synthVoice(voicept, samp_buf, num_samples);
}