From f619f8167646632d6eab10f529638eebbdda6af6 Mon Sep 17 00:00:00 2001 From: Nils Wallménius Date: Mon, 8 Oct 2007 19:28:41 +0000 Subject: 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 --- apps/plugins/midi/synth.c | 46 ++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 44 insertions(+), 2 deletions(-) (limited to 'apps/plugins/midi/synth.c') diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c index 327f32e288..568c7bb1ce 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. */ +} + -- cgit v1.2.3