28 unsigned numFrames = outputBuffer.mNumFrames;
29 out1 = outputBuffer.buffer(0);
30 out2 = outputBuffer.buffer(1);
31 memset(out1, 0, numFrames *
sizeof(
sample));
32 memset(out2, 0, numFrames *
sizeof(
sample));
34 while (mCloud->gState !=
kFree) {
38 mCloud->gState =
kDSP;
40 for (
Grain * curGrain = mCloud->mPlayingGrains; curGrain != 0;
43 out1 = outputBuffer.buffer(0);
44 out2 = outputBuffer.buffer(1);
45 length = curGrain->numSamples;
46 sample * sPtr = curGrain->samples;
47 for (
unsigned i = 0; i < numFrames; i++) {
48 if (curGrain->time >= curGrain->duration)
50 if (curGrain->delay) {
54 index = (int)(curGrain->position);
57 while (index >= length)
60 durHalf = curGrain->duration * curGrain->env;
61 if (curGrain->time < durHalf)
62 env = (float) curGrain->time / durHalf;
64 env = (
float)(curGrain->duration - curGrain->time)
65 / (curGrain->duration - durHalf);
66 samp *= curGrain->amplitude * env;
68 *out1++ += samp * (1.0f - curGrain->pan);
69 *out2++ += samp * curGrain->pan;
71 curGrain->position += curGrain->rate;
72 curGrain->time += 1.0f;
76 mCloud->gState =
kFree;
90 for (
unsigned i = 0; i <
MAXGRAINS - 1; i++) {
99 logMsg(
"Create grain lists: %d available", count);
120 logMsg(
"Starting grain creation loop");
124 logMsg(
"Grain creation loop exits");
134 printf(
"\tNo free grains\n");
144 newGrain->
time = 0.0f;
156 logMsg(
"Grain creation loop exits 2");
170 Grain *prevGrain, *curGrain, *nextGrain;
172 logMsg(
"Starting grain culling loop");
176 logMsg(
"Grain culling loop exits");
185 while (curGrain != 0) {
195 curGrain = nextGrain;
199 prevGrain = curGrain;
204 logMsg(
"Grain culling loop exits 2");
222 logMsg(
"Starting grain creation/culling threads (%d)",
C_TIME);
226 logMsg(
"Grain threads running");
236 while (curGrain != 0) {
240 curGrain = nextGrain;