Chris@0: /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ Chris@0: Chris@0: // Moving stuff around Chris@0: Chris@0: static PyObject * Chris@0: vampyhost_process(PyObject *self, PyObject *args) Chris@0: { Chris@0: //check if the plugin has been initialised Chris@0: //obtain sample Rate: maybe library:identifier:channels:stepSize:blockSize Chris@0: PyObject *pyPluginHandle; Chris@0: PyObject *pyBuffer; Chris@0: Chris@0: if (!PyArg_ParseTuple(args, "OO", Chris@0: &pyPluginHandle, // C object holding a pointer to a plugin and its descriptor Chris@0: &pyBuffer)) { // Audio data Chris@0: PyErr_SetString(PyExc_TypeError, Chris@0: "Required: plugin handle, buffer, timestmap."); Chris@0: return NULL; } Chris@0: Chris@0: string *key; Chris@0: Plugin *plugin; Chris@0: long frame = 0; Chris@0: Chris@0: if ( !getPluginHandle(pyPluginHandle, &plugin, &key) ) { Chris@0: PyErr_SetString(PyExc_AttributeError, Chris@0: "Invalid or already deleted plugin handle."); Chris@0: return NULL; } Chris@0: Chris@0: PyPluginDescriptor *pd = (PyPluginDescriptor*) key; Chris@0: Chris@0: if (!pd->isInitialised) { Chris@0: PyErr_SetString(PyExc_StandardError, Chris@0: "Plugin has not been initialised."); Chris@0: return NULL; } Chris@0: Chris@0: size_t channels = pd->channels; Chris@0: size_t blockSize = pd->blockSize; Chris@0: Chris@0: /* Chris@0: Handle the case when we get the data as a character buffer Chris@0: Handle SampleFormats: int16, float32 Chris@0: Chris@0: */ Chris@0: Chris@0: if (PyString_Check(pyBuffer)) { Chris@0: cerr << ">>> String obj passed in." << endl; Chris@0: } Chris@0: Chris@0: // size_t chlen = sizeof(short) / sizeof(char); Chris@0: Chris@0: //Assume interleaved signed 16-bit PCM data Chris@0: Chris@0: //int *intch = new int*[buflen/2]; Chris@0: //int *intch = (int*) PyString_AS_STRING(pyBuffer); Chris@0: //short *tmpch = Chris@0: //reinterpret_cast (PyString_AS_STRING(pyBuffer)); Chris@0: Chris@0: typedef char int16[2]; //can we trust sizeof(short) = 2 ? Chris@0: size_t sample_size = sizeof(int16); Chris@0: Chris@0: long buflen = (long) PyString_GET_SIZE(pyBuffer); Chris@0: Chris@0: size_t input_length = Chris@0: static_cast (buflen/channels/sample_size); Chris@0: Chris@0: if (input_length == pd->blockSize) { Chris@0: cerr << ">>> A full block has been passed in." << endl; } Chris@0: Chris@0: int16 *input = Chris@0: reinterpret_cast (PyString_AS_STRING(pyBuffer)); Chris@0: Chris@0: // int16 *input = new int16[buflen/sample_size]; Chris@0: // input = reinterpret_cast (PyString_AS_STRING(pyBuffer)); Chris@0: Chris@0: // short *input = Chris@0: // reinterpret_cast (PyString_AS_STRING(pyBuffer)); Chris@0: Chris@0: //float ffirst = Chris@0: //static_cast (*input[1000]) / Chris@0: //static_cast (SHRT_MAX); Chris@0: Chris@0: // int *proba[10]; -> pointer array Chris@0: int *proba = new int[10]; // -> actual array of ints Chris@0: int p = 234; Chris@0: proba[1]=p; Chris@0: size_t chlen = (size_t) buflen/2; Chris@0: //short smax = SHRT_MAX; Chris@0: cerr Chris@0: << " c: " << sizeof(char) Chris@0: << " s: " << sizeof(short) Chris@0: //<< " i16: " << sizeof(int16) Chris@0: << " i:" << sizeof(int) Chris@0: << " float:" << sizeof(float) Chris@0: << " [proba]: " << proba[1] Chris@0: //<< " ffirst: " << ffirst Chris@0: << endl; Chris@0: Chris@0: //vector *intch = (vector*) PyString_AS_STRING(pyBuffer); Chris@0: //size_t chlen = intch->size(); Chris@0: //cerr << ">>>Size of ch buffer: " << chlen << endl; Chris@0: Chris@0: //convert int16 PCM data to 32-bit floats Chris@0: float **plugbuf = new float*[channels]; Chris@0: float smax = static_cast (SHRT_MAX); Chris@0: Chris@0: for (size_t c = 0; c < channels; ++c) { Chris@0: Chris@0: plugbuf[c] = new float[blockSize+2]; Chris@0: Chris@0: size_t j = 0; Chris@0: while (j < input_length) { Chris@0: //int *v = (*int) input[j * channels + c]; Chris@0: //int value = 5;//input[j * channels + c]; Chris@0: // short *v = (short*) input+j; Chris@0: // short value = *v; Chris@0: //int *v = (int*) input+j; Chris@0: int *v = new int; Chris@0: *v = 0; Chris@0: char *wc = (char*) v; Chris@0: char *ic = (char*) input[j]; Chris@0: wc=wc+2; Chris@0: *wc = *ic; Chris@0: wc++; ic++; Chris@0: *wc = *ic; Chris@0: Chris@0: int value = *v; Chris@0: Chris@0: plugbuf[c][j] = static_cast (value/100000); Chris@0: // works if short=2 static_cast (*input[j * channels + c]) / smax; Chris@0: // static_cast (input[j * channels + c]) / smax; Chris@0: ++j; Chris@0: } Chris@0: while (j < blockSize) { Chris@0: plugbuf[c][j] = 0.0f; Chris@0: ++j; Chris@0: } Chris@0: Chris@0: //} Chris@0: } Chris@0: Chris@0: const char *output = reinterpret_cast (plugbuf[0]); Chris@0: Py_ssize_t len = (Py_ssize_t) channels*blockSize*4; Chris@0: Chris@0: PyObject* pyReturnBuffer = Chris@0: PyString_FromStringAndSize(output,len); Chris@0: Chris@0: return pyReturnBuffer; Chris@0: Chris@0: Chris@0: /* NOW return the data in a PyBuffer Chris@0: Chris@0: */ Chris@0: Chris@0: /* Chris@0: char* test = PyString_AS_STRING(pyBuffer); Chris@0: cerr << "Passed in: " << buflen << " str: " << test << endl; Chris@0: Chris@0: //convert the buffer to plugbuf Chris@0: Chris@0: //plugin->process Chris@0: // (plugbuf, RealTime::frame2RealTime(frame, samplerate)) Chris@0: Chris@0: for(size_t k=0; k