[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [37547] branches/soc-2011-pepper: 3D Audio GSoC:

Joerg Mueller nexyon at gmail.com
Thu Jun 16 11:13:29 CEST 2011


Revision: 37547
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37547
Author:   nexyon
Date:     2011-06-16 09:13:29 +0000 (Thu, 16 Jun 2011)
Log Message:
-----------
3D Audio GSoC:
GameEngine Python access sound actuator's sound (with setting! :-D).

Modified Paths:
--------------
    branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.cpp
    branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.h
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
    branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.cpp
    branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.h

Modified: branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.cpp	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.cpp	2011-06-16 09:13:29 UTC (rev 37547)
@@ -2881,6 +2881,19 @@
 	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,

Modified: branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.h	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/intern/audaspace/Python/AUD_PyAPI.h	2011-06-16 09:13:29 UTC (rev 37547)
@@ -68,6 +68,7 @@
 
 extern PyObject* Device_empty();
 extern PyObject* Factory_empty();
+extern Factory* checkFactory(PyObject* factory);
 
 #ifdef __cplusplus
 }

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp	2011-06-16 09:13:29 UTC (rev 37547)
@@ -227,6 +227,32 @@
 
 	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 @@
 #endif
 	return -1;
 }
+
+AUD_Sound* AUD_copy(AUD_Sound* sound)
+{
+	return new AUD_Reference<AUD_IFactory>(*sound);
+}

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h	2011-06-16 09:13:29 UTC (rev 37547)
@@ -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 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

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.cpp
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.cpp	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.cpp	2011-06-16 09:13:29 UTC (rev 37547)
@@ -53,7 +53,7 @@
 								   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 @@
 {
 	if(m_handle)
 		AUD_stop(m_handle);
+	AUD_unload(m_sound);
 }
 
 void KX_SoundActuator::play()
@@ -286,6 +287,7 @@
 	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 @@
 	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 @@
 	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

Modified: branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.h
===================================================================
--- branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.h	2011-06-16 07:59:22 UTC (rev 37546)
+++ branches/soc-2011-pepper/source/gameengine/Ketsji/KX_SoundActuator.h	2011-06-16 09:13:29 UTC (rev 37547)
@@ -110,12 +110,14 @@
 	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
 




More information about the Bf-blender-cvs mailing list