[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16990] trunk/blender: BGE bug fix: fix several bugs and inconsistencies in sound actuator:
Benoit Bolsee
benoit.bolsee at online.be
Thu Oct 9 08:06:11 CEST 2008
Revision: 16990
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16990
Author: ben2610
Date: 2008-10-09 08:06:11 +0200 (Thu, 09 Oct 2008)
Log Message:
-----------
BGE bug fix: fix several bugs and inconsistencies in sound actuator:
- support stopping of loop sound
- support stopping by python
- keep state of actuator in sync with audio device.
The lack of state sync was causing several other problems:
- actuator stop playing the sound
- sound chopped before the end
- not possible to pause sound
Modified Paths:
--------------
trunk/blender/intern/SoundSystem/intern/SND_Scene.cpp
trunk/blender/intern/SoundSystem/intern/SND_SoundObject.cpp
trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
Modified: trunk/blender/intern/SoundSystem/intern/SND_Scene.cpp
===================================================================
--- trunk/blender/intern/SoundSystem/intern/SND_Scene.cpp 2008-10-09 04:11:33 UTC (rev 16989)
+++ trunk/blender/intern/SoundSystem/intern/SND_Scene.cpp 2008-10-09 06:06:11 UTC (rev 16990)
@@ -388,11 +388,18 @@
#endif
#ifdef USE_OPENAL
// ok, properties Set. now see if it must play
- if (pObject->GetPlaystate() == SND_MUST_PLAY)
- {
+ switch (pObject->GetPlaystate()){
+ case SND_MUST_PLAY:
m_audiodevice->PlayObject(id);
pObject->SetPlaystate(SND_PLAYING);
- //break;
+ break;
+ case SND_MUST_STOP:
+ RemoveActiveObject(pObject);
+ break;
+ case SND_MUST_PAUSE:
+ m_audiodevice->PauseObject(id);
+ pObject->SetPlaystate(SND_PAUSED);
+ break;
}
#endif
Modified: trunk/blender/intern/SoundSystem/intern/SND_SoundObject.cpp
===================================================================
--- trunk/blender/intern/SoundSystem/intern/SND_SoundObject.cpp 2008-10-09 04:11:33 UTC (rev 16989)
+++ trunk/blender/intern/SoundSystem/intern/SND_SoundObject.cpp 2008-10-09 06:06:11 UTC (rev 16990)
@@ -91,21 +91,24 @@
void SND_SoundObject::StartSound()
{
- m_playstate = SND_MUST_PLAY;
+ if (m_id >= 0)
+ m_playstate = SND_MUST_PLAY;
}
void SND_SoundObject::StopSound()
{
- m_playstate = SND_MUST_STOP;
+ if (m_id >= 0)
+ m_playstate = SND_MUST_STOP;
}
void SND_SoundObject::PauseSound()
{
- m_playstate = SND_MUST_PAUSE;
+ if (m_id >= 0)
+ m_playstate = SND_MUST_PAUSE;
}
Modified: trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp
===================================================================
--- trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp 2008-10-09 04:11:33 UTC (rev 16989)
+++ trunk/blender/source/gameengine/Ketsji/KX_SoundActuator.cpp 2008-10-09 06:06:11 UTC (rev 16990)
@@ -101,6 +101,7 @@
if (!frame)
return true;
bool result = false;
+ bool isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
// do nothing on negative events, otherwise sounds are played twice!
bool bNegativeEvent = IsNegativeEvent();
@@ -119,30 +120,40 @@
if (bNegativeEvent)
{
// here must be a check if it is still playing
- m_isplaying = false;
-
- switch (m_type)
+ if (m_isplaying && isplaying)
{
- case KX_SOUNDACT_PLAYSTOP:
- case KX_SOUNDACT_LOOPSTOP:
- case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
+ switch (m_type)
{
- m_soundScene->RemoveActiveObject(m_soundObject);
+ case KX_SOUNDACT_PLAYSTOP:
+ case KX_SOUNDACT_LOOPSTOP:
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL_STOP:
+ {
+ m_soundScene->RemoveActiveObject(m_soundObject);
+ break;
+ }
+ case KX_SOUNDACT_PLAYEND:
+ {
+ m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ break;
+ }
+ case KX_SOUNDACT_LOOPEND:
+ case KX_SOUNDACT_LOOPBIDIRECTIONAL:
+ {
+ m_soundObject->SetLoopMode(SND_LOOP_OFF);
+ m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
+ break;
+ }
+ default:
+ // implement me !!
break;
}
- case KX_SOUNDACT_PLAYEND:
- {
- m_soundObject->SetPlaystate(SND_MUST_STOP_WHEN_FINISHED);
- break;
- }
- default:
- // implement me !!
- break;
}
+ // remember that we tried to stop the actuator
+ m_isplaying = false;
}
else
{
- if (m_soundObject && !m_isplaying)
+ if (!m_isplaying)
{
switch (m_type)
{
@@ -179,8 +190,10 @@
}
}
}
+ // verify that the sound is still playing
+ isplaying = (m_soundObject->GetPlaystate() != SND_STOPPED) ? true : false;
- if (m_isplaying)
+ if (isplaying)
{
m_soundObject->SetPosition(((KX_GameObject*)this->GetParent())->NodeGetWorldPosition());
m_soundObject->SetVelocity(((KX_GameObject*)this->GetParent())->GetLinearVelocity());
@@ -189,14 +202,15 @@
}
else
{
+ m_isplaying = false;
result = false;
}
-
+ /*
if (result && (m_soundObject->IsLifeSpanOver(curtime)) && ((m_type == KX_SOUNDACT_PLAYEND) || (m_type == KX_SOUNDACT_PLAYSTOP)))
{
m_pino = true;
}
-
+ */
return result;
}
@@ -312,6 +326,9 @@
PyObject* KX_SoundActuator::PyStartSound(PyObject* self, PyObject* args, PyObject* kwds)
{
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;
}
@@ -321,6 +338,7 @@
PyObject* KX_SoundActuator::PyPauseSound(PyObject* self, PyObject* args, PyObject* kwds)
{
if (m_soundObject)
+ // unfortunately, openal does not implement pause correctly, it is equivalent to a stop
m_soundObject->PauseSound();
Py_Return;
}
More information about the Bf-blender-cvs
mailing list