common: prevent buffer overflow
[supercollider.git] / server / scsynth / Samp.cpp
blob9f92a09c766a4444e42a81f793dda0c99b13dfbf
1 /*
2 SuperCollider real time audio synthesis system
3 Copyright (c) 2002 James McCartney. All rights reserved.
4 http://www.audiosynth.com
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "SC_Samp.h"
23 #include "SC_Constants.h"
24 #include <stdlib.h>
26 float32 gSine[kSineSize+1];
27 float32 gInvSine[kSineSize+1];
28 float32 gSineWavetable[2*kSineSize];
30 void SignalAsWavetable(float32* signal, float32* wavetable, long inSize)
32 float32 val1, val2;
34 float32* in = signal;
35 float32* out = wavetable - 1;
36 for (int i=0; i<inSize; ++i) {
37 val1 = in[i];
38 val2 = in[i+1];
39 *++out = 2.f * val1 - val2;
40 *++out = val2 - val1;
42 val1 = in[inSize-1];
43 val2 = in[0];
44 *++out = 2.f * val1 - val2;
45 *++out = val2 - val1;
48 class AudioLibInit
50 public:
51 AudioLibInit();
53 void FillTables();
56 AudioLibInit gAudioLibInit;
58 AudioLibInit::AudioLibInit()
60 FillTables();
63 void AudioLibInit::FillTables()
65 double sineIndexToPhase = twopi / kSineSize;
66 for (int i=0; i <= kSineSize; ++i) {
67 double phase = i * sineIndexToPhase;
68 float32 d = (float)sin(phase);
69 gSine[i] = d;
70 if( d == 0. )
71 gInvSine[i] = 0.;
72 else
73 gInvSine[i] = (float)(1. / d);
75 SignalAsWavetable(gSine, gSineWavetable, kSineSize);
77 gInvSine[0] = gInvSine[kSineSize/2] = gInvSine[kSineSize] = kBadValue;
78 int sz = kSineSize;
79 int sz2 = sz>>1;
80 for (int i=1; i<=32; ++i) {
81 gInvSine[i] = gInvSine[sz-i] = kBadValue;
82 gInvSine[sz2-i] = gInvSine[sz2+i] = kBadValue;
84 //SignalAsWavetable(gInvSine, gInvSineWavetable, kSineSize);