Mercurial > hg > vampy-host
comparison native/PyPluginObject.cpp @ 102:216ed5a72c36
Some preliminary changes toward py2/3 compatibility (but the module load stuff remains quite a big deal)
| author | Chris Cannam |
|---|---|
| date | Tue, 10 Feb 2015 12:28:53 +0000 |
| parents | 4bed6bf67243 |
| children | cf56111935fa |
comparison
equal
deleted
inserted
replaced
| 101:0c5a4dc04ed9 | 102:216ed5a72c36 |
|---|---|
| 41 #define PY_ARRAY_UNIQUE_SYMBOL VAMPYHOST_ARRAY_API | 41 #define PY_ARRAY_UNIQUE_SYMBOL VAMPYHOST_ARRAY_API |
| 42 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION | 42 #define NPY_NO_DEPRECATED_API NPY_1_7_API_VERSION |
| 43 #define NO_IMPORT_ARRAY | 43 #define NO_IMPORT_ARRAY |
| 44 #include "numpy/arrayobject.h" | 44 #include "numpy/arrayobject.h" |
| 45 | 45 |
| 46 #if PY_MAJOR_VERSION < 3 | |
| 47 #include "intobject.h" | |
| 48 #endif | |
| 49 | |
| 46 #include "structmember.h" | 50 #include "structmember.h" |
| 47 | 51 |
| 48 #include "FloatConversion.h" | 52 #include "FloatConversion.h" |
| 49 #include "VectorConversion.h" | 53 #include "VectorConversion.h" |
| 50 #include "PyRealTime.h" | 54 #include "PyRealTime.h" |
| 76 | 80 |
| 77 static | 81 static |
| 78 PyObject * | 82 PyObject * |
| 79 pystr(const string &s) | 83 pystr(const string &s) |
| 80 { | 84 { |
| 85 #if PY_MAJOR_VERSION < 3 | |
| 81 return PyString_FromString(s.c_str()); | 86 return PyString_FromString(s.c_str()); |
| 87 #else | |
| 88 return PyUnicode_FromString(s.c_str()); | |
| 89 #endif | |
| 90 } | |
| 91 | |
| 92 static | |
| 93 string | |
| 94 py2str(PyObject *obj) | |
| 95 { | |
| 96 #if PY_MAJOR_VERSION < 3 | |
| 97 return PyString_AsString(obj); | |
| 98 #else | |
| 99 return PyBytes_AsString(PyUnicode_AsUTF8String(obj)); | |
| 100 #endif | |
| 82 } | 101 } |
| 83 | 102 |
| 84 PyObject * | 103 PyObject * |
| 85 PyPluginObject_From_Plugin(Plugin *plugin) | 104 PyPluginObject_From_Plugin(Plugin *plugin) |
| 86 { | 105 { |
| 92 pd->blockSize = 0; | 111 pd->blockSize = 0; |
| 93 pd->stepSize = 0; | 112 pd->stepSize = 0; |
| 94 | 113 |
| 95 PyObject *infodict = PyDict_New(); | 114 PyObject *infodict = PyDict_New(); |
| 96 PyDict_SetItemString | 115 PyDict_SetItemString |
| 97 (infodict, "api_version", PyInt_FromLong(plugin->getVampApiVersion())); | 116 (infodict, "api_version", PyLong_FromLong(plugin->getVampApiVersion())); |
| 98 PyDict_SetItemString | 117 PyDict_SetItemString |
| 99 (infodict, "plugin_version", PyInt_FromLong(plugin->getPluginVersion())); | 118 (infodict, "plugin_version", PyLong_FromLong(plugin->getPluginVersion())); |
| 100 PyDict_SetItemString | 119 PyDict_SetItemString |
| 101 (infodict, "identifier", pystr(plugin->getIdentifier())); | 120 (infodict, "identifier", pystr(plugin->getIdentifier())); |
| 102 PyDict_SetItemString | 121 PyDict_SetItemString |
| 103 (infodict, "name", pystr(plugin->getName())); | 122 (infodict, "name", pystr(plugin->getName())); |
| 104 PyDict_SetItemString | 123 PyDict_SetItemString |
| 183 PyDict_SetItemString | 202 PyDict_SetItemString |
| 184 (outdict, "description", pystr(desc.description)); | 203 (outdict, "description", pystr(desc.description)); |
| 185 PyDict_SetItemString | 204 PyDict_SetItemString |
| 186 (outdict, "unit", pystr(desc.unit)); | 205 (outdict, "unit", pystr(desc.unit)); |
| 187 PyDict_SetItemString | 206 PyDict_SetItemString |
| 188 (outdict, "has_fixed_bin_count", PyInt_FromLong(desc.hasFixedBinCount)); | 207 (outdict, "has_fixed_bin_count", PyLong_FromLong(desc.hasFixedBinCount)); |
| 189 if (desc.hasFixedBinCount) { | 208 if (desc.hasFixedBinCount) { |
| 190 PyDict_SetItemString | 209 PyDict_SetItemString |
| 191 (outdict, "bin_count", PyInt_FromLong(desc.binCount)); | 210 (outdict, "bin_count", PyLong_FromLong(desc.binCount)); |
| 192 if (!desc.binNames.empty()) { | 211 if (!desc.binNames.empty()) { |
| 193 PyDict_SetItemString | 212 PyDict_SetItemString |
| 194 (outdict, "bin_names", conv.PyValue_From_StringVector(desc.binNames)); | 213 (outdict, "bin_names", conv.PyValue_From_StringVector(desc.binNames)); |
| 195 } | 214 } |
| 196 } | 215 } |
| 216 PyDict_SetItemString | 235 PyDict_SetItemString |
| 217 (outdict, "is_quantized", Py_False); | 236 (outdict, "is_quantized", Py_False); |
| 218 } | 237 } |
| 219 } | 238 } |
| 220 PyDict_SetItemString | 239 PyDict_SetItemString |
| 221 (outdict, "sample_type", PyInt_FromLong((int)desc.sampleType)); | 240 (outdict, "sample_type", PyLong_FromLong((int)desc.sampleType)); |
| 222 PyDict_SetItemString | 241 PyDict_SetItemString |
| 223 (outdict, "sample_rate", PyFloat_FromDouble(desc.sampleRate)); | 242 (outdict, "sample_rate", PyFloat_FromDouble(desc.sampleRate)); |
| 224 PyDict_SetItemString | 243 PyDict_SetItemString |
| 225 (outdict, "has_duration", desc.hasDuration ? Py_True : Py_False); | 244 (outdict, "has_duration", desc.hasDuration ? Py_True : Py_False); |
| 226 PyDict_SetItemString | 245 PyDict_SetItemString |
| 227 (outdict, "output_index", PyInt_FromLong(ix)); | 246 (outdict, "output_index", PyLong_FromLong(ix)); |
| 228 return outdict; | 247 return outdict; |
| 229 } | 248 } |
| 230 | 249 |
| 231 static PyObject * | 250 static PyObject * |
| 232 get_output(PyObject *self, PyObject *args) | 251 get_output(PyObject *self, PyObject *args) |
| 247 PyErr_Clear(); | 266 PyErr_Clear(); |
| 248 | 267 |
| 249 Plugin::OutputList ol = pd->plugin->getOutputDescriptors(); | 268 Plugin::OutputList ol = pd->plugin->getOutputDescriptors(); |
| 250 | 269 |
| 251 if (pyId) { | 270 if (pyId) { |
| 252 string id = PyString_AS_STRING(pyId); | 271 string id = py2str(pyId); |
| 253 for (int i = 0; i < int(ol.size()); ++i) { | 272 for (int i = 0; i < int(ol.size()); ++i) { |
| 254 if (ol[i].identifier == id) { | 273 if (ol[i].identifier == id) { |
| 255 return convertOutput(ol[i], i); | 274 return convertOutput(ol[i], i); |
| 256 } | 275 } |
| 257 } | 276 } |
| 259 if (n >= 0 && n < int(ol.size())) { | 278 if (n >= 0 && n < int(ol.size())) { |
| 260 return convertOutput(ol[n], n); | 279 return convertOutput(ol[n], n); |
| 261 } | 280 } |
| 262 } | 281 } |
| 263 | 282 |
| 264 PyErr_SetString(PyExc_StandardError, | 283 PyErr_SetString(PyExc_Exception, |
| 265 "unknown output id or output index out of range"); | 284 "unknown output id or output index out of range"); |
| 266 return 0; | 285 return 0; |
| 267 } | 286 } |
| 268 | 287 |
| 269 static PyObject * | 288 static PyObject * |
| 320 { | 339 { |
| 321 PyPluginObject *pd = getPluginObject(self); | 340 PyPluginObject *pd = getPluginObject(self); |
| 322 if (!pd) return 0; | 341 if (!pd) return 0; |
| 323 | 342 |
| 324 if (!pd->isInitialised) { | 343 if (!pd->isInitialised) { |
| 325 PyErr_SetString(PyExc_StandardError, | 344 PyErr_SetString(PyExc_Exception, |
| 326 "Plugin has not been initialised"); | 345 "Plugin has not been initialised"); |
| 327 return 0; | 346 return 0; |
| 328 } | 347 } |
| 329 | 348 |
| 330 pd->plugin->reset(); | 349 pd->plugin->reset(); |
| 354 return 0; } | 373 return 0; } |
| 355 | 374 |
| 356 PyPluginObject *pd = getPluginObject(self); | 375 PyPluginObject *pd = getPluginObject(self); |
| 357 if (!pd) return 0; | 376 if (!pd) return 0; |
| 358 | 377 |
| 359 string param = PyString_AS_STRING(pyParam); | 378 string param = py2str(pyParam); |
| 360 | 379 |
| 361 if (!hasParameter(pd, param)) { | 380 if (!hasParameter(pd, param)) { |
| 362 PyErr_SetString(PyExc_StandardError, | 381 PyErr_SetString(PyExc_Exception, |
| 363 (string("Unknown parameter id \"") + param + "\"").c_str()); | 382 (string("Unknown parameter id \"") + param + "\"").c_str()); |
| 364 return 0; | 383 return 0; |
| 365 } | 384 } |
| 366 | 385 |
| 367 float value = pd->plugin->getParameter(param); | 386 float value = pd->plugin->getParameter(param); |
| 380 return 0; } | 399 return 0; } |
| 381 | 400 |
| 382 PyPluginObject *pd = getPluginObject(self); | 401 PyPluginObject *pd = getPluginObject(self); |
| 383 if (!pd) return 0; | 402 if (!pd) return 0; |
| 384 | 403 |
| 385 string param = PyString_AS_STRING(pyParam); | 404 string param = py2str(pyParam); |
| 386 | 405 |
| 387 if (!hasParameter(pd, param)) { | 406 if (!hasParameter(pd, param)) { |
| 388 PyErr_SetString(PyExc_StandardError, | 407 PyErr_SetString(PyExc_Exception, |
| 389 (string("Unknown parameter id \"") + param + "\"").c_str()); | 408 (string("Unknown parameter id \"") + param + "\"").c_str()); |
| 390 return 0; | 409 return 0; |
| 391 } | 410 } |
| 392 | 411 |
| 393 pd->plugin->setParameter(param, value); | 412 pd->plugin->setParameter(param, value); |
| 419 } | 438 } |
| 420 | 439 |
| 421 Py_ssize_t pos = 0; | 440 Py_ssize_t pos = 0; |
| 422 PyObject *key, *value; | 441 PyObject *key, *value; |
| 423 while (PyDict_Next(dict, &pos, &key, &value)) { | 442 while (PyDict_Next(dict, &pos, &key, &value)) { |
| 443 #if PY_MAJOR_VERSION >= 3 | |
| 444 if (!key || !PyUnicode_CheckExact(key)) { | |
| 445 #else | |
| 424 if (!key || !PyString_CheckExact(key)) { | 446 if (!key || !PyString_CheckExact(key)) { |
| 447 #endif | |
| 425 PyErr_SetString(PyExc_TypeError, | 448 PyErr_SetString(PyExc_TypeError, |
| 426 "Parameter dict keys must all have string type"); | 449 "Parameter dict keys must all have string type"); |
| 427 return 0; | 450 return 0; |
| 428 } | 451 } |
| 429 if (!value || !FloatConversion::check(value)) { | 452 if (!value || !FloatConversion::check(value)) { |
| 430 PyErr_SetString(PyExc_TypeError, | 453 PyErr_SetString(PyExc_TypeError, |
| 431 "Parameter dict values must be convertible to float"); | 454 "Parameter dict values must be convertible to float"); |
| 432 return 0; | 455 return 0; |
| 433 } | 456 } |
| 434 string param = PyString_AS_STRING(key); | 457 string param = py2str(key); |
| 435 if (paramIds.find(param) == paramIds.end()) { | 458 if (paramIds.find(param) == paramIds.end()) { |
| 436 PyErr_SetString(PyExc_StandardError, | 459 PyErr_SetString(PyExc_Exception, |
| 437 (string("Unknown parameter id \"") + param + "\"").c_str()); | 460 (string("Unknown parameter id \"") + param + "\"").c_str()); |
| 438 return 0; | 461 return 0; |
| 439 } | 462 } |
| 440 pd->plugin->setParameter(param, FloatConversion::convert(value)); | 463 pd->plugin->setParameter(param, FloatConversion::convert(value)); |
| 441 } | 464 } |
| 454 return 0; } | 477 return 0; } |
| 455 | 478 |
| 456 PyPluginObject *pd = getPluginObject(self); | 479 PyPluginObject *pd = getPluginObject(self); |
| 457 if (!pd) return 0; | 480 if (!pd) return 0; |
| 458 | 481 |
| 459 pd->plugin->selectProgram(PyString_AS_STRING(pyParam)); | 482 pd->plugin->selectProgram(py2str(pyParam)); |
| 460 return Py_True; | 483 return Py_True; |
| 461 } | 484 } |
| 462 | 485 |
| 463 static | 486 static |
| 464 PyObject * | 487 PyObject * |
| 501 } | 524 } |
| 502 | 525 |
| 503 PyList_SET_ITEM(pyFl, fli, pyF); | 526 PyList_SET_ITEM(pyFl, fli, pyF); |
| 504 } | 527 } |
| 505 | 528 |
| 506 PyObject *pyN = PyInt_FromLong(fno); | 529 PyObject *pyN = PyLong_FromLong(fno); |
| 507 PyDict_SetItem(pyFs, pyN, pyFl); | 530 PyDict_SetItem(pyFs, pyN, pyFl); |
| 508 } | 531 } |
| 509 } | 532 } |
| 510 | 533 |
| 511 return pyFs; | 534 return pyFs; |
| 586 | 609 |
| 587 PyPluginObject *pd = getPluginObject(self); | 610 PyPluginObject *pd = getPluginObject(self); |
| 588 if (!pd) return 0; | 611 if (!pd) return 0; |
| 589 | 612 |
| 590 if (!pd->isInitialised) { | 613 if (!pd->isInitialised) { |
| 591 PyErr_SetString(PyExc_StandardError, | 614 PyErr_SetString(PyExc_Exception, |
| 592 "Plugin has not been initialised."); | 615 "Plugin has not been initialised."); |
| 593 return 0; | 616 return 0; |
| 594 } | 617 } |
| 595 | 618 |
| 596 int channels = pd->channels; | 619 int channels = pd->channels; |
| 614 { | 637 { |
| 615 PyPluginObject *pd = getPluginObject(self); | 638 PyPluginObject *pd = getPluginObject(self); |
| 616 if (!pd) return 0; | 639 if (!pd) return 0; |
| 617 | 640 |
| 618 if (!pd->isInitialised) { | 641 if (!pd->isInitialised) { |
| 619 PyErr_SetString(PyExc_StandardError, | 642 PyErr_SetString(PyExc_Exception, |
| 620 "Plugin has not been initialised."); | 643 "Plugin has not been initialised."); |
| 621 return 0; | 644 return 0; |
| 622 } | 645 } |
| 623 | 646 |
| 624 Plugin::FeatureSet fs = pd->plugin->getRemainingFeatures(); | 647 Plugin::FeatureSet fs = pd->plugin->getRemainingFeatures(); |
| 629 static PyObject * | 652 static PyObject * |
| 630 get_preferred_block_size(PyObject *self, PyObject *) | 653 get_preferred_block_size(PyObject *self, PyObject *) |
| 631 { | 654 { |
| 632 PyPluginObject *pd = getPluginObject(self); | 655 PyPluginObject *pd = getPluginObject(self); |
| 633 if (!pd) return 0; | 656 if (!pd) return 0; |
| 634 return PyInt_FromLong(pd->plugin->getPreferredBlockSize()); | 657 return PyLong_FromLong(pd->plugin->getPreferredBlockSize()); |
| 635 } | 658 } |
| 636 | 659 |
| 637 static PyObject * | 660 static PyObject * |
| 638 get_preferred_step_size(PyObject *self, PyObject *) | 661 get_preferred_step_size(PyObject *self, PyObject *) |
| 639 { | 662 { |
| 640 PyPluginObject *pd = getPluginObject(self); | 663 PyPluginObject *pd = getPluginObject(self); |
| 641 if (!pd) return 0; | 664 if (!pd) return 0; |
| 642 return PyInt_FromLong(pd->plugin->getPreferredStepSize()); | 665 return PyLong_FromLong(pd->plugin->getPreferredStepSize()); |
| 643 } | 666 } |
| 644 | 667 |
| 645 static PyObject * | 668 static PyObject * |
| 646 get_min_channel_count(PyObject *self, PyObject *) | 669 get_min_channel_count(PyObject *self, PyObject *) |
| 647 { | 670 { |
| 648 PyPluginObject *pd = getPluginObject(self); | 671 PyPluginObject *pd = getPluginObject(self); |
| 649 if (!pd) return 0; | 672 if (!pd) return 0; |
| 650 return PyInt_FromLong(pd->plugin->getMinChannelCount()); | 673 return PyLong_FromLong(pd->plugin->getMinChannelCount()); |
| 651 } | 674 } |
| 652 | 675 |
| 653 static PyObject * | 676 static PyObject * |
| 654 get_max_channel_count(PyObject *self, PyObject *) | 677 get_max_channel_count(PyObject *self, PyObject *) |
| 655 { | 678 { |
| 656 PyPluginObject *pd = getPluginObject(self); | 679 PyPluginObject *pd = getPluginObject(self); |
| 657 if (!pd) return 0; | 680 if (!pd) return 0; |
| 658 return PyInt_FromLong(pd->plugin->getMaxChannelCount()); | 681 return PyLong_FromLong(pd->plugin->getMaxChannelCount()); |
| 659 } | 682 } |
| 660 | 683 |
| 661 static PyObject * | 684 static PyObject * |
| 662 unload(PyObject *self, PyObject *) | 685 unload(PyObject *self, PyObject *) |
| 663 { | 686 { |
