summaryrefslogtreecommitdiffstats
path: root/apps
diff options
context:
space:
mode:
authorLinus Nielsen Feltzing <linus@haxx.se>2007-04-11 10:48:50 +0000
committerLinus Nielsen Feltzing <linus@haxx.se>2007-04-11 10:48:50 +0000
commit7c4b786851ec90364c0335b46d093fb6dba1af01 (patch)
tree562892475a99808145cb6a35f4098cd2dc78ff15 /apps
parent08e633c25c3f70d8d8b900cf09576986a398a474 (diff)
downloadrockbox-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.c5
-rw-r--r--apps/plugins/midi/synth.c8
-rw-r--r--apps/plugins/midiplay.c12
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)
{