diff options
author | Benoit Bolsee <benoit.bolsee@online.be> | 2009-04-10 00:40:12 +0400 |
---|---|---|
committer | Benoit Bolsee <benoit.bolsee@online.be> | 2009-04-10 00:40:12 +0400 |
commit | 09a5ffdf07677016b4e8eae8df02c47cd94ca6d8 (patch) | |
tree | 8a2103ec4c2174fe323e12b168821b9661bba8bf /source/gameengine/Ketsji/KX_SoundActuator.cpp | |
parent | 4669fa48a82f5f1070cf885cd1714e0a8ff8db3a (diff) |
BGE API cleanup: sound actuator.
Diffstat (limited to 'source/gameengine/Ketsji/KX_SoundActuator.cpp')
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.cpp | 342 |
1 files changed, 306 insertions, 36 deletions
diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index b8d660daa08..ecc3b574079 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -35,6 +35,7 @@ #include "KX_GameObject.h" #include "SND_SoundObject.h" #include "SND_Scene.h" // needed for replication +#include "KX_PyMath.h" // needed for PyObjectFrom() #include <iostream> #ifdef HAVE_CONFIG_H @@ -264,11 +265,9 @@ PyParentObject KX_SoundActuator::Parents[] = { PyMethodDef KX_SoundActuator::Methods[] = { + // Deprecated -----> {"setFilename", (PyCFunction) KX_SoundActuator::sPySetFilename, METH_VARARGS,NULL}, {"getFilename", (PyCFunction) KX_SoundActuator::sPyGetFilename, METH_VARARGS,NULL}, - {"startSound",(PyCFunction) KX_SoundActuator::sPyStartSound,METH_VARARGS,NULL}, - {"pauseSound",(PyCFunction) KX_SoundActuator::sPyPauseSound,METH_VARARGS,NULL}, - {"stopSound",(PyCFunction) KX_SoundActuator::sPyStopSound,METH_VARARGS,NULL}, {"setGain",(PyCFunction) KX_SoundActuator::sPySetGain,METH_VARARGS,NULL}, {"getGain",(PyCFunction) KX_SoundActuator::sPyGetGain,METH_VARARGS,NULL}, {"setPitch",(PyCFunction) KX_SoundActuator::sPySetPitch,METH_VARARGS,NULL}, @@ -282,40 +281,77 @@ PyMethodDef KX_SoundActuator::Methods[] = { {"setOrientation",(PyCFunction) KX_SoundActuator::sPySetOrientation,METH_VARARGS,NULL}, {"setType",(PyCFunction) KX_SoundActuator::sPySetType,METH_VARARGS,NULL}, {"getType",(PyCFunction) KX_SoundActuator::sPyGetType,METH_VARARGS,NULL}, + // <----- + + KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, startSound), + KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, pauseSound), + KX_PYMETHODTABLE_NOARGS(KX_SoundActuator, stopSound), {NULL,NULL,NULL,NULL} //Sentinel }; PyAttributeDef KX_SoundActuator::Attributes[] = { + KX_PYATTRIBUTE_RW_FUNCTION("filename", KX_SoundActuator, pyattr_get_filename, pyattr_set_filename), + 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_RW_FUNCTION("looping", KX_SoundActuator, pyattr_get_looping, pyattr_set_looping), + KX_PYATTRIBUTE_RW_FUNCTION("position", KX_SoundActuator, pyattr_get_position, pyattr_set_position), + KX_PYATTRIBUTE_RW_FUNCTION("velocity", KX_SoundActuator, pyattr_get_velocity, pyattr_set_velocity), + KX_PYATTRIBUTE_RW_FUNCTION("orientation", KX_SoundActuator, pyattr_get_orientation, pyattr_set_orientation), + KX_PYATTRIBUTE_ENUM_RW("type",KX_SoundActuator::KX_SOUNDACT_NODEF+1,KX_SoundActuator::KX_SOUNDACT_MAX-1,false,KX_SoundActuator,m_type), { NULL } //Sentinel }; -PyObject* KX_SoundActuator::py_getattro(PyObject *attr) +/* Methods ----------------------------------------------------------------- */ +KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, startSound, +"startSound()\n" +"\tStarts the sound.\n") { - py_getattro_up(SCA_IActuator); -} - - + if (m_soundObject) + // This has no effect if the actuator is not active. + // To start the sound you must activate the actuator. + // This function is to restart the sound. + m_soundObject->StartSound(); + Py_RETURN_NONE; +} -PyObject* KX_SoundActuator::PySetFilename(PyObject* self, PyObject* args, PyObject* kwds) +KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, pauseSound, +"pauseSound()\n" +"\tPauses the sound.\n") { - char *soundName = NULL; - // void *soundPointer = NULL; /*unused*/ - - if (!PyArg_ParseTuple(args, "s", &soundName)) - return NULL; + if (m_soundObject) + // unfortunately, openal does not implement pause correctly, it is equivalent to a stop + m_soundObject->PauseSound(); + Py_RETURN_NONE; +} +KX_PYMETHODDEF_DOC_NOARGS(KX_SoundActuator, stopSound, +"stopSound()\n" +"\tStops the sound.\n") +{ + if (m_soundObject) + m_soundObject->StopSound(); Py_RETURN_NONE; } +/* Atribute setting and getting -------------------------------------------- */ +PyObject* KX_SoundActuator::py_getattro(PyObject *attr) +{ + py_getattro_up(SCA_IActuator); +} +int KX_SoundActuator::py_setattro(PyObject *attr, PyObject* value) { + py_setattro_up(SCA_IActuator); +} -PyObject* KX_SoundActuator::PyGetFilename(PyObject* self, PyObject* args, PyObject* kwds) +PyObject* KX_SoundActuator::pyattr_get_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) { - if (!m_soundObject) + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + if (!actuator->m_soundObject) { return PyString_FromString(""); } - STR_String objectname = m_soundObject->GetObjectName(); + STR_String objectname = actuator->m_soundObject->GetObjectName(); char* name = objectname.Ptr(); if (!name) { @@ -325,41 +361,264 @@ PyObject* KX_SoundActuator::PyGetFilename(PyObject* self, PyObject* args, PyObje return PyString_FromString(name); } +PyObject* KX_SoundActuator::pyattr_get_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + float gain = (actuator->m_soundObject) ? actuator->m_soundObject->GetGain() : 1.0f; + PyObject* result = PyFloat_FromDouble(gain); + + return result; +} -PyObject* KX_SoundActuator::PyStartSound(PyObject* self, PyObject* args, PyObject* kwds) +PyObject* KX_SoundActuator::pyattr_get_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) { - if (m_soundObject) - // This has no effect if the actuator is not active. - // To start the sound you must activate the actuator. - // This function is to restart the sound. - m_soundObject->StartSound(); - Py_RETURN_NONE; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + float pitch = (actuator->m_soundObject) ? actuator->m_soundObject->GetPitch() : 1.0; + PyObject* result = PyFloat_FromDouble(pitch); + + 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_soundObject) ? actuator->m_soundObject->GetRollOffFactor() : 1.0; + PyObject* result = PyFloat_FromDouble(rollofffactor); + + return result; +} + +PyObject* KX_SoundActuator::pyattr_get_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + int looping = (actuator->m_soundObject) ? actuator->m_soundObject->GetLoopMode() : (int)SND_LOOP_OFF; + PyObject* result = PyInt_FromLong(looping); + + return result; +} + +PyObject* KX_SoundActuator::pyattr_get_position(void * self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + MT_Vector3 pos(0.0, 0.0, 0.0); + + if (actuator->m_soundObject) + pos = actuator->m_soundObject->GetPosition(); + + PyObject * result = PyObjectFrom(pos); + return result; +} + +PyObject* KX_SoundActuator::pyattr_get_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + MT_Vector3 vel; + + if (actuator->m_soundObject) + vel = actuator->m_soundObject->GetVelocity(); + + PyObject * result = PyObjectFrom(vel); + return result; +} + +PyObject* KX_SoundActuator::pyattr_get_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + MT_Matrix3x3 ori; + + if (actuator->m_soundObject) + ori = actuator->m_soundObject->GetOrientation(); + + PyObject * result = PyObjectFrom(ori); + return result; +} + +int KX_SoundActuator::pyattr_set_filename(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + char *soundName = NULL; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator*> (self); + // void *soundPointer = NULL; /*unused*/ + + if (!PyArg_Parse(value, "s", &soundName)) + return 1; + + if (actuator->m_soundObject) { + actuator->m_soundObject->SetObjectName(soundName); + } + + return 0; +} + + +int KX_SoundActuator::pyattr_set_gain(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + float gain = 1.0; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + if (!PyArg_Parse(value, "f", &gain)) + return 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetGain(gain); + + return 0; } +int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + float pitch = 1.0; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + if (!PyArg_Parse(value, "f", &pitch)) + return 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetPitch(pitch); + + return 0; +} + +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 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetRollOffFactor(rollofffactor); + return 0; +} -PyObject* KX_SoundActuator::PyPauseSound(PyObject* self, PyObject* args, PyObject* kwds) +int KX_SoundActuator::pyattr_set_looping(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) { - if (m_soundObject) - // unfortunately, openal does not implement pause correctly, it is equivalent to a stop - m_soundObject->PauseSound(); - Py_RETURN_NONE; -} + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + int looping = 1; + if (!PyArg_Parse(value, "i", &looping)) + return 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetLoopMode(looping); + + return 0; +} +int KX_SoundActuator::pyattr_set_position(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + float pos[3]; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); -PyObject* KX_SoundActuator::PyStopSound(PyObject* self, PyObject* args, PyObject* kwds) + if (!PyArg_ParseTuple(value, "fff", &pos[0], &pos[1], &pos[2])) + return 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetPosition(MT_Vector3(pos)); + + return 0; +} + +int KX_SoundActuator::pyattr_set_velocity(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) { - if (m_soundObject) - m_soundObject->StopSound(); - Py_RETURN_NONE; + float vel[3]; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + + + if (!PyArg_ParseTuple(value, "fff", &vel[0], &vel[1], &vel[2])) + return 1; + + if (actuator->m_soundObject) + actuator->m_soundObject->SetVelocity(MT_Vector3(vel)); + + return 0; + +} + +int KX_SoundActuator::pyattr_set_orientation(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + + MT_Matrix3x3 rot; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + + if (!PySequence_Check(value)) { + PyErr_SetString(PyExc_AttributeError, "'orientation' attribute needs to be a sequence"); + return 1; + } + + if (!actuator->m_soundObject) + return 0; /* Since not having m_soundObject didn't do anything in the old version, + * it probably should be kept that way */ + + if (PyMatTo(value, rot)) + { + actuator->m_soundObject->SetOrientation(rot); + return 0; + } + PyErr_Clear(); + + + if (PySequence_Size(value) == 4) + { + MT_Quaternion qrot; + if (PyVecTo(value, qrot)) + { + rot.setRotation(qrot); + actuator->m_soundObject->SetOrientation(rot); + return 0; + } + return 1; + } + + if (PySequence_Size(value) == 3) + { + MT_Vector3 erot; + if (PyVecTo(value, erot)) + { + rot.setEuler(erot); + actuator->m_soundObject->SetOrientation(rot); + return 0; + } + return 1; + } + + PyErr_SetString(PyExc_AttributeError, "could not set the orientation from a 3x3 matrix, quaternion or euler sequence"); + return 1; + } +// Deprecated -----> +PyObject* KX_SoundActuator::PySetFilename(PyObject* self, PyObject* args, PyObject* kwds) +{ + char *soundName = NULL; + ShowDeprecationWarning("setFilename()", "the filename property"); + // void *soundPointer = NULL; /*unused*/ + + if (!PyArg_ParseTuple(args, "s", &soundName)) + return NULL; + + Py_RETURN_NONE; +} +PyObject* KX_SoundActuator::PyGetFilename(PyObject* self, PyObject* args, PyObject* kwds) +{ + ShowDeprecationWarning("getFilename()", "the filename property"); + if (!m_soundObject) + { + return PyString_FromString(""); + } + STR_String objectname = m_soundObject->GetObjectName(); + char* name = objectname.Ptr(); + + if (!name) { + PyErr_SetString(PyExc_RuntimeError, "Unable to get sound filename"); + return NULL; + } else + return PyString_FromString(name); +} PyObject* KX_SoundActuator::PySetGain(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("setGain()", "the volume property"); float gain = 1.0; if (!PyArg_ParseTuple(args, "f", &gain)) return NULL; @@ -374,6 +633,7 @@ PyObject* KX_SoundActuator::PySetGain(PyObject* self, PyObject* args, PyObject* PyObject* KX_SoundActuator::PyGetGain(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("getGain()", "the volume property"); float gain = (m_soundObject) ? m_soundObject->GetGain() : 1.0f; PyObject* result = PyFloat_FromDouble(gain); @@ -384,6 +644,7 @@ PyObject* KX_SoundActuator::PyGetGain(PyObject* self, PyObject* args, PyObject* PyObject* KX_SoundActuator::PySetPitch(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("setPitch()", "the pitch property"); float pitch = 1.0; if (!PyArg_ParseTuple(args, "f", &pitch)) return NULL; @@ -398,6 +659,7 @@ PyObject* KX_SoundActuator::PySetPitch(PyObject* self, PyObject* args, PyObject* PyObject* KX_SoundActuator::PyGetPitch(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("getPitch()", "the pitch property"); float pitch = (m_soundObject) ? m_soundObject->GetPitch() : 1.0; PyObject* result = PyFloat_FromDouble(pitch); @@ -408,6 +670,7 @@ PyObject* KX_SoundActuator::PyGetPitch(PyObject* self, PyObject* args, PyObject* PyObject* KX_SoundActuator::PySetRollOffFactor(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("setRollOffFactor()", "the rollOffFactor property"); float rollofffactor = 1.0; if (!PyArg_ParseTuple(args, "f", &rollofffactor)) return NULL; @@ -422,6 +685,7 @@ PyObject* KX_SoundActuator::PySetRollOffFactor(PyObject* self, PyObject* args, P PyObject* KX_SoundActuator::PyGetRollOffFactor(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("getRollOffFactor()", "the rollOffFactor property"); float rollofffactor = (m_soundObject) ? m_soundObject->GetRollOffFactor() : 1.0; PyObject* result = PyFloat_FromDouble(rollofffactor); @@ -432,6 +696,7 @@ PyObject* KX_SoundActuator::PyGetRollOffFactor(PyObject* self, PyObject* args, P PyObject* KX_SoundActuator::PySetLooping(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("setLooping()", "the looping property"); bool looping = 1; if (!PyArg_ParseTuple(args, "i", &looping)) return NULL; @@ -446,6 +711,7 @@ PyObject* KX_SoundActuator::PySetLooping(PyObject* self, PyObject* args, PyObjec PyObject* KX_SoundActuator::PyGetLooping(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("getLooping()", "the looping property"); int looping = (m_soundObject) ? m_soundObject->GetLoopMode() : (int)SND_LOOP_OFF; PyObject* result = PyInt_FromLong(looping); @@ -457,6 +723,7 @@ PyObject* KX_SoundActuator::PyGetLooping(PyObject* self, PyObject* args, PyObjec PyObject* KX_SoundActuator::PySetPosition(PyObject* self, PyObject* args, PyObject* kwds) { MT_Point3 pos; + ShowDeprecationWarning("setPosition()", "the position property"); pos[0] = 0.0; pos[1] = 0.0; pos[2] = 0.0; @@ -475,6 +742,7 @@ PyObject* KX_SoundActuator::PySetPosition(PyObject* self, PyObject* args, PyObje PyObject* KX_SoundActuator::PySetVelocity(PyObject* self, PyObject* args, PyObject* kwds) { MT_Vector3 vel; + ShowDeprecationWarning("setVelocity()", "the velocity property"); vel[0] = 0.0; vel[1] = 0.0; vel[2] = 0.0; @@ -493,6 +761,7 @@ PyObject* KX_SoundActuator::PySetVelocity(PyObject* self, PyObject* args, PyObje PyObject* KX_SoundActuator::PySetOrientation(PyObject* self, PyObject* args, PyObject* kwds) { MT_Matrix3x3 ori; + ShowDeprecationWarning("setOrientation()", "the orientation property"); ori[0][0] = 1.0; ori[0][1] = 0.0; ori[0][2] = 0.0; @@ -515,6 +784,7 @@ PyObject* KX_SoundActuator::PySetOrientation(PyObject* self, PyObject* args, PyO PyObject* KX_SoundActuator::PySetType(PyObject* self, PyObject* args, PyObject* kwds) { int typeArg; + ShowDeprecationWarning("setType()", "the type property"); if (!PyArg_ParseTuple(args, "i", &typeArg)) { return NULL; @@ -530,8 +800,8 @@ PyObject* KX_SoundActuator::PySetType(PyObject* self, PyObject* args, PyObject* PyObject* KX_SoundActuator::PyGetType(PyObject* self, PyObject* args, PyObject* kwds) { + ShowDeprecationWarning("getType()", "the type property"); return PyInt_FromLong(m_type); } - - +// <----- |