-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnmain.thread.h
75 lines (66 loc) · 1.91 KB
/
nmain.thread.h
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
/* defines nmain thread functions */
#pragma once
namespace nmain {
CRITICAL_SECTION csoutputstack;
double **outputstack = 0;
unsigned int outputstackmax;
__declspec(thread) double *output;
void initproc() {
EnterCriticalSection(&csoutputstack);
output = outputstack[outputstackmax++];
LeaveCriticalSection(&csoutputstack);
}
void workproc_clear(void *arg) {
#pragma warning(disable : 810) // conversion from "void *" to "unsigned int" may lose significant bits
unsigned int ithread = (unsigned int)arg;
#pragma warning(default : 810)
for (unsigned int s = 0; s < nregister::len * numchannels; ++s) {
outputstack[ithread][s] = 0.0;
}
}
void workproc_listen(void *arg) {
nlistener::clistener *listener = (nlistener::clistener*)arg;
listener->listen(output);
}
void stopproc() {
EnterCriticalSection(&csoutputstack);
outputstackmax--;
LeaveCriticalSection(&csoutputstack);
}
bool initoutputstack() {
outputstack = new double*[numthreads];
if (outputstack) {
unsigned int numoutputstack = 0;
for (; numoutputstack < numthreads; ++numoutputstack) {
double *newoutput = new double[nregister::len * numchannels];
if (!newoutput) break;
outputstack[numoutputstack] = newoutput;
}
if (numoutputstack == numthreads) {
for (int t = 0; t < numthreads; ++t) {
for (int i = 0; i < nregister::len * numchannels; ++i) {
outputstack[t][i] = 0.0;
}
//ippsZero_64f(outputstack[t], nregister::len * numchannels);
}
InitializeCriticalSection(&csoutputstack);
outputstackmax = 0;
return true;
}
while (numoutputstack) delete [] outputstack[--numoutputstack];
delete [] outputstack;
outputstack = 0;
}
return false;
}
void freeoutputstack() {
DeleteCriticalSection(&csoutputstack);
if (outputstack) {
for (unsigned int i = 0; i < numthreads; ++i) {
delete outputstack[i];
}
delete outputstack;
outputstack = 0;
}
}
}