forked from len0rd/rockbox
midi: make the patch sample data pointer a *int16_t to get rid of some ugly casting and drop an acessor macro to make caching the pointer in the synthVoice loop possible. Speeds up midi by 1-2% on cf and 3-5% on PP.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@30438 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
parent
2ac668e44c
commit
2afc175a4e
5 changed files with 12 additions and 13 deletions
|
@ -122,7 +122,7 @@ struct GWaveform * loadWaveform(int file)
|
||||||
/* Byte-swap if necessary. Gus files are little endian */
|
/* Byte-swap if necessary. Gus files are little endian */
|
||||||
for(a=0; a<wav->numSamples; a++)
|
for(a=0; a<wav->numSamples; a++)
|
||||||
{
|
{
|
||||||
((unsigned short *) wav->data)[a] = letoh16(((unsigned short *) wav->data)[a]);
|
((uint16_t*) wav->data)[a] = letoh16(((uint16_t *) wav->data)[a]);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -130,7 +130,7 @@ struct GWaveform * loadWaveform(int file)
|
||||||
if(wav->mode & 2)
|
if(wav->mode & 2)
|
||||||
{
|
{
|
||||||
for(a=0; a<wav->numSamples; a++)
|
for(a=0; a<wav->numSamples; a++)
|
||||||
((short *) wav->data)[a] = ((unsigned short *) wav->data)[a] - 32768;
|
((int16_t *) wav->data)[a] = ((uint16_t *) wav->data)[a] - 32768;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ struct GWaveform
|
||||||
unsigned int scaleFactor;
|
unsigned int scaleFactor;
|
||||||
|
|
||||||
unsigned char * res;
|
unsigned char * res;
|
||||||
signed char * data;
|
int16_t * data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -114,9 +114,9 @@ unsigned char readChar(int file)
|
||||||
return buf[0];
|
return buf[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned char * readData(int file, int len)
|
void * readData(int file, int len)
|
||||||
{
|
{
|
||||||
unsigned char * dat = malloc(len);
|
void * dat = malloc(len);
|
||||||
rb->read(file, dat, len);
|
rb->read(file, dat, len);
|
||||||
return dat;
|
return dat;
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,7 +148,7 @@ int readTwoBytes(int file);
|
||||||
int readFourBytes(int file);
|
int readFourBytes(int file);
|
||||||
int readVarData(int file);
|
int readVarData(int file);
|
||||||
int eof(int fd);
|
int eof(int fd);
|
||||||
unsigned char * readData(int file, int len);
|
void * readData(int file, int len);
|
||||||
|
|
||||||
#define malloc(n) my_malloc(n)
|
#define malloc(n) my_malloc(n)
|
||||||
void * my_malloc(int size);
|
void * my_malloc(int size);
|
||||||
|
|
|
@ -201,8 +201,6 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define getSample(s,wf) ((short *)(wf)->data)[s]
|
|
||||||
|
|
||||||
void setPoint(struct SynthObject * so, int pt) ICODE_ATTR;
|
void setPoint(struct SynthObject * so, int pt) ICODE_ATTR;
|
||||||
void setPoint(struct SynthObject * so, int pt)
|
void setPoint(struct SynthObject * so, int pt)
|
||||||
{
|
{
|
||||||
|
@ -269,6 +267,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
register unsigned int cp_temp = so->cp;
|
register unsigned int cp_temp = so->cp;
|
||||||
|
|
||||||
wf = so->wf;
|
wf = so->wf;
|
||||||
|
const int16_t *sample_data = wf->data;
|
||||||
|
|
||||||
const unsigned int pan = chPan[so->ch];
|
const unsigned int pan = chPan[so->ch];
|
||||||
const int volscale = so->volscale;
|
const int volscale = so->volscale;
|
||||||
|
@ -309,7 +308,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
cp_temp += so->delta;
|
cp_temp += so->delta;
|
||||||
}
|
}
|
||||||
|
|
||||||
s2 = getSample((cp_temp >> FRACTSIZE)+1, wf);
|
s2 = sample_data[(cp_temp >> FRACTSIZE)+1];
|
||||||
|
|
||||||
if(LIKELY(mode_mask28))
|
if(LIKELY(mode_mask28))
|
||||||
{
|
{
|
||||||
|
@ -319,7 +318,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
if(UNLIKELY(mode_mask_looprev))
|
if(UNLIKELY(mode_mask_looprev))
|
||||||
{
|
{
|
||||||
cp_temp += diff_loop;
|
cp_temp += diff_loop;
|
||||||
s2=getSample((cp_temp >> FRACTSIZE), wf);
|
s2 = sample_data[cp_temp >> FRACTSIZE];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -333,7 +332,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
if(UNLIKELY(!mode_mask24))
|
if(UNLIKELY(!mode_mask24))
|
||||||
{
|
{
|
||||||
cp_temp -= diff_loop;
|
cp_temp -= diff_loop;
|
||||||
s2=getSample((cp_temp >> FRACTSIZE), wf);
|
s2 = sample_data[cp_temp >> FRACTSIZE];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -346,7 +345,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
if(UNLIKELY(cp_temp >= num_samples))
|
if(UNLIKELY(cp_temp >= num_samples))
|
||||||
{
|
{
|
||||||
cp_temp -= so->delta;
|
cp_temp -= so->delta;
|
||||||
s2 = getSample((cp_temp >> FRACTSIZE)+1, wf);
|
s2 = sample_data[(cp_temp >> FRACTSIZE)+1];
|
||||||
|
|
||||||
if (!rampdown) /* stop voice */
|
if (!rampdown) /* stop voice */
|
||||||
{
|
{
|
||||||
|
@ -356,7 +355,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Better, working, linear interpolation */
|
/* Better, working, linear interpolation */
|
||||||
s1=getSample((cp_temp >> FRACTSIZE), wf);
|
s1 = sample_data[cp_temp >> FRACTSIZE];
|
||||||
|
|
||||||
s1 +=((signed)((s2 - s1) * (cp_temp & ((1<<FRACTSIZE)-1)))>>FRACTSIZE);
|
s1 +=((signed)((s2 - s1) * (cp_temp & ((1<<FRACTSIZE)-1)))>>FRACTSIZE);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue