tmp
[blender.git] / extern / audaspace / bindings / python / PyAPI.cpp
1 /*******************************************************************************
2  * Copyright 2009-2016 Jörg Müller
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *   http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  ******************************************************************************/
16
17 #include "PyAPI.h"
18 #include "PySound.h"
19 #include "PyHandle.h"
20 #include "PyDevice.h"
21 #include "PySequenceEntry.h"
22 #include "PySequence.h"
23 #include "PyPlaybackManager.h"
24 #include "PyDynamicMusic.h"
25 #include "PyThreadPool.h"
26 #include "PySource.h"
27
28 #ifdef WITH_CONVOLUTION
29 #include "PyImpulseResponse.h"
30 #include "PyHRTF.h"
31 #endif
32
33 #include "respec/Specification.h"
34 #include "devices/IHandle.h"
35 #include "devices/I3DDevice.h"
36 #include "file/IWriter.h"
37 #include "plugin/PluginManager.h"
38 #include "sequence/AnimateableProperty.h"
39 #include "ISound.h"
40
41 #include <memory>
42
43 #include <structmember.h>
44
45 using namespace aud;
46
47 // ====================================================================
48
49 #define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name)
50
51 // ====================================================================
52
53 extern PyObject* AUDError;
54 PyObject* AUDError = nullptr;
55
56 // ====================================================================
57
58 PyDoc_STRVAR(M_aud_doc,
59                          "Audaspace (pronounced \"outer space\") is a high level audio library.");
60
61 static struct PyModuleDef audmodule = {
62         PyModuleDef_HEAD_INIT,
63         "aud",     /* name of module */
64         M_aud_doc, /* module documentation */
65         -1,        /* size of per-interpreter state of the module,
66                                   or -1 if the module keeps state in global variables. */
67    nullptr, nullptr, nullptr, nullptr, nullptr
68 };
69
70 PyMODINIT_FUNC
71 PyInit_aud()
72 {
73         PyObject* module;
74
75         PluginManager::loadPlugins();
76
77         if(!initializeSound())
78                 return nullptr;
79
80         if(!initializeDevice())
81                 return nullptr;
82
83         if(!initializeHandle())
84                 return nullptr;
85
86         if(!initializeSequenceEntry())
87                 return nullptr;
88
89         if(!initializeSequence())
90                 return nullptr;
91
92         if(!initializeDynamicMusic())
93                 return nullptr;
94
95         if(!initializePlaybackManager())
96                 return nullptr;
97
98         if(!initializeThreadPool())
99                 return nullptr;
100
101         if(!initializeSource())
102                 return nullptr;
103
104 #ifdef WITH_CONVOLUTION
105         if(!initializeImpulseResponse())
106                 return nullptr;
107
108         if(!initializeHRTF())
109                 return nullptr;
110 #endif
111
112         module = PyModule_Create(&audmodule);
113         if(module == nullptr)
114                 return nullptr;
115
116         addSoundToModule(module);
117         addHandleToModule(module);
118         addDeviceToModule(module);
119         addSequenceEntryToModule(module);
120         addSequenceToModule(module);
121         addDynamicMusicToModule(module);
122         addPlaybackManagerToModule(module);
123         addThreadPoolToModule(module);
124         addSourceToModule(module);
125
126 #ifdef WITH_CONVOLUTION
127         addImpulseResponseToModule(module);
128         addHRTFToModule(module);
129 #endif
130
131         AUDError = PyErr_NewException("aud.error", nullptr, nullptr);
132         Py_INCREF(AUDError);
133         PyModule_AddObject(module, "error", AUDError);
134
135         // animatable property type constants
136         PY_MODULE_ADD_CONSTANT(module, AP_VOLUME);
137         PY_MODULE_ADD_CONSTANT(module, AP_PANNING);
138         PY_MODULE_ADD_CONSTANT(module, AP_PITCH);
139         PY_MODULE_ADD_CONSTANT(module, AP_LOCATION);
140         PY_MODULE_ADD_CONSTANT(module, AP_ORIENTATION);
141         // channels constants
142         PY_MODULE_ADD_CONSTANT(module, CHANNELS_INVALID);
143         PY_MODULE_ADD_CONSTANT(module, CHANNELS_MONO);
144         PY_MODULE_ADD_CONSTANT(module, CHANNELS_STEREO);
145         PY_MODULE_ADD_CONSTANT(module, CHANNELS_STEREO_LFE);
146         PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND4);
147         PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND5);
148         PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND51);
149         PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND61);
150         PY_MODULE_ADD_CONSTANT(module, CHANNELS_SURROUND71);
151         // codec constants
152         PY_MODULE_ADD_CONSTANT(module, CODEC_INVALID);
153         PY_MODULE_ADD_CONSTANT(module, CODEC_AAC);
154         PY_MODULE_ADD_CONSTANT(module, CODEC_AC3);
155         PY_MODULE_ADD_CONSTANT(module, CODEC_FLAC);
156         PY_MODULE_ADD_CONSTANT(module, CODEC_MP2);
157         PY_MODULE_ADD_CONSTANT(module, CODEC_MP3);
158         PY_MODULE_ADD_CONSTANT(module, CODEC_PCM);
159         PY_MODULE_ADD_CONSTANT(module, CODEC_VORBIS);
160         PY_MODULE_ADD_CONSTANT(module, CODEC_OPUS);
161         // container constants
162         PY_MODULE_ADD_CONSTANT(module, CONTAINER_INVALID);
163         PY_MODULE_ADD_CONSTANT(module, CONTAINER_AC3);
164         PY_MODULE_ADD_CONSTANT(module, CONTAINER_FLAC);
165         PY_MODULE_ADD_CONSTANT(module, CONTAINER_MATROSKA);
166         PY_MODULE_ADD_CONSTANT(module, CONTAINER_MP2);
167         PY_MODULE_ADD_CONSTANT(module, CONTAINER_MP3);
168         PY_MODULE_ADD_CONSTANT(module, CONTAINER_OGG);
169         PY_MODULE_ADD_CONSTANT(module, CONTAINER_WAV);
170         // distance model constants
171         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_EXPONENT);
172         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_EXPONENT_CLAMPED);
173         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVERSE);
174         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVERSE_CLAMPED);
175         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_LINEAR);
176         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_LINEAR_CLAMPED);
177         PY_MODULE_ADD_CONSTANT(module, DISTANCE_MODEL_INVALID);
178         // format constants
179         PY_MODULE_ADD_CONSTANT(module, FORMAT_INVALID);
180         PY_MODULE_ADD_CONSTANT(module, FORMAT_FLOAT32);
181         PY_MODULE_ADD_CONSTANT(module, FORMAT_FLOAT64);
182         PY_MODULE_ADD_CONSTANT(module, FORMAT_INVALID);
183         PY_MODULE_ADD_CONSTANT(module, FORMAT_S16);
184         PY_MODULE_ADD_CONSTANT(module, FORMAT_S24);
185         PY_MODULE_ADD_CONSTANT(module, FORMAT_S32);
186         PY_MODULE_ADD_CONSTANT(module, FORMAT_U8);
187         // rate constants
188         PY_MODULE_ADD_CONSTANT(module, RATE_INVALID);
189         PY_MODULE_ADD_CONSTANT(module, RATE_8000);
190         PY_MODULE_ADD_CONSTANT(module, RATE_16000);
191         PY_MODULE_ADD_CONSTANT(module, RATE_11025);
192         PY_MODULE_ADD_CONSTANT(module, RATE_22050);
193         PY_MODULE_ADD_CONSTANT(module, RATE_32000);
194         PY_MODULE_ADD_CONSTANT(module, RATE_44100);
195         PY_MODULE_ADD_CONSTANT(module, RATE_48000);
196         PY_MODULE_ADD_CONSTANT(module, RATE_88200);
197         PY_MODULE_ADD_CONSTANT(module, RATE_96000);
198         PY_MODULE_ADD_CONSTANT(module, RATE_192000);
199         // status constants
200         PY_MODULE_ADD_CONSTANT(module, STATUS_INVALID);
201         PY_MODULE_ADD_CONSTANT(module, STATUS_PAUSED);
202         PY_MODULE_ADD_CONSTANT(module, STATUS_PLAYING);
203         PY_MODULE_ADD_CONSTANT(module, STATUS_STOPPED);
204
205         return module;
206 }
207
208 AUD_API PyObject* AUD_getPythonSound(void* sound)
209 {
210         if(sound)
211         {
212                 Sound* object = (Sound*) Sound_empty();
213                 if(object)
214                 {
215                         object->sound = new std::shared_ptr<ISound>(*reinterpret_cast<std::shared_ptr<ISound>*>(sound));
216                         return (PyObject *) object;
217                 }
218         }
219
220         return nullptr;
221 }
222
223 AUD_API void* AUD_getSoundFromPython(PyObject* object)
224 {
225         Sound* sound = checkSound(object);
226
227         if(!sound)
228                 return nullptr;
229
230         return new std::shared_ptr<ISound>(*reinterpret_cast<std::shared_ptr<ISound>*>(sound->sound));
231 }