-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathnoise.c
70 lines (56 loc) · 1.55 KB
/
noise.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <SDL.h>
#include <math.h>
#include "noise.h"
static TNoise noises[128];
static TNoise *next_noise = noises;
static TNoise * noise_new() {
if (next_noise >= noises + 128) return noises + 127;
return next_noise++;
}
void make_noise(float freq, int duration) {
TNoise *n = noise_new();
n->freq = freq * (M_PI / 22050.0);
n->time = (Uint16) (duration * 22.050);
}
void noise_play(TNoise * n) {
TNoise *nn = noise_new();
nn->freq = n->freq;
nn->time = n->time;
}
void noise_callback(void *data, Uint8 *buf, int len) {
static Uint16 immortal_counter = 0;
TNoise *noise;
/* initialize buffer */
memset(buf, 0, len); /* TODO use a real silence value */
/* any noises happening? */
if (next_noise == noises) return;
/* for each noise.. */
for (noise = next_noise-1; noise >= noises; noise--) {
float phase = (float)immortal_counter;
float freq;
int time, fill, i;
/* how many samples to fill? */
time = noise->time;
if (len < time) fill = len;
else fill = time;
/* grab the rest of the noise's attributes */
freq = noise->freq;
/* deduct fill time from noise's total time */
time -= fill;
/* erase noise if it's finishing */
if (time == 0) {
next_noise--;
if ((noise < noises + 127) && (noise != next_noise))
memcpy(noise, next_noise, sizeof(TNoise));
}
else {
noise->time = time;
}
/* fill sample buffer */
for (i=0; i<fill; i++) {
phase += 1.0;
buf[i] += 50 + (int)(50.0 * sin(phase * freq));
}
}
immortal_counter += len;
}