Chris@0
|
1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
|
Chris@0
|
2
|
Chris@0
|
3 // Moving stuff around
|
Chris@0
|
4
|
Chris@0
|
5 static PyObject *
|
Chris@0
|
6 vampyhost_process(PyObject *self, PyObject *args)
|
Chris@0
|
7 {
|
Chris@0
|
8 //check if the plugin has been initialised
|
Chris@0
|
9 //obtain sample Rate: maybe library:identifier:channels:stepSize:blockSize
|
Chris@0
|
10 PyObject *pyPluginHandle;
|
Chris@0
|
11 PyObject *pyBuffer;
|
Chris@0
|
12
|
Chris@0
|
13 if (!PyArg_ParseTuple(args, "OO",
|
Chris@0
|
14 &pyPluginHandle, // C object holding a pointer to a plugin and its descriptor
|
Chris@0
|
15 &pyBuffer)) { // Audio data
|
Chris@0
|
16 PyErr_SetString(PyExc_TypeError,
|
Chris@0
|
17 "Required: plugin handle, buffer, timestmap.");
|
Chris@0
|
18 return NULL; }
|
Chris@0
|
19
|
Chris@0
|
20 string *key;
|
Chris@0
|
21 Plugin *plugin;
|
Chris@0
|
22 long frame = 0;
|
Chris@0
|
23
|
Chris@0
|
24 if ( !getPluginHandle(pyPluginHandle, &plugin, &key) ) {
|
Chris@0
|
25 PyErr_SetString(PyExc_AttributeError,
|
Chris@0
|
26 "Invalid or already deleted plugin handle.");
|
Chris@0
|
27 return NULL; }
|
Chris@0
|
28
|
Chris@0
|
29 PyPluginDescriptor *pd = (PyPluginDescriptor*) key;
|
Chris@0
|
30
|
Chris@0
|
31 if (!pd->isInitialised) {
|
Chris@0
|
32 PyErr_SetString(PyExc_StandardError,
|
Chris@0
|
33 "Plugin has not been initialised.");
|
Chris@0
|
34 return NULL; }
|
Chris@0
|
35
|
Chris@0
|
36 size_t channels = pd->channels;
|
Chris@0
|
37 size_t blockSize = pd->blockSize;
|
Chris@0
|
38
|
Chris@0
|
39 /*
|
Chris@0
|
40 Handle the case when we get the data as a character buffer
|
Chris@0
|
41 Handle SampleFormats: int16, float32
|
Chris@0
|
42
|
Chris@0
|
43 */
|
Chris@0
|
44
|
Chris@0
|
45 if (PyString_Check(pyBuffer)) {
|
Chris@0
|
46 cerr << ">>> String obj passed in." << endl;
|
Chris@0
|
47 }
|
Chris@0
|
48
|
Chris@0
|
49 // size_t chlen = sizeof(short) / sizeof(char);
|
Chris@0
|
50
|
Chris@0
|
51 //Assume interleaved signed 16-bit PCM data
|
Chris@0
|
52
|
Chris@0
|
53 //int *intch = new int*[buflen/2];
|
Chris@0
|
54 //int *intch = (int*) PyString_AS_STRING(pyBuffer);
|
Chris@0
|
55 //short *tmpch =
|
Chris@0
|
56 //reinterpret_cast <short*> (PyString_AS_STRING(pyBuffer));
|
Chris@0
|
57
|
Chris@0
|
58 typedef char int16[2]; //can we trust sizeof(short) = 2 ?
|
Chris@0
|
59 size_t sample_size = sizeof(int16);
|
Chris@0
|
60
|
Chris@0
|
61 long buflen = (long) PyString_GET_SIZE(pyBuffer);
|
Chris@0
|
62
|
Chris@0
|
63 size_t input_length =
|
Chris@0
|
64 static_cast <size_t> (buflen/channels/sample_size);
|
Chris@0
|
65
|
Chris@0
|
66 if (input_length == pd->blockSize) {
|
Chris@0
|
67 cerr << ">>> A full block has been passed in." << endl; }
|
Chris@0
|
68
|
Chris@0
|
69 int16 *input =
|
Chris@0
|
70 reinterpret_cast <int16*> (PyString_AS_STRING(pyBuffer));
|
Chris@0
|
71
|
Chris@0
|
72 // int16 *input = new int16[buflen/sample_size];
|
Chris@0
|
73 // input = reinterpret_cast <int16*> (PyString_AS_STRING(pyBuffer));
|
Chris@0
|
74
|
Chris@0
|
75 // short *input =
|
Chris@0
|
76 // reinterpret_cast <short*> (PyString_AS_STRING(pyBuffer));
|
Chris@0
|
77
|
Chris@0
|
78 //float ffirst =
|
Chris@0
|
79 //static_cast <float> (*input[1000]) /
|
Chris@0
|
80 //static_cast <float> (SHRT_MAX);
|
Chris@0
|
81
|
Chris@0
|
82 // int *proba[10]; -> pointer array
|
Chris@0
|
83 int *proba = new int[10]; // -> actual array of ints
|
Chris@0
|
84 int p = 234;
|
Chris@0
|
85 proba[1]=p;
|
Chris@0
|
86 size_t chlen = (size_t) buflen/2;
|
Chris@0
|
87 //short smax = SHRT_MAX;
|
Chris@0
|
88 cerr
|
Chris@0
|
89 << " c: " << sizeof(char)
|
Chris@0
|
90 << " s: " << sizeof(short)
|
Chris@0
|
91 //<< " i16: " << sizeof(int16)
|
Chris@0
|
92 << " i:" << sizeof(int)
|
Chris@0
|
93 << " float:" << sizeof(float)
|
Chris@0
|
94 << " [proba]: " << proba[1]
|
Chris@0
|
95 //<< " ffirst: " << ffirst
|
Chris@0
|
96 << endl;
|
Chris@0
|
97
|
Chris@0
|
98 //vector<int> *intch = (vector<int>*) PyString_AS_STRING(pyBuffer);
|
Chris@0
|
99 //size_t chlen = intch->size();
|
Chris@0
|
100 //cerr << ">>>Size of ch buffer: " << chlen << endl;
|
Chris@0
|
101
|
Chris@0
|
102 //convert int16 PCM data to 32-bit floats
|
Chris@0
|
103 float **plugbuf = new float*[channels];
|
Chris@0
|
104 float smax = static_cast <float> (SHRT_MAX);
|
Chris@0
|
105
|
Chris@0
|
106 for (size_t c = 0; c < channels; ++c) {
|
Chris@0
|
107
|
Chris@0
|
108 plugbuf[c] = new float[blockSize+2];
|
Chris@0
|
109
|
Chris@0
|
110 size_t j = 0;
|
Chris@0
|
111 while (j < input_length) {
|
Chris@0
|
112 //int *v = (*int) input[j * channels + c];
|
Chris@0
|
113 //int value = 5;//input[j * channels + c];
|
Chris@0
|
114 // short *v = (short*) input+j;
|
Chris@0
|
115 // short value = *v;
|
Chris@0
|
116 //int *v = (int*) input+j;
|
Chris@0
|
117 int *v = new int;
|
Chris@0
|
118 *v = 0;
|
Chris@0
|
119 char *wc = (char*) v;
|
Chris@0
|
120 char *ic = (char*) input[j];
|
Chris@0
|
121 wc=wc+2;
|
Chris@0
|
122 *wc = *ic;
|
Chris@0
|
123 wc++; ic++;
|
Chris@0
|
124 *wc = *ic;
|
Chris@0
|
125
|
Chris@0
|
126 int value = *v;
|
Chris@0
|
127
|
Chris@0
|
128 plugbuf[c][j] = static_cast <float> (value/100000);
|
Chris@0
|
129 // works if short=2 static_cast <float> (*input[j * channels + c]) / smax;
|
Chris@0
|
130 // static_cast <float> (input[j * channels + c]) / smax;
|
Chris@0
|
131 ++j;
|
Chris@0
|
132 }
|
Chris@0
|
133 while (j < blockSize) {
|
Chris@0
|
134 plugbuf[c][j] = 0.0f;
|
Chris@0
|
135 ++j;
|
Chris@0
|
136 }
|
Chris@0
|
137
|
Chris@0
|
138 //}
|
Chris@0
|
139 }
|
Chris@0
|
140
|
Chris@0
|
141 const char *output = reinterpret_cast <const char*> (plugbuf[0]);
|
Chris@0
|
142 Py_ssize_t len = (Py_ssize_t) channels*blockSize*4;
|
Chris@0
|
143
|
Chris@0
|
144 PyObject* pyReturnBuffer =
|
Chris@0
|
145 PyString_FromStringAndSize(output,len);
|
Chris@0
|
146
|
Chris@0
|
147 return pyReturnBuffer;
|
Chris@0
|
148
|
Chris@0
|
149
|
Chris@0
|
150 /* NOW return the data in a PyBuffer
|
Chris@0
|
151
|
Chris@0
|
152 */
|
Chris@0
|
153
|
Chris@0
|
154 /*
|
Chris@0
|
155 char* test = PyString_AS_STRING(pyBuffer);
|
Chris@0
|
156 cerr << "Passed in: " << buflen << " str: " << test << endl;
|
Chris@0
|
157
|
Chris@0
|
158 //convert the buffer to plugbuf
|
Chris@0
|
159
|
Chris@0
|
160 //plugin->process
|
Chris@0
|
161 // (plugbuf, RealTime::frame2RealTime(frame, samplerate))
|
Chris@0
|
162
|
Chris@0
|
163 for(size_t k=0; k<channels; k++){
|
Chris@0
|
164 delete[] plugbuf[k];
|
Chris@0
|
165 }
|
Chris@0
|
166 delete[] plugbuf;
|
Chris@0
|
167 */
|
Chris@0
|
168 return pyReturnBuffer;
|
Chris@0
|
169
|
Chris@0
|
170 }
|