summaryrefslogtreecommitdiff
path: root/apps/plugins/midi/synth.c
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2007-10-08 19:28:41 +0000
committerNils Wallménius <nils@rockbox.org>2007-10-08 19:28:41 +0000
commitf619f8167646632d6eab10f529638eebbdda6af6 (patch)
tree119a1f4051d59808a25612421f613cb09ee1e9d5 /apps/plugins/midi/synth.c
parentd712e252fecf814a48814034a55ba60a1b194598 (diff)
downloadrockbox-f619f8167646632d6eab10f529638eebbdda6af6.zip
rockbox-f619f8167646632d6eab10f529638eebbdda6af6.tar.gz
rockbox-f619f8167646632d6eab10f529638eebbdda6af6.tar.bz2
rockbox-f619f8167646632d6eab10f529638eebbdda6af6.tar.xz
Change loop structure for sample synthesizing. Gives a nice speedup on both coldfire and arm targets.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@15036 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'apps/plugins/midi/synth.c')
-rw-r--r--apps/plugins/midi/synth.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c
index 327f32e..568c7bb 100644
--- a/apps/plugins/midi/synth.c
+++ b/apps/plugins/midi/synth.c
@@ -255,8 +255,7 @@ inline void stopVoice(struct SynthObject * so)
so->decay = 0;
}
-int synthVoice(struct SynthObject * so) ICODE_ATTR;
-int synthVoice(struct SynthObject * so)
+static inline int synthVoice(struct SynthObject * so)
{
struct GWaveform * wf;
register int s;
@@ -404,3 +403,46 @@ int synthVoice(struct SynthObject * so)
return s*so->volscale>>14;
}
+/* synth num_samples samples and write them to the */
+/* buffer pointed to by buf_ptr */
+void synthSamples(int32_t *buf_ptr, unsigned int num_samples) ICODE_ATTR;
+void synthSamples(int32_t *buf_ptr, unsigned int num_samples)
+{
+ int i;
+ register int dL;
+ register int dR;
+ register int sample;
+ register struct SynthObject *voicept;
+ while(num_samples>0)
+ {
+ dL=0;
+ dR=0;
+ voicept=&voices[0];
+
+ for(i=MAX_VOICES; i > 0; i--)
+ {
+ if(voicept->isUsed==1)
+ {
+ sample = synthVoice(voicept);
+ dL += sample;
+ sample *= chPan[voicept->ch];
+ dR += sample;
+ }
+ voicept++;
+ }
+
+ dL = (dL << 7) - dR;
+
+ /* combine the left and right 16 bit samples into 32 bits and write */
+ /* to the buffer, left sample in the high word and right in the low word */
+ *buf_ptr=(((dL&0x7FFF80) << 9) | ((dR&0x7FFF80) >> 7));
+
+ buf_ptr++;
+ num_samples--;
+ }
+ /* TODO: Automatic Gain Control, anyone? */
+ /* Or, should this be implemented on the DSP's output volume instead? */
+
+ return; /* No more ghetto lowpass filter. Linear interpolation works well. */
+}
+