/******************************************************************************* * Copyright 2009-2016 Jörg Müller * * 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 "PyAPI.h" #include "PySound.h" #include "PyHandle.h" #include "PyDevice.h" #include "PySequenceEntry.h" #include "PySequence.h" #include "PyPlaybackManager.h" #include "PyDynamicMusic.h" #include "PyThreadPool.h" #include "PySource.h" #ifdef WITH_CONVOLUTION #include "PyImpulseResponse.h" #include "PyHRTF.h" #endif #include "respec/Specification.h" #include "devices/IHandle.h" #include "devices/I3DDevice.h" #include "file/IWriter.h" #include "plugin/PluginManager.h" #include "sequence/AnimateableProperty.h" #include "ISound.h" #include #include using namespace aud; // ==================================================================== #define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name) // ==================================================================== extern PyObject* AUDError; PyObject* AUDError = nullptr; // ==================================================================== PyDoc_STRVAR(M_aud_doc, "Audaspace (pronounced \"outer space\") is a high level audio library."); static struct PyModuleDef audmodule = { PyModuleDef_HEAD_INIT, "aud", /* name of module */ M_aud_doc, /* module documentation */ -1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */ nullptr, nullptr, nullptr, nullptr, nullptr }; PyMODINIT_FUNC PyInit_aud() { PyObject* module; PluginManager::loadPlugins(); if(!initializeSound()) return nullptr; if(!initializeDevice()) return nullptr; if(!initializeHandle()) return nullptr; if(!initializeSequenceEntry()) return nullptr; if(!initializeSequence()) return nullptr; if(!initializeDynamicMusic()) return nullptr; if(!initializePlaybackManager()) return nullptr; if(!initializeThreadPool()) return nullptr; if(!initializeSource()) return nullptr; #ifdef WITH_CONVOLUTION if(!initializeImpulseResponse()) return nullptr; if(!initializeHRTF()) return nullptr; #endif module = PyModule_Create(&audmodule); if(module == nullptr) return nullptr; addSoundToModule(module); addHandleToModule(module); addDeviceToModule(module); addSequenceEntryToModule(module); addSequenceToModule(module); addDynamicMusicToModule(module); addPlaybackManagerToModule(module); addThreadPoolToModule(module); addSourceToModule(module); #ifdef WITH_CONVOLUTION addImpulseResponseToModule(module); addHRTFToModule(module); #endif AUDError = PyErr_NewException("aud.error", nullptr, nullptr); Py_INCREF(AUDError); PyModule_AddObject(module, "error", AUDError); // animatable property type constants PY_MODULE_ADD_CONSTANT(module, AP_VOLUME); PY_MODULE_ADD_CONSTANT(module, AP_PANNING); PY_MODULE_ADD_CONSTANT(module, AP_PITCH); PY_MODULE_ADD_CONSTANT(module, AP_LOCATION); PY_MODULE_ADD_CONSTANT(module, AP_ORIENTATION); // channels constants PY_MODULE_ADD_CONSTANT(module, CHANNELS_INVALID); PY_MODULE_ADD_CONSTANT(module, CHANNELS_MONO); PY_MODULE_ADD_CONSTANT(module, CHANNELS_STEREO); PY_MODULE_ADD_CONSTANT(module, CHANNELS_STEREO_LFE); PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND4); PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND5); PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND51); PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND61); PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND71); // codec constants PY_MODULE_ADD_CONSTANT(module, CODEC_INVALID); PY_MODULE_ADD_CONSTANT(module, CODEC_AAC); PY_MODULE_ADD_CONSTANT(module, CODEC_AC3); PY_MODULE_ADD_CONSTANT(module, CODEC_FLAC); PY_MODULE_ADD_CONSTANT(module, CODEC_MP2); PY_MODULE_ADD_CONSTANT(module, CODEC_MP3); PY_MODULE_ADD_CONSTANT(module, CODEC_PCM); PY_MODULE_ADD_CONSTANT(module, CODEC_VORBIS); PY_MODULE_ADD_CONSTANT(module, CODEC_OPUS); // container constants PY_MODULE_ADD_CONSTANT(module, CONTAINER_INVALID); PY_MODULE_ADD_CONSTANT(module, CONTAINER_AC3); PY_MODULE_ADD_CONSTANT(module, CONTAINER_FLAC); PY_MODULE_ADD_CONSTANT(module, CONTAINER_MATROSKA); PY_MODULE_ADD_CONSTANT(module, CONTAINER_MP2); PY_MODULE_ADD_CONSTANT(module, CONTAINER_MP3); PY_MODULE_ADD_CONSTANT(module, CONTAINER_OGG); PY_MODULE_ADD_CONSTANT(module, CONTAINER_WAV); // distance model constants PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_EXPONENT); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_EXPONENT_CLAMPED); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVERSE); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVERSE_CLAMPED); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_LINEAR); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_LINEAR_CLAMPED); PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVALID); // format constants PY_MODULE_ADD_CONSTANT(module, FORMAT_INVALID); PY_MODULE_ADD_CONSTANT(module, FORMAT_FLOAT32); PY_MODULE_ADD_CONSTANT(module, FORMAT_FLOAT64); PY_MODULE_ADD_CONSTANT(module, FORMAT_INVALID); PY_MODULE_ADD_CONSTANT(module, FORMAT_S16); PY_MODULE_ADD_CONSTANT(module, FORMAT_S24); PY_MODULE_ADD_CONSTANT(module, FORMAT_S32); PY_MODULE_ADD_CONSTANT(module, FORMAT_U8); // rate constants PY_MODULE_ADD_CONSTANT(module, RATE_INVALID); PY_MODULE_ADD_CONSTANT(module, RATE_8000); PY_MODULE_ADD_CONSTANT(module, RATE_16000); PY_MODULE_ADD_CONSTANT(module, RATE_11025); PY_MODULE_ADD_CONSTANT(module, RATE_22050); PY_MODULE_ADD_CONSTANT(module, RATE_32000); PY_MODULE_ADD_CONSTANT(module, RATE_44100); PY_MODULE_ADD_CONSTANT(module, RATE_48000); PY_MODULE_ADD_CONSTANT(module, RATE_88200); PY_MODULE_ADD_CONSTANT(module, RATE_96000); PY_MODULE_ADD_CONSTANT(module, RATE_192000); // status constants PY_MODULE_ADD_CONSTANT(module, STATUS_INVALID); PY_MODULE_ADD_CONSTANT(module, STATUS_PAUSED); PY_MODULE_ADD_CONSTANT(module, STATUS_PLAYING); PY_MODULE_ADD_CONSTANT(module, STATUS_STOPPED); return module; } AUD_API PyObject* AUD_getPythonSound(void* sound) { if(sound) { Sound* object = (Sound*) Sound_empty(); if(object) { object->sound = new std::shared_ptr(*reinterpret_cast*>(sound)); return (PyObject *) object; } } return nullptr; } AUD_API void* AUD_getSoundFromPython(PyObject* object) { Sound* sound = checkSound(object); if(!sound) return nullptr; return new std::shared_ptr(*reinterpret_cast*>(sound->sound)); }