diff options
author | Nils Wallménius <nils@rockbox.org> | 2011-09-06 10:34:20 +0000 |
---|---|---|
committer | Nils Wallménius <nils@rockbox.org> | 2011-09-06 10:34:20 +0000 |
commit | 2afc175a4e2505c52bd0bae1469732d00f0eb5cb (patch) | |
tree | 8c79be6d4e847574102e2b138f1dc025df9101f3 /apps/plugins/midi | |
parent | 2ac668e44cec12616a4d675f8eade8049ed10af9 (diff) |
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
Diffstat (limited to 'apps/plugins/midi')
-rw-r--r-- | apps/plugins/midi/guspat.c | 4 | ||||
-rw-r--r-- | apps/plugins/midi/guspat.h | 2 | ||||
-rw-r--r-- | apps/plugins/midi/midiutil.c | 4 | ||||
-rw-r--r-- | apps/plugins/midi/midiutil.h | 2 | ||||
-rw-r--r-- | apps/plugins/midi/synth.c | 13 |
5 files changed, 12 insertions, 13 deletions
diff --git a/apps/plugins/midi/guspat.c b/apps/plugins/midi/guspat.c index 5f6ba35110..ea0ca92518 100644 --- a/apps/plugins/midi/guspat.c +++ b/apps/plugins/midi/guspat.c @@ -122,7 +122,7 @@ struct GWaveform * loadWaveform(int file) /* Byte-swap if necessary. Gus files are little endian */ 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 @@ -130,7 +130,7 @@ struct GWaveform * loadWaveform(int file) if(wav->mode & 2) { 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; } diff --git a/apps/plugins/midi/guspat.h b/apps/plugins/midi/guspat.h index c59cf7a3e3..ebb5f227d7 100644 --- a/apps/plugins/midi/guspat.h +++ b/apps/plugins/midi/guspat.h @@ -50,7 +50,7 @@ struct GWaveform unsigned int scaleFactor; unsigned char * res; - signed char * data; + int16_t * data; }; diff --git a/apps/plugins/midi/midiutil.c b/apps/plugins/midi/midiutil.c index f960b72654..f4950408ab 100644 --- a/apps/plugins/midi/midiutil.c +++ b/apps/plugins/midi/midiutil.c @@ -114,9 +114,9 @@ unsigned char readChar(int file) 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); return dat; } diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h index 62a31d0c65..cf3666c97f 100644 --- a/apps/plugins/midi/midiutil.h +++ b/apps/plugins/midi/midiutil.h @@ -148,7 +148,7 @@ int readTwoBytes(int file); int readFourBytes(int file); int readVarData(int file); int eof(int fd); -unsigned char * readData(int file, int len); +void * readData(int file, int len); #define malloc(n) my_malloc(n) void * my_malloc(int size); diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index 0ad7bb59f8..663565ecdb 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c @@ -201,8 +201,6 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig) 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) { @@ -269,6 +267,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i register unsigned int cp_temp = so->cp; wf = so->wf; + const int16_t *sample_data = wf->data; const unsigned int pan = chPan[so->ch]; 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; } - s2 = getSample((cp_temp >> FRACTSIZE)+1, wf); + s2 = sample_data[(cp_temp >> FRACTSIZE)+1]; 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)) { cp_temp += diff_loop; - s2=getSample((cp_temp >> FRACTSIZE), wf); + s2 = sample_data[cp_temp >> FRACTSIZE]; } else { @@ -333,7 +332,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i if(UNLIKELY(!mode_mask24)) { cp_temp -= diff_loop; - s2=getSample((cp_temp >> FRACTSIZE), wf); + s2 = sample_data[cp_temp >> FRACTSIZE]; } else { @@ -346,7 +345,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i if(UNLIKELY(cp_temp >= num_samples)) { cp_temp -= so->delta; - s2 = getSample((cp_temp >> FRACTSIZE)+1, wf); + s2 = sample_data[(cp_temp >> FRACTSIZE)+1]; if (!rampdown) /* stop voice */ { @@ -356,7 +355,7 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i } /* 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); |