From: <m97...@us...> - 2007-06-26 08:01:31
|
Revision: 6662 http://svn.sourceforge.net/openmsx/?rev=6662&view=rev Author: m9710797 Date: 2007-06-26 01:01:25 -0700 (Tue, 26 Jun 2007) Log Message: ----------- small optimization Modified Paths: -------------- openmsx/trunk/src/sound/BlipBuffer.cc Modified: openmsx/trunk/src/sound/BlipBuffer.cc =================================================================== --- openmsx/trunk/src/sound/BlipBuffer.cc 2007-06-24 00:18:05 UTC (rev 6661) +++ openmsx/trunk/src/sound/BlipBuffer.cc 2007-06-26 08:01:25 UTC (rev 6662) @@ -11,9 +11,8 @@ static const int BLIP_SAMPLE_BITS = 30; static const int BLIP_RES = 1 << BlipBuffer::BLIP_PHASE_BITS; static const int IMPULSE_WIDTH = 16; -static const int IMPULSES_SIZE = BLIP_RES * (IMPULSE_WIDTH / 2) + 1; -static int impulses[IMPULSES_SIZE]; +static int impulses[BLIP_RES][IMPULSE_WIDTH]; static void initImpulse() { @@ -58,10 +57,12 @@ double rescale = kernelUnit / (2.0 * total); // integrate, first difference, rescale, convert to int + static const int IMPULSES_SIZE = BLIP_RES * (IMPULSE_WIDTH / 2) + 1; + static int imp[IMPULSES_SIZE]; double sum = 0.0; double next = 0.0; for (int i = 0; i < IMPULSES_SIZE; ++i) { - impulses[i] = (int)floor((next - sum) * rescale + 0.5); + imp[i] = (int)floor((next - sum) * rescale + 0.5); sum += fimpulse[i]; next += fimpulse[i + BLIP_RES]; } @@ -71,15 +72,25 @@ int p2 = BLIP_RES - 2 - p; int error = kernelUnit; for (int i = 1; i < IMPULSES_SIZE; i += BLIP_RES) { - error -= impulses[i + p ]; - error -= impulses[i + p2]; + error -= imp[i + p ]; + error -= imp[i + p2]; } if (p == p2) { // phase = 0.5 impulse uses same half for both sides error /= 2; } - impulses[IMPULSES_SIZE - BLIP_RES + p] += error; + imp[IMPULSES_SIZE - BLIP_RES + p] += error; } + + // reshuffle to a more cache friendly order + for (int phase = 0; phase < BLIP_RES; ++phase) { + const int* imp_fwd = &imp[BLIP_RES - phase]; + const int* imp_rev = &imp[phase]; + for (int i = 0; i < IMPULSE_WIDTH / 2; ++i) { + impulses[phase][ i] = imp_fwd[BLIP_RES * i]; + impulses[phase][15 - i] = imp_rev[BLIP_RES * i]; + } + } } BlipBuffer::BlipBuffer() @@ -102,27 +113,10 @@ lastAmp = amp; unsigned phase = time.fractAsInt(); - const int* imp_fwd = &impulses[BLIP_RES - phase]; - const int* imp_rev = &impulses[phase]; unsigned ofst = time.toInt() + offset; - - buffer[(ofst + 0) & BUFFER_MASK] += imp_fwd[BLIP_RES * 0] * delta; - buffer[(ofst + 1) & BUFFER_MASK] += imp_fwd[BLIP_RES * 1] * delta; - buffer[(ofst + 2) & BUFFER_MASK] += imp_fwd[BLIP_RES * 2] * delta; - buffer[(ofst + 3) & BUFFER_MASK] += imp_fwd[BLIP_RES * 3] * delta; - buffer[(ofst + 4) & BUFFER_MASK] += imp_fwd[BLIP_RES * 4] * delta; - buffer[(ofst + 5) & BUFFER_MASK] += imp_fwd[BLIP_RES * 5] * delta; - buffer[(ofst + 6) & BUFFER_MASK] += imp_fwd[BLIP_RES * 6] * delta; - buffer[(ofst + 7) & BUFFER_MASK] += imp_fwd[BLIP_RES * 7] * delta; - - buffer[(ofst + 8) & BUFFER_MASK] += imp_rev[BLIP_RES * 7] * delta; - buffer[(ofst + 9) & BUFFER_MASK] += imp_rev[BLIP_RES * 6] * delta; - buffer[(ofst + 10) & BUFFER_MASK] += imp_rev[BLIP_RES * 5] * delta; - buffer[(ofst + 11) & BUFFER_MASK] += imp_rev[BLIP_RES * 4] * delta; - buffer[(ofst + 12) & BUFFER_MASK] += imp_rev[BLIP_RES * 3] * delta; - buffer[(ofst + 13) & BUFFER_MASK] += imp_rev[BLIP_RES * 2] * delta; - buffer[(ofst + 14) & BUFFER_MASK] += imp_rev[BLIP_RES * 1] * delta; - buffer[(ofst + 15) & BUFFER_MASK] += imp_rev[BLIP_RES * 0] * delta; + for (int i = 0; i < IMPULSE_WIDTH; ++i) { + buffer[(ofst + i) & BUFFER_MASK] += impulses[phase][i] * delta; + } } bool BlipBuffer::readSamples(int* out, unsigned samples, unsigned pitch) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |