diff options
author | Joerg Mueller <nexyon@gmail.com> | 2010-08-16 15:41:07 +0400 |
---|---|---|
committer | Joerg Mueller <nexyon@gmail.com> | 2010-08-16 15:41:07 +0400 |
commit | 25fec1592efade86233c0ba71212dc973b618ad1 (patch) | |
tree | 8c6eccaf24d7bf4fa72c5cfc1ca86511d2df0c9d /source/gameengine/Ketsji | |
parent | a91d538f47171a40463016b91c22d39d694d923a (diff) | |
parent | 2b7a774ab0dfd3bc66240b387a586b5122ab2661 (diff) |
Audaspace (GSoC): First merging commit
* All audaspace changes from the GSoC branch including the aud Python module
* This commit also includes some minor changes in source/gameengine/Ketsji/KX_PythonInit.cpp:
- Fixing names of some constants
- removing outdated stopDSP() python function
- Autoinclusion of bge instead of GameLogic
- Fix for some error messages: GameLogic -> bge.logic
Diffstat (limited to 'source/gameengine/Ketsji')
-rw-r--r-- | source/gameengine/Ketsji/KX_KetsjiEngine.cpp | 43 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_PythonInit.cpp | 64 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.cpp | 197 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.h | 4 |
4 files changed, 113 insertions, 195 deletions
diff --git a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp index 71cd8b36045..1a6ae69f792 100644 --- a/source/gameengine/Ketsji/KX_KetsjiEngine.cpp +++ b/source/gameengine/Ketsji/KX_KetsjiEngine.cpp @@ -235,7 +235,7 @@ void KX_KetsjiEngine::SetRasterizer(RAS_IRasterizer* rasterizer) #ifndef DISABLE_PYTHON /* - * At the moment the GameLogic module is imported into 'pythondictionary' after this function is called. + * At the moment the bge.logic module is imported into 'pythondictionary' after this function is called. * if this function ever changes to assign a copy, make sure the game logic module is imported into this dictionary before hand. */ void KX_KetsjiEngine::SetPyNamespace(PyObject* pythondictionary) @@ -966,44 +966,17 @@ void KX_KetsjiEngine::DoSound(KX_Scene* scene) KX_Camera* cam = scene->GetActiveCamera(); if (!cam) return; - MT_Point3 listenerposition = cam->NodeGetWorldPosition(); - MT_Vector3 listenervelocity = cam->GetLinearVelocity(); - MT_Matrix3x3 listenerorientation = cam->NodeGetWorldOrientation(); - { - AUD_3DData data; - float f; - - listenerorientation.getValue3x3(data.orientation); - listenerposition.getValue(data.position); - listenervelocity.getValue(data.velocity); - - f = data.position[1]; - data.position[1] = data.position[2]; - data.position[2] = -f; - - f = data.velocity[1]; - data.velocity[1] = data.velocity[2]; - data.velocity[2] = -f; + float f[4]; - f = data.orientation[1]; - data.orientation[1] = data.orientation[2]; - data.orientation[2] = -f; + cam->NodeGetWorldPosition().getValue(f); + AUD_setListenerLocation(f); - f = data.orientation[3]; - data.orientation[3] = -data.orientation[6]; - data.orientation[6] = f; + cam->GetLinearVelocity().getValue(f); + AUD_setListenerVelocity(f); - f = data.orientation[4]; - data.orientation[4] = -data.orientation[8]; - data.orientation[8] = -f; - - f = data.orientation[5]; - data.orientation[5] = data.orientation[7]; - data.orientation[7] = f; - - AUD_updateListener(&data); - } + cam->NodeGetWorldOrientation().getRotation().getValue(f); + AUD_setListenerOrientation(f); } diff --git a/source/gameengine/Ketsji/KX_PythonInit.cpp b/source/gameengine/Ketsji/KX_PythonInit.cpp index 3350a59681b..303890fd630 100644 --- a/source/gameengine/Ketsji/KX_PythonInit.cpp +++ b/source/gameengine/Ketsji/KX_PythonInit.cpp @@ -45,6 +45,10 @@ extern "C" { #include "marshal.h" /* python header for loading/saving dicts */ } + +#define WITH_PYTHON +#include "AUD_C-API.h" + #endif #include "KX_PythonInit.h" @@ -262,8 +266,8 @@ static PyObject* gPyRestartGame(PyObject*) } static char gPySaveGlobalDict_doc[] = -"saveGlobalDict()\n\ -Saves GameLogic.globalDict to a file"; + "saveGlobalDict()\n" + "Saves bge.logic.globalDict to a file"; static PyObject* gPySaveGlobalDict(PyObject*) { @@ -299,8 +303,8 @@ static PyObject* gPySaveGlobalDict(PyObject*) } static char gPyLoadGlobalDict_doc[] = -"LoadGlobalDict()\n\ -Loads GameLogic.globalDict from a file"; + "LoadGlobalDict()\n" + "Loads bge.logic.globalDict from a file"; static PyObject* gPyLoadGlobalDict(PyObject*) { @@ -375,15 +379,6 @@ static PyObject* gPyGetSpectrum(PyObject*) return resultlist; } - -static PyObject* gPyStopDSP(PyObject*, PyObject* args) -{ - PyErr_SetString(PyExc_RuntimeError, "no audio device available"); - return NULL; - - Py_RETURN_NONE; -} - static PyObject* gPySetLogicTicRate(PyObject*, PyObject* args) { float ticrate; @@ -752,7 +747,6 @@ static struct PyMethodDef game_methods[] = { {"getRandomFloat",(PyCFunction) gPyGetRandomFloat, METH_NOARGS, (const char *)gPyGetRandomFloat_doc}, {"setGravity",(PyCFunction) gPySetGravity, METH_O, (const char *)"set Gravitation"}, {"getSpectrum",(PyCFunction) gPyGetSpectrum, METH_NOARGS, (const char *)"get audio spectrum"}, - {"stopDSP",(PyCFunction) gPyStopDSP, METH_VARARGS, (const char *)"stop using the audio dsp (for performance reasons)"}, {"getMaxLogicFrame", (PyCFunction) gPyGetMaxLogicFrame, METH_NOARGS, (const char *)"Gets the max number of logic frame per render frame"}, {"setMaxLogicFrame", (PyCFunction) gPySetMaxLogicFrame, METH_VARARGS, (const char *)"Sets the max number of logic frame per render frame"}, {"getMaxPhysicsFrame", (PyCFunction) gPyGetMaxPhysicsFrame, METH_NOARGS, (const char *)"Gets the max number of physics frame per render frame"}, @@ -935,7 +929,6 @@ static PyObject* gPyDisableMist(PyObject*) Py_RETURN_NONE; } - static PyObject* gPySetMistStart(PyObject*, PyObject* args) { @@ -1232,7 +1225,7 @@ static struct PyMethodDef rasterizer_methods[] = { // Initialization function for the module (*must* be called initGameLogic) static char GameLogic_module_documentation[] = -"This is the Python API for the game engine of GameLogic" +"This is the Python API for the game engine of bge.logic" ; static char Rasterizer_module_documentation[] = @@ -1313,7 +1306,6 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_PROPSENSOR_EXPRESSION, SCA_PropertySensor::KX_PROPSENSOR_EXPRESSION); /* 3. Constraint actuator */ - /* XXX, TODO NXBGE, move constants names from KX_ACT_CONSTRAINT_foo to KX_CONSTRAINTACT_foo */ KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCY); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCZ); @@ -1329,18 +1321,18 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIX); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIY); KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_ORIZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_ORIZ); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL); - KX_MACRO_addTypesToDict(d, KX_ACT_CONSTRAINT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPX); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPY); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHPZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHPZ); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNX, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNX); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNY, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNY); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_FHNZ, KX_ConstraintActuator::KX_ACT_CONSTRAINT_FHNZ); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_NORMAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_NORMAL); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_MATERIAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_MATERIAL); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_PERMANENT, KX_ConstraintActuator::KX_ACT_CONSTRAINT_PERMANENT); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DISTANCE, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DISTANCE); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_LOCAL, KX_ConstraintActuator::KX_ACT_CONSTRAINT_LOCAL); + KX_MACRO_addTypesToDict(d, KX_CONSTRAINTACT_DOROTFH, KX_ConstraintActuator::KX_ACT_CONSTRAINT_DOROTFH); /* 4. Ipo actuator, simple part */ KX_MACRO_addTypesToDict(d, KX_IPOACT_PLAY, KX_IpoActuator::KX_ACT_IPO_PLAY); @@ -1582,7 +1574,7 @@ PyObject* initGameLogic(KX_KetsjiEngine *engine, KX_Scene* scene) // quick hack // Check for errors if (PyErr_Occurred()) { - Py_FatalError("can't initialize module GameLogic"); + Py_FatalError("can't initialize module bge.logic"); } return m; @@ -1979,7 +1971,6 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main * PyDict_SetItemString(PyModule_GetDict(*gameLogic), "globalDict", pyGlobalDict); // Same as importing the module. *gameLogic_keys = PyDict_Keys(PyModule_GetDict(*gameLogic)); - PyDict_SetItemString(dictionaryobject, "GameLogic", *gameLogic); // Same as importing the module. initGameKeys(); initPythonConstraintBinding(); @@ -1987,10 +1978,11 @@ void setupGamePython(KX_KetsjiEngine* ketsjiengine, KX_Scene* startscene, Main * initGeometry(); initBGL(); initBLF(); + AUD_initPython(); initVideoTexture(); /* could be done a lot more nicely, but for now a quick way to get bge.* working */ - PyRun_SimpleString("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')})"); + PyRun_SimpleString("sys = __import__('sys');mod = sys.modules['bge'] = type(sys)('bge');mod.__dict__.update({'logic':__import__('GameLogic'), 'render':__import__('Rasterizer'), 'events':__import__('GameKeys'), 'constraints':__import__('PhysicsConstraints'), 'types':__import__('GameTypes')});import bge"); } static struct PyModuleDef Rasterizer_module_def = { @@ -2338,15 +2330,15 @@ int saveGamePythonConfig( char **marshal_buffer) memcpy(*marshal_buffer, marshal_cstring, marshal_length); Py_DECREF(pyGlobalDictMarshal); } else { - printf("Error, GameLogic.globalDict could not be marshal'd\n"); + printf("Error, bge.logic.globalDict could not be marshal'd\n"); } } else { - printf("Error, GameLogic.globalDict was removed\n"); + printf("Error, bge.logic.globalDict was removed\n"); } Py_DECREF(gameLogic); } else { PyErr_Clear(); - printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n"); + printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n"); } return marshal_length; } @@ -2378,7 +2370,7 @@ int loadGamePythonConfig(char *marshal_buffer, int marshal_length) } } else { PyErr_Clear(); - printf("Error, GameLogic failed to import GameLogic.globalDict will be lost\n"); + printf("Error, bge.logic failed to import bge.logic.globalDict will be lost\n"); } } return 0; diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 7f9b090d680..09ad567117f 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -31,6 +31,7 @@ */ #include "KX_SoundActuator.h" +#include "AUD_C-API.h" #include "KX_GameObject.h" #include "KX_PyMath.h" // needed for PyObjectFrom() #include <iostream> @@ -75,23 +76,20 @@ void KX_SoundActuator::play() // this is the sound that will be played and not deleted afterwards AUD_Sound* sound = m_sound; - // this sounds are for temporary stacked sounds, will be deleted if not NULL + // this sound is for temporary stacked sounds, will be deleted if not NULL AUD_Sound* sound2 = NULL; - AUD_Sound* sound3 = NULL; + + bool loop = false; switch (m_type) { case KX_SOUNDACT_LOOPBIDIRECTIONAL: case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP: - // create a ping pong sound on sound2 stacked on the orignal sound - sound2 = AUD_pingpongSound(sound); - // create a loop sound on sound3 stacked on the pingpong sound and let that one play (save it to sound) - sound = sound3 = AUD_loopSound(sound2); - break; + sound = sound2 = AUD_pingpongSound(sound); + // fall through case KX_SOUNDACT_LOOPEND: case KX_SOUNDACT_LOOPSTOP: - // create a loop sound on sound2 stacked on the pingpong sound and let that one play (save it to sound) - sound = sound2 = AUD_loopSound(sound); + loop = true; break; case KX_SOUNDACT_PLAYSTOP: case KX_SOUNDACT_PLAYEND: @@ -102,28 +100,27 @@ void KX_SoundActuator::play() if(m_is3d) { // sound shall be played 3D - m_handle = AUD_play3D(sound, 0); - - AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_GAIN, m_3d.max_gain); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_MIN_GAIN, m_3d.min_gain); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_REFERENCE_DISTANCE, m_3d.reference_distance); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_MAX_DISTANCE, m_3d.max_distance); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_ROLLOFF_FACTOR, m_3d.rolloff_factor); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_INNER_ANGLE, m_3d.cone_inner_angle); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_ANGLE, m_3d.cone_outer_angle); - AUD_set3DSourceSetting(m_handle, AUD_3DSS_CONE_OUTER_GAIN, m_3d.cone_outer_gain); + m_handle = AUD_play(sound, 0); + + AUD_setRelative(m_handle, true); + AUD_setVolumeMaximum(m_handle, m_3d.max_gain); + AUD_setVolumeMinimum(m_handle, m_3d.min_gain); + AUD_setDistanceReference(m_handle, m_3d.reference_distance); + AUD_setDistanceMaximum(m_handle, m_3d.max_distance); + AUD_setAttenuation(m_handle, m_3d.rolloff_factor); + AUD_setConeAngleInner(m_handle, m_3d.cone_inner_angle); + AUD_setConeAngleOuter(m_handle, m_3d.cone_outer_angle); + AUD_setConeVolumeOuter(m_handle, m_3d.cone_outer_gain); } else m_handle = AUD_play(sound, 0); + if(loop) + AUD_setLoop(m_handle, -1); AUD_setSoundPitch(m_handle, m_pitch); AUD_setSoundVolume(m_handle, m_volume); m_isplaying = true; - // now we unload the pingpong and loop sounds, as we don't need them anymore - // the started sound will continue playing like it was created, don't worry! - if(sound3) - AUD_unload(sound3); if(sound2) AUD_unload(sound2); } @@ -183,7 +180,7 @@ bool KX_SoundActuator::Update(double curtime, bool frame) case KX_SOUNDACT_LOOPBIDIRECTIONAL: { // stop the looping so that the sound stops when it finished - AUD_setLoop(m_handle, 0, -1); + AUD_setLoop(m_handle, 0); break; } default: @@ -215,39 +212,15 @@ bool KX_SoundActuator::Update(double curtime, bool frame) { if(m_is3d) { - AUD_3DData data; - float f; - ((KX_GameObject*)this->GetParent())->NodeGetWorldPosition().getValue(data.position); - ((KX_GameObject*)this->GetParent())->GetLinearVelocity().getValue(data.velocity); - ((KX_GameObject*)this->GetParent())->NodeGetWorldOrientation().getValue3x3(data.orientation); - - /* - * The 3D data from blender has to be transformed for OpenAL: - * - In blender z is up and y is forwards - * - In OpenAL y is up and z is backwards - * We have to do that for all 5 vectors. - */ - f = data.position[1]; - data.position[1] = data.position[2]; - data.position[2] = -f; - - f = data.velocity[1]; - data.velocity[1] = data.velocity[2]; - data.velocity[2] = -f; - - f = data.orientation[1]; - data.orientation[1] = data.orientation[2]; - data.orientation[2] = -f; - - f = data.orientation[4]; - data.orientation[4] = data.orientation[5]; - data.orientation[5] = -f; - - f = data.orientation[7]; - data.orientation[7] = data.orientation[8]; - data.orientation[8] = -f; - - AUD_update3DSource(m_handle, &data); + KX_GameObject* obj = (KX_GameObject*)this->GetParent(); + float f[4]; + + obj->NodeGetWorldPosition().getValue(f); + AUD_setSourceLocation(m_handle, f); + obj->GetLinearVelocity().getValue(f); + AUD_setSourceVelocity(m_handle, f); + obj->NodeGetWorldOrientation().getRotation().getValue(f); + AUD_setSourceOrientation(m_handle, f); } result = true; } @@ -300,19 +273,18 @@ PyMethodDef KX_SoundActuator::Methods[] = { PyAttributeDef KX_SoundActuator::Attributes[] = { KX_PYATTRIBUTE_BOOL_RO("is3D", KX_SoundActuator, m_is3d), - KX_PYATTRIBUTE_RW_FUNCTION("maxGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("minGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("referenceDistance3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("maxDistance3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("rolloffFactor3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("coneInnerAngle3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("coneOuterAngle3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - KX_PYATTRIBUTE_RW_FUNCTION("coneOuterGain3D", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), - + KX_PYATTRIBUTE_RW_FUNCTION("volume_maximum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("volume_minimum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("distance_reference", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("distance_maximum", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("attenuation", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("cone_angle_inner", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("cone_angle_outer", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("cone_volume_outer", KX_SoundActuator, pyattr_get_3d_property, pyattr_set_3d_property), + KX_PYATTRIBUTE_RW_FUNCTION("time", KX_SoundActuator, pyattr_get_audposition, pyattr_set_audposition), KX_PYATTRIBUTE_RW_FUNCTION("volume", KX_SoundActuator, pyattr_get_gain, pyattr_set_gain), KX_PYATTRIBUTE_RW_FUNCTION("pitch", KX_SoundActuator, pyattr_get_pitch, pyattr_set_pitch), - KX_PYATTRIBUTE_RW_FUNCTION("rollOffFactor", KX_SoundActuator, pyattr_get_rollOffFactor, pyattr_set_rollOffFactor), KX_PYATTRIBUTE_ENUM_RW("mode",KX_SoundActuator::KX_SOUNDACT_NODEF+1,KX_SoundActuator::KX_SOUNDACT_MAX-1,false,KX_SoundActuator,m_type), { NULL } //Sentinel }; @@ -358,28 +330,28 @@ PyObject* KX_SoundActuator::pyattr_get_3d_property(void *self, const struct KX_P const char* prop = attrdef->m_name; float result_value = 0.0; - if(!strcmp(prop, "maxGain3D")) { + if(!strcmp(prop, "volume_maximum")) { result_value = actuator->m_3d.max_gain; - } else if (!strcmp(prop, "minGain3D")) { + } else if (!strcmp(prop, "volume_minimum")) { result_value = actuator->m_3d.min_gain; - } else if (!strcmp(prop, "referenceDistance3D")) { + } else if (!strcmp(prop, "distance_reference")) { result_value = actuator->m_3d.reference_distance; - } else if (!strcmp(prop, "maxDistance3D")) { + } else if (!strcmp(prop, "distance_maximum")) { result_value = actuator->m_3d.max_distance; - } else if (!strcmp(prop, "rolloffFactor3D")) { + } else if (!strcmp(prop, "attenuation")) { result_value = actuator->m_3d.rolloff_factor; - } else if (!strcmp(prop, "coneInnerAngle3D")) { + } else if (!strcmp(prop, "cone_angle_inner")) { result_value = actuator->m_3d.cone_inner_angle; - } else if (!strcmp(prop, "coneOuterAngle3D")) { + } else if (!strcmp(prop, "cone_angle_outer")) { result_value = actuator->m_3d.cone_outer_angle; - } else if (!strcmp(prop, "coneOuterGain3D")) { + } else if (!strcmp(prop, "cone_volume_outer")) { result_value = actuator->m_3d.cone_outer_gain; } else { @@ -423,66 +395,63 @@ PyObject* KX_SoundActuator::pyattr_get_pitch(void *self, const struct KX_PYATTRI return result; } -PyObject* KX_SoundActuator::pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) -{ - KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); - float rollofffactor = actuator->m_3d.rolloff_factor; - PyObject* result = PyFloat_FromDouble(rollofffactor); - - return result; -} - int KX_SoundActuator::pyattr_set_3d_property(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) { KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); const char* prop = attrdef->m_name; float prop_value = 0.0; - AUD_3DSourceSetting setting = AUD_3DSS_NONE; if (!PyArg_Parse(value, "f", &prop_value)) return PY_SET_ATTR_FAIL; - // update the internal value - if(!strcmp(prop, "maxGain3D")) { + // if sound is working and 3D, set the new setting + if(!actuator->m_is3d) + return PY_SET_ATTR_FAIL; + + if(!strcmp(prop, "volume_maximum")) { actuator->m_3d.max_gain = prop_value; - setting = AUD_3DSS_MAX_GAIN; + if(actuator->m_handle) + AUD_setVolumeMaximum(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "minGain3D")) { + } else if (!strcmp(prop, "volume_minimum")) { actuator->m_3d.min_gain = prop_value; - setting = AUD_3DSS_MIN_GAIN; + if(actuator->m_handle) + AUD_setVolumeMinimum(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "referenceDistance3D")) { + } else if (!strcmp(prop, "distance_reference")) { actuator->m_3d.reference_distance = prop_value; - setting = AUD_3DSS_REFERENCE_DISTANCE; + if(actuator->m_handle) + AUD_setDistanceReference(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "maxDistance3D")) { + } else if (!strcmp(prop, "distance_maximum")) { actuator->m_3d.max_distance = prop_value; - setting = AUD_3DSS_MAX_DISTANCE; + if(actuator->m_handle) + AUD_setDistanceMaximum(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "rolloffFactor3D")) { + } else if (!strcmp(prop, "attenuation")) { actuator->m_3d.rolloff_factor = prop_value; - setting = AUD_3DSS_ROLLOFF_FACTOR; + if(actuator->m_handle) + AUD_setAttenuation(actuator->m_handle, prop_value); - } else if (!!strcmp(prop, "coneInnerAngle3D")) { + } else if (!!strcmp(prop, "cone_angle_inner")) { actuator->m_3d.cone_inner_angle = prop_value; - setting = AUD_3DSS_CONE_INNER_ANGLE; + if(actuator->m_handle) + AUD_setConeAngleInner(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "coneOuterAngle3D")) { + } else if (!strcmp(prop, "cone_angle_outer")) { actuator->m_3d.cone_outer_angle = prop_value; - setting = AUD_3DSS_CONE_OUTER_ANGLE; + if(actuator->m_handle) + AUD_setConeAngleOuter(actuator->m_handle, prop_value); - } else if (!strcmp(prop, "coneOuterGain3D")) { + } else if (!strcmp(prop, "cone_volume_outer")) { actuator->m_3d.cone_outer_gain = prop_value; - setting = AUD_3DSS_CONE_OUTER_GAIN; + if(actuator->m_handle) + AUD_setConeVolumeOuter(actuator->m_handle, prop_value); } else { return PY_SET_ATTR_FAIL; - } + } - // if sound is working and 3D, set the new setting - if(actuator->m_handle && actuator->m_is3d && setting != AUD_3DSS_NONE) - AUD_set3DSourceSetting(actuator->m_handle, setting, prop_value); - return PY_SET_ATTR_SUCCESS; } @@ -527,18 +496,4 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D return PY_SET_ATTR_SUCCESS; } -int KX_SoundActuator::pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) -{ - KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); - float rollofffactor = 1.0; - if (!PyArg_Parse(value, "f", &rollofffactor)) - return PY_SET_ATTR_FAIL; - - actuator->m_3d.rolloff_factor = rollofffactor; - if(actuator->m_handle) - AUD_set3DSourceSetting(actuator->m_handle, AUD_3DSS_ROLLOFF_FACTOR, rollofffactor); - - return PY_SET_ATTR_SUCCESS; -} - #endif // DISABLE_PYTHON diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h index 1eaea276191..c175a184a15 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.h +++ b/source/gameengine/Ketsji/KX_SoundActuator.h @@ -58,7 +58,7 @@ class KX_SoundActuator : public SCA_IActuator float m_pitch; bool m_is3d; KX_3DSoundSettings m_3d; - AUD_Handle* m_handle; + AUD_Channel* m_handle; void play(); @@ -107,14 +107,12 @@ public: static int pyattr_set_audposition(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static int pyattr_set_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static int pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); - static int pyattr_set_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static int pyattr_set_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); static PyObject* pyattr_get_3d_property(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_audposition(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); - static PyObject* pyattr_get_rollOffFactor(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); static PyObject* pyattr_get_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); #endif // DISABLE_PYTHON |