diff options
author | Joerg Mueller <nexyon@gmail.com> | 2011-06-16 13:13:29 +0400 |
---|---|---|
committer | Joerg Mueller <nexyon@gmail.com> | 2011-06-16 13:13:29 +0400 |
commit | a90d30c8638a87234048060d8fcb385369b3daaf (patch) | |
tree | 7d2bb0c31f833b561cb6dd365fc23bc9185f7d1c | |
parent | cfcc4b4fcd7dabd0929db53fc5a9cf0833704259 (diff) |
3D Audio GSoC:
GameEngine Python access sound actuator's sound (with setting! :-D).
-rw-r--r-- | intern/audaspace/Python/AUD_PyAPI.cpp | 13 | ||||
-rw-r--r-- | intern/audaspace/Python/AUD_PyAPI.h | 1 | ||||
-rw-r--r-- | intern/audaspace/intern/AUD_C-API.cpp | 31 | ||||
-rw-r--r-- | intern/audaspace/intern/AUD_C-API.h | 12 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.cpp | 28 | ||||
-rw-r--r-- | source/gameengine/Ketsji/KX_SoundActuator.h | 2 |
6 files changed, 86 insertions, 1 deletions
diff --git a/intern/audaspace/Python/AUD_PyAPI.cpp b/intern/audaspace/Python/AUD_PyAPI.cpp index ac25ab34a69..b6e336eb329 100644 --- a/intern/audaspace/Python/AUD_PyAPI.cpp +++ b/intern/audaspace/Python/AUD_PyAPI.cpp @@ -2881,6 +2881,19 @@ Factory_empty() return FactoryType.tp_alloc(&FactoryType, 0); } +Factory* +checkFactory(PyObject* factory) +{ + if(!PyObject_TypeCheck(factory, &FactoryType)) + { + PyErr_SetString(PyExc_TypeError, "Object is not of type Factory!"); + return NULL; + } + + return (Factory*)factory; +} + + // ==================================================================== PyDoc_STRVAR(M_aud_doc, diff --git a/intern/audaspace/Python/AUD_PyAPI.h b/intern/audaspace/Python/AUD_PyAPI.h index 97e1e63b6eb..822aec06976 100644 --- a/intern/audaspace/Python/AUD_PyAPI.h +++ b/intern/audaspace/Python/AUD_PyAPI.h @@ -68,6 +68,7 @@ PyInit_aud(void); extern PyObject* Device_empty(); extern PyObject* Factory_empty(); +extern Factory* checkFactory(PyObject* factory); #ifdef __cplusplus } diff --git a/intern/audaspace/intern/AUD_C-API.cpp b/intern/audaspace/intern/AUD_C-API.cpp index b0050abe7ac..61d7616f694 100644 --- a/intern/audaspace/intern/AUD_C-API.cpp +++ b/intern/audaspace/intern/AUD_C-API.cpp @@ -227,6 +227,32 @@ PyObject* AUD_initPython() return module; } + +PyObject* AUD_getPythonFactory(AUD_Sound* sound) +{ + if(sound) + { + Factory* obj = (Factory*) Factory_empty(); + if(obj) + { + obj->factory = new AUD_Reference<AUD_IFactory>(*sound); + return (PyObject*) obj; + } + } + + return NULL; +} + +AUD_Sound* AUD_getPythonSound(PyObject* sound) +{ + Factory* factory = checkFactory(sound); + + if(!factory) + return NULL; + + return new AUD_Reference<AUD_IFactory>(*reinterpret_cast<AUD_Reference<AUD_IFactory>*>(factory->factory)); +} + #endif void AUD_lock() @@ -973,3 +999,8 @@ int AUD_doesPlayback() #endif return -1; } + +AUD_Sound* AUD_copy(AUD_Sound* sound) +{ + return new AUD_Reference<AUD_IFactory>(*sound); +} diff --git a/intern/audaspace/intern/AUD_C-API.h b/intern/audaspace/intern/AUD_C-API.h index 47dadd05555..3fdb9e7bca3 100644 --- a/intern/audaspace/intern/AUD_C-API.h +++ b/intern/audaspace/intern/AUD_C-API.h @@ -31,6 +31,10 @@ #ifndef AUD_CAPI #define AUD_CAPI +#ifdef WITH_PYTHON +#include "Python.h" +#endif + #ifdef __cplusplus extern "C" { #endif @@ -492,6 +496,14 @@ extern void AUD_setSyncCallback(AUD_syncFunction function, void* data); extern int AUD_doesPlayback(void); +extern AUD_Sound* AUD_copy(AUD_Sound* sound); + +#ifdef WITH_PYTHON +extern PyObject* AUD_getPythonFactory(AUD_Sound* sound); + +extern AUD_Sound* AUD_getPythonSound(PyObject* sound); +#endif + #ifdef __cplusplus } #endif diff --git a/source/gameengine/Ketsji/KX_SoundActuator.cpp b/source/gameengine/Ketsji/KX_SoundActuator.cpp index 45ba827a1b8..5a19337e7a2 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.cpp +++ b/source/gameengine/Ketsji/KX_SoundActuator.cpp @@ -53,7 +53,7 @@ KX_SoundActuator::KX_SoundActuator(SCA_IObject* gameobj, KX_SOUNDACT_TYPE type)//, : SCA_IActuator(gameobj, KX_ACT_SOUND) { - m_sound = sound; + m_sound = AUD_copy(sound); m_volume = volume; m_pitch = pitch; m_is3d = is3d; @@ -69,6 +69,7 @@ KX_SoundActuator::~KX_SoundActuator() { if(m_handle) AUD_stop(m_handle); + AUD_unload(m_sound); } void KX_SoundActuator::play() @@ -286,6 +287,7 @@ PyAttributeDef KX_SoundActuator::Attributes[] = { 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("sound", KX_SoundActuator, pyattr_get_sound, pyattr_set_sound), 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), @@ -400,6 +402,12 @@ PyObject* KX_SoundActuator::pyattr_get_pitch(void *self, const struct KX_PYATTRI return result; } +PyObject* KX_SoundActuator::pyattr_get_sound(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef) +{ + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + return AUD_getPythonFactory(actuator->m_sound); +} + 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); @@ -501,4 +509,22 @@ int KX_SoundActuator::pyattr_set_pitch(void *self, const struct KX_PYATTRIBUTE_D return PY_SET_ATTR_SUCCESS; } +int KX_SoundActuator::pyattr_set_sound(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value) +{ + PyObject* sound = NULL; + KX_SoundActuator * actuator = static_cast<KX_SoundActuator *> (self); + if (!PyArg_Parse(value, "O", &sound)) + return PY_SET_ATTR_FAIL; + + AUD_Sound* snd = AUD_getPythonSound(sound); + if(snd) + { + AUD_unload(actuator->m_sound); + actuator->m_sound = snd; + return PY_SET_ATTR_SUCCESS; + } + + return PY_SET_ATTR_FAIL; +} + #endif // WITH_PYTHON diff --git a/source/gameengine/Ketsji/KX_SoundActuator.h b/source/gameengine/Ketsji/KX_SoundActuator.h index e7257245a80..dc90d7d24de 100644 --- a/source/gameengine/Ketsji/KX_SoundActuator.h +++ b/source/gameengine/Ketsji/KX_SoundActuator.h @@ -110,12 +110,14 @@ public: 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_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef, PyObject *value); + static int pyattr_set_sound(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_type(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); + static PyObject* pyattr_get_sound(void *self, const struct KX_PYATTRIBUTE_DEF *attrdef); #endif // WITH_PYTHON |