summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2008-11-24 21:32:08 +0000
committerNils Wallménius <nils@rockbox.org>2008-11-24 21:32:08 +0000
commit4c43f7be0aa634904f0da2eca3d51876419aa36d (patch)
tree45666b559307673ed943e174a9f45f3a6e537205
parent8486cb96c120234f6780543590a6013d8f81cf32 (diff)
downloadrockbox-4c43f7be0aa634904f0da2eca3d51876419aa36d.tar.gz
rockbox-4c43f7be0aa634904f0da2eca3d51876419aa36d.zip
Rearrange the main synth loop a little and move some tests around for a ~5% speedup on c200, increase the output buffer size to make skips less likely, playback of simple midi files should now be mostly skip free on pp based players
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19207 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/midi/midiutil.h2
-rw-r--r--apps/plugins/midi/synth.c66
2 files changed, 40 insertions, 28 deletions
diff --git a/apps/plugins/midi/midiutil.h b/apps/plugins/midi/midiutil.h
index 86e696aa99..4b1afa2928 100644
--- a/apps/plugins/midi/midiutil.h
+++ b/apps/plugins/midi/midiutil.h
@@ -21,7 +21,7 @@
21 21
22#define FRACTSIZE 12 22#define FRACTSIZE 12
23 23
24#define BUF_SIZE 8192 /* 32 kB output buffers */ 24#define BUF_SIZE 16384 /* 64 kB output buffers */
25#define NBUF 2 25#define NBUF 2
26 26
27#ifndef SIMULATOR 27#ifndef SIMULATOR
diff --git a/apps/plugins/midi/synth.c b/apps/plugins/midi/synth.c
index 969d9b939a..1d759be288 100644
--- a/apps/plugins/midi/synth.c
+++ b/apps/plugins/midi/synth.c
@@ -262,14 +262,6 @@ void setPoint(struct SynthObject * so, int pt)
262 so->curOffset = 0; 262 so->curOffset = 0;
263} 263}
264 264
265inline void stopVoice(struct SynthObject * so)
266{
267 if(so->state == STATE_RAMPDOWN)
268 return;
269 so->state = STATE_RAMPDOWN;
270 so->decay = 0;
271}
272
273static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned int samples) 265static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned int samples)
274{ 266{
275 struct GWaveform * wf; 267 struct GWaveform * wf;
@@ -293,10 +285,13 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
293 const unsigned int start_loop = wf->startLoop << FRACTSIZE; 285 const unsigned int start_loop = wf->startLoop << FRACTSIZE;
294 const int diff_loop = end_loop-start_loop; 286 const int diff_loop = end_loop-start_loop;
295 287
288 bool rampdown = (so->state == STATE_RAMPDOWN);
289 const bool ch_9 = (so->ch == 9);
290
296 while(LIKELY(samples-- > 0)) 291 while(LIKELY(samples-- > 0))
297 { 292 {
298 /* Is voice being ramped? */ 293 /* Is voice being ramped? */
299 if(UNLIKELY(so->state == STATE_RAMPDOWN)) 294 if(UNLIKELY(rampdown))
300 { 295 {
301 if(so->decay != 0) /* Ramp has been started */ 296 if(so->decay != 0) /* Ramp has been started */
302 { 297 {
@@ -305,10 +300,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
305 if(so->decay < 10 && so->decay > -10) 300 if(so->decay < 10 && so->decay > -10)
306 so->isUsed = false; 301 so->isUsed = false;
307 302
308 s1=so->decay; 303 s1 = so->decay;
309 s2 = s1*pan; 304 s2 = s1 * pan;
310 s1 = (s1<<7) -s2; 305 s1 = (s1 << 7) -s2;
311 *(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); 306 *(out++) += ((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF);
312 continue; 307 continue;
313 } 308 }
314 } else /* OK to advance voice */ 309 } else /* OK to advance voice */
@@ -354,7 +349,12 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
354 { 349 {
355 cp_temp -= so->delta; 350 cp_temp -= so->delta;
356 s2 = getSample((cp_temp >> FRACTSIZE)+1, wf); 351 s2 = getSample((cp_temp >> FRACTSIZE)+1, wf);
357 stopVoice(so); 352
353 if (!rampdown) /* stop voice */
354 {
355 rampdown = true;
356 so->decay = 0;
357 }
358 } 358 }
359 359
360 /* Better, working, linear interpolation */ 360 /* Better, working, linear interpolation */
@@ -364,12 +364,15 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
364 364
365 if(UNLIKELY(so->curRate == 0)) 365 if(UNLIKELY(so->curRate == 0))
366 { 366 {
367 stopVoice(so); 367 if (!rampdown) /* stop voice */
368 {
369 rampdown = true;
370 so->decay = 0;
371 }
368// so->isUsed = false; 372// so->isUsed = false;
369
370 } 373 }
371 374
372 if(LIKELY(so->ch != 9 && so->state != STATE_RAMPDOWN)) /* Stupid ADSR code... and don't do ADSR for drums */ 375 if(LIKELY(!ch_9 && !rampdown)) /* Stupid ADSR code... and don't do ADSR for drums */
373 { 376 {
374 if(UNLIKELY(so->curOffset < so->targetOffset)) 377 if(UNLIKELY(so->curOffset < so->targetOffset))
375 { 378 {
@@ -380,9 +383,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
380 { 383 {
381 setPoint(so, so->curPoint+1); 384 setPoint(so, so->curPoint+1);
382 } 385 }
383 else 386 else if (!rampdown) /* stop voice */
384 { 387 {
385 stopVoice(so); 388 rampdown = true;
389 so->decay = 0;
386 } 390 }
387 } 391 }
388 } else 392 } else
@@ -394,9 +398,10 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
394 { 398 {
395 setPoint(so, so->curPoint+1); 399 setPoint(so, so->curPoint+1);
396 } 400 }
397 else 401 else if (!rampdown) /* stop voice */
398 { 402 {
399 stopVoice(so); 403 rampdown = true;
404 so->decay = 0;
400 } 405 }
401 406
402 } 407 }
@@ -406,7 +411,11 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
406 if(UNLIKELY(so->curOffset < 0)) 411 if(UNLIKELY(so->curOffset < 0))
407 { 412 {
408 so->curOffset = so->targetOffset; 413 so->curOffset = so->targetOffset;
409 stopVoice(so); 414 if (!rampdown)
415 {
416 rampdown = true;
417 so->decay = 0;
418 }
410 } 419 }
411 420
412 s1 = s1 * (so->curOffset >> 22) >> 8; 421 s1 = s1 * (so->curOffset >> 22) >> 8;
@@ -416,19 +425,22 @@ static inline void synthVoice(struct SynthObject * so, int32_t * out, unsigned i
416 s1 = s1 * volscale >> 14; 425 s1 = s1 * volscale >> 14;
417 426
418 /* need to set ramp beginning */ 427 /* need to set ramp beginning */
419 if(UNLIKELY(so->state == STATE_RAMPDOWN && so->decay == 0)) 428 if(UNLIKELY(rampdown && so->decay == 0))
420 { 429 {
421 so->decay = s1; 430 so->decay = s1;
422 if(so->decay == 0) 431 if(so->decay == 0)
423 so->decay = 1; /* stupid junk.. */ 432 so->decay = 1; /* stupid junk.. */
424 } 433 }
425 434
426 s2 = s1*pan; 435 s2 = s1 * pan;
427 s1 = (s1<<7) - s2; 436 s1 = (s1 << 7) - s2;
428 *(out++)+=((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF); 437 *(out++) += ((s1 << 9) & 0xFFFF0000) | ((s2 >> 7) &0xFFFF);
429 } 438 }
430 439
431 so->cp=cp_temp; /* store this again */ 440 /* store these again */
441 if (rampdown)
442 so->state = STATE_RAMPDOWN;
443 so->cp = cp_temp;
432 return; 444 return;
433} 445}
434 446