diff options
Diffstat (limited to 'extern/audaspace/bindings/python/PyImpulseResponse.cpp')
-rw-r--r-- | extern/audaspace/bindings/python/PyImpulseResponse.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/extern/audaspace/bindings/python/PyImpulseResponse.cpp b/extern/audaspace/bindings/python/PyImpulseResponse.cpp new file mode 100644 index 00000000000..5200c938511 --- /dev/null +++ b/extern/audaspace/bindings/python/PyImpulseResponse.cpp @@ -0,0 +1,137 @@ +/******************************************************************************* +* Copyright 2009-2015 Juan Francisco Crespo Galán +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, +* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +* See the License for the specific language governing permissions and +* limitations under the License. +******************************************************************************/ + +#include "PyImpulseResponse.h" +#include "PySound.h" + +#include "Exception.h" +#include "fx/ImpulseResponse.h" +#include "util/StreamBuffer.h" + +extern PyObject* AUDError; + +static PyObject * +ImpulseResponse_new(PyTypeObject* type, PyObject* args, PyObject* kwds) +{ + ImpulseResponseP* self = (ImpulseResponseP*)type->tp_alloc(type, 0); + + if(self != nullptr) + { + PyObject* object; + if(!PyArg_ParseTuple(args, "O:sound", &object)) + return nullptr; + Sound* sound = checkSound(object); + + try + { + self->impulseResponse = new std::shared_ptr<aud::ImpulseResponse>(new aud::ImpulseResponse(std::make_shared<aud::StreamBuffer>(*reinterpret_cast<std::shared_ptr<aud::ISound>*>(sound->sound)))); + } + catch(aud::Exception& e) + { + Py_DECREF(self); + PyErr_SetString(AUDError, e.what()); + return nullptr; + } + } + + return (PyObject *)self; +} + +static void +ImpulseResponse_dealloc(ImpulseResponseP* self) +{ + if(self->impulseResponse) + delete reinterpret_cast<std::shared_ptr<aud::ImpulseResponse>*>(self->impulseResponse); + Py_TYPE(self)->tp_free((PyObject *)self); +} + +static PyMethodDef ImpulseResponse_methods[] = { + { nullptr } /* Sentinel */ +}; + +PyDoc_STRVAR(M_aud_ImpulseResponse_doc, + "An ImpulseResponse object represents a filter with which to convolve a sound."); + +PyTypeObject ImpulseResponseType = { + PyVarObject_HEAD_INIT(nullptr, 0) + "aud.ImpulseResponse", /* tp_name */ + sizeof(ImpulseResponseP), /* tp_basicsize */ + 0, /* tp_itemsize */ + (destructor)ImpulseResponse_dealloc, /* tp_dealloc */ + 0, /* tp_print */ + 0, /* tp_getattr */ + 0, /* tp_setattr */ + 0, /* tp_reserved */ + 0, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_sequence */ + 0, /* tp_as_mapping */ + 0, /* tp_hash */ + 0, /* tp_call */ + 0, /* tp_str */ + 0, /* tp_getattro */ + 0, /* tp_setattro */ + 0, /* tp_as_buffer */ + Py_TPFLAGS_DEFAULT, /* tp_flags */ + M_aud_ImpulseResponse_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + ImpulseResponse_methods, /* tp_methods */ + 0, /* tp_members */ + 0, /* tp_getset */ + 0, /* tp_base */ + 0, /* tp_dict */ + 0, /* tp_descr_get */ + 0, /* tp_descr_set */ + 0, /* tp_dictoffset */ + 0, /* tp_init */ + 0, /* tp_alloc */ + ImpulseResponse_new, /* tp_new */ +}; + +AUD_API PyObject* ImpulseResponse_empty() +{ + return ImpulseResponseType.tp_alloc(&ImpulseResponseType, 0); +} + + +AUD_API ImpulseResponseP* checkImpulseResponse(PyObject* impulseResponse) +{ + if(!PyObject_TypeCheck(impulseResponse, &ImpulseResponseType)) + { + PyErr_SetString(PyExc_TypeError, "Object is not of type ImpulseResponse!"); + return nullptr; + } + + return (ImpulseResponseP*)impulseResponse; +} + + +bool initializeImpulseResponse() +{ + return PyType_Ready(&ImpulseResponseType) >= 0; +} + + +void addImpulseResponseToModule(PyObject* module) +{ + Py_INCREF(&ImpulseResponseType); + PyModule_AddObject(module, "ImpulseResponse", (PyObject *)&ImpulseResponseType); +} |