diff options
author | Linus Nielsen Feltzing <linus@haxx.se> | 2007-04-11 10:48:50 +0000 |
---|---|---|
committer | Linus Nielsen Feltzing <linus@haxx.se> | 2007-04-11 10:48:50 +0000 |
commit | 7c4b786851ec90364c0335b46d093fb6dba1af01 (patch) | |
tree | 562892475a99808145cb6a35f4098cd2dc78ff15 /apps | |
parent | 08e633c25c3f70d8d8b900cf09576986a398a474 (diff) | |
download | rockbox-7c4b786851ec90364c0335b46d093fb6dba1af01.tar.gz rockbox-7c4b786851ec90364c0335b46d093fb6dba1af01.zip |
Some quick and dirty MIDI player optimizations, now it works on the X5 and M5 too
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13108 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/midi/guspat.c | 5 | ||||
-rw-r--r-- | apps/plugins/midi/synth.c | 8 | ||||
-rw-r--r-- | apps/plugins/midiplay.c | 12 |
3 files changed, 11 insertions, 14 deletions
diff --git a/apps/plugins/midi/guspat.c b/apps/plugins/midi/guspat.c index 716c20d99e..983589fcfd 100644 --- a/apps/plugins/midi/guspat.c +++ b/apps/plugins/midi/guspat.c @@ -29,9 +29,12 @@ unsigned int readDWord(int file) return (readChar(file)<<0) | (readChar(file)<<8) | (readChar(file)<<16) | (readChar(file)<<24); } +int curr_waveform; +struct GWaveform waveforms[32] IBSS_ATTR; + struct GWaveform * loadWaveform(int file) { - struct GWaveform * wav = (struct GWaveform *)malloc(sizeof(struct GWaveform)); + struct GWaveform * wav = &waveforms[curr_waveform++]; rb->memset(wav, 0, sizeof(struct GWaveform)); wav->name=readData(file, 7); diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index a3a3d608e7..5a7a02f0a1 100644 --- a/apps/plugins/midi/synth.c +++ b/apps/plugins/midi/synth.c @@ -182,12 +182,7 @@ int initSynth(struct MIDIfile * mf, char * filename, char * drumConfig) return 0; } -inline short getSample(int s,struct GWaveform * wf ) -{ - /* Sign conversion moved to guspat.c */ - /* 8bit conversion NOT YET IMPLEMENTED in guspat.c */ - return ((short *) wf->data)[s]; -} +#define getSample(s,wf) ((short *)(wf)->data)[s] void setPoint(struct SynthObject * so, int pt) { @@ -254,6 +249,7 @@ inline void stopVoice(struct SynthObject * so) so->decay = 0; } +signed short int synthVoice(struct SynthObject * so) ICODE_ATTR; signed short int synthVoice(struct SynthObject * so) { struct GWaveform * wf; diff --git a/apps/plugins/midiplay.c b/apps/plugins/midiplay.c index 61a834755f..1e3a62b58a 100644 --- a/apps/plugins/midiplay.c +++ b/apps/plugins/midiplay.c @@ -81,7 +81,7 @@ PLUGIN_IRAM_DECLARE #ifndef SIMULATOR #define SAMPLE_RATE 22050 // 44100 22050 11025 - #define MAX_VOICES 14 // Note: 24 midi channels is the minimum general midi + #define MAX_VOICES 20 // Note: 24 midi channels is the minimum general midi // spec implementation #else // Simulator requires 44100, and we can afford to use more voices #define SAMPLE_RATE 44100 @@ -89,7 +89,7 @@ PLUGIN_IRAM_DECLARE #endif -#define BUF_SIZE 512 +#define BUF_SIZE 256 #define NBUF 2 #undef SYNC @@ -110,7 +110,7 @@ long bpm IBSS_ATTR; #include "midi/midifile.c" #include "midi/synth.c" -short gmbuf[BUF_SIZE*NBUF] IBSS_ATTR; +long gmbuf[BUF_SIZE*NBUF]; int quit=0; struct plugin_api * rb; @@ -165,7 +165,7 @@ bool lastswap=1; inline void synthbuf(void) { - short *outptr; + long *outptr; register int i; static int currentSample=0; int synthtemp[2]; @@ -183,9 +183,7 @@ inline void synthbuf(void) { synthSample(&synthtemp[0], &synthtemp[1]); currentSample++; - *outptr=synthtemp[0]&0xFFFF; - outptr++; - *outptr=synthtemp[1]&0xFFFF; + *outptr=((synthtemp[0]&0xFFFF) << 16) | (synthtemp[1]&0xFFFF); outptr++; if(currentSample==numberOfSamples) { |