3D Audio GSoC:
authorJoerg Mueller <nexyon@gmail.com>
Thu, 16 Jun 2011 09:13:29 +0000 (09:13 +0000)
committerJoerg Mueller <nexyon@gmail.com>
Thu, 16 Jun 2011 09:13:29 +0000 (09:13 +0000)
GameEngine Python access sound actuator's sound (with setting! :-D).

intern/audaspace/Python/AUD_PyAPI.cpp
intern/audaspace/Python/AUD_PyAPI.h
intern/audaspace/intern/AUD_C-API.cpp
intern/audaspace/intern/AUD_C-API.h
source/gameengine/Ketsji/KX_SoundActuator.cpp
source/gameengine/Ketsji/KX_SoundActuator.h

index ac25ab34a69338d262354b063e1f67cfaf928a2a..b6e336eb329875086b89ed5932b88313c30b77b5 100644 (file)
@@ -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,
index 97e1e63b6ebbaba136d6c4207772fe00b0264792..822aec069762a2632c2608f4f533d0428be6ca21 100644 (file)
@@ -68,6 +68,7 @@ PyInit_aud(void);
 
 extern PyObject* Device_empty();
 extern PyObject* Factory_empty();
+extern Factory* checkFactory(PyObject* factory);
 
 #ifdef __cplusplus
 }
index b0050abe7aca26a7c875adda067dca7f28679349..61d7616f6946f26fd6abf850ca68ece8d32163fa 100644 (file)
@@ -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);
+}
index 47dadd05555670f635c872c08848e05bdc6a2579..3fdb9e7bca3c2c741393a1ad1224580092947abe 100644 (file)
 #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
index 45ba827a1b81e9fb8e8fea3bec9832acb01f8b3e..5a19337e7a2570f1e143e11618e89f93ecab2fd2 100644 (file)
@@ -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
index e7257245a800c8f860d604cd1ad23798aa1142c7..dc90d7d24decf85a4c234a73eb03074d8a1afb37 100644 (file)
@@ -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