annotate vampyhost-junk.cpp @ 11:e5b575d69b01 lf-numpy-arrays

changed a comment
author luisf <luis.figueira@eecs.qmul.ac.uk>
date Wed, 20 Mar 2013 11:07:24 +0000
parents 68f3f32565b4
children
rev   line source
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 }