-
Notifications
You must be signed in to change notification settings - Fork 16
/
Copy pathAudioAnalyzer.cpp
119 lines (99 loc) · 2.84 KB
/
AudioAnalyzer.cpp
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include "AudioAnalyzer.h"
#include <math.h>
namespace LiveCoder {
void fft(int n, float theta, float ar[], float ai[])
{
int m, mh, i, j, k;
float wr, wi, xr, xi;
for (m = n; (mh = m >> 1) >= 1; m = mh) {
for (i = 0; i < mh; i++) {
wr = cosf(theta * i);
wi = sinf(theta * i);
for (j = i; j < n; j += m) {
k = j + mh;
xr = ar[j] - ar[k];
xi = ai[j] - ai[k];
ar[j] += ar[k];
ai[j] += ai[k];
ar[k] = wr * xr - wi * xi;
ai[k] = wr * xi + wi * xr;
}
}
theta *= 2;
}
/* ---- unscrambler ---- */
i = 0;
for (j = 1; j < n - 1; j++) {
for (k = n >> 1; k > (i ^= k); k >>= 1);
if (j < i) {
xr = ar[j];
xi = ai[j];
ar[j] = ar[i];
ai[j] = ai[i];
ar[i] = xr;
ai[i] = xi;
}
}
}
AudioAnalyzer::AudioAnalyzer(int frequency_, int captureSize_) :
frequency(frequency_), captureSize(captureSize_), initialized(false)
{
ALenum errorCode=0;
inputDevice = alcCaptureOpenDevice(NULL, frequency, AL_FORMAT_MONO16, frequency/2);
if (inputDevice == NULL) {
Logger::Instance()->OutputString("Error: alcCaptureOpenDevice");
return;
}
errorCode = alcGetError(inputDevice);
if (errorCode != AL_NO_ERROR) {
Logger::Instance()->OutputString("Error: alcCaptureOpenDevice -- ?");
return;
}
alcCaptureStart(inputDevice); // Begin capturing
errorCode = alcGetError(inputDevice);
if (errorCode != AL_NO_ERROR) {
Logger::Instance()->OutputString("Error: alcCaptureStart");
alcCaptureCloseDevice(inputDevice);
return;
}
capturedBuffer = new short[captureSize];
ffted = new float[captureSize];
ar = new float[captureSize];
ai = new float[captureSize];
initialized = true;
Logger::Instance()->OutputString("OpenAL succeeded");
}
float* AudioAnalyzer::Capture() {
if (!initialized)
return NULL;
ALCint sampled;
alcGetIntegerv(inputDevice, ALC_CAPTURE_SAMPLES, 1, &sampled);
if (sampled > captureSize) {
// Grab the sound
alcCaptureSamples(inputDevice, capturedBuffer, captureSize);
const float theta = 2.0f * (3.1415926535898f) / captureSize;
for (int i = 0; i < captureSize; i ++) {
ar[i] = capturedBuffer[i] / 32768.0f;
// ar[i] = 0.54 - 0.46 * cos(2.0 * (3.1415926535898f) * (float)capturedBuffer[i] / 32768.0);
ai[i] = 0.0f;
}
fft(captureSize, theta , ar, ai);
for (int i = 0; i < captureSize; i ++) {
ffted[i] = 4.0f * sqrtf(ar[i]*ar[i] + ai[i]*ai[i]) / captureSize;
}
return ffted;
}
return NULL;
}
AudioAnalyzer::~AudioAnalyzer(void)
{
if (!initialized)
return;
alcCaptureStop(inputDevice);
alcCaptureCloseDevice(inputDevice);
delete[] capturedBuffer;
delete[] ffted;
delete[] ar;
delete[] ai;
}
}