Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Mueller <nexyon@gmail.com>2011-06-16 13:13:29 +0400
committerJoerg Mueller <nexyon@gmail.com>2011-06-16 13:13:29 +0400
commita90d30c8638a87234048060d8fcb385369b3daaf (patch)
tree7d2bb0c31f833b561cb6dd365fc23bc9185f7d1c
parentcfcc4b4fcd7dabd0929db53fc5a9cf0833704259 (diff)
3D Audio GSoC:
GameEngine Python access sound actuator's sound (with setting! :-D).
-rw-r--r--intern/audaspace/Python/AUD_PyAPI.cpp13
-rw-r--r--intern/audaspace/Python/AUD_PyAPI.h1
-rw-r--r--intern/audaspace/intern/AUD_C-API.cpp31
-rw-r--r--intern/audaspace/intern/AUD_C-API.h12
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.cpp28
-rw-r--r--source/gameengine/Ketsji/KX_SoundActuator.h2
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