[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [38977] branches/soc-2011-pepper: 3D Audio GSoC:
Joerg Mueller
nexyon at gmail.com
Wed Aug 3 11:25:40 CEST 2011
Revision: 38977
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=38977
Author: nexyon
Date: 2011-08-03 09:25:40 +0000 (Wed, 03 Aug 2011)
Log Message:
-----------
3D Audio GSoC:
* Minor audaspace library improvements.
* Considering location, velocity and orientation in AUD_SequencerReader and AUD_SequencerHandle.
* Bugfix: Maximum and Minimum volume weren't used before in the software device.
* Bugfix: Adding speaker objects via info space crashed.
* Listener settings now get updated in the audio system.
Modified Paths:
--------------
branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.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/intern/audaspace/intern/AUD_SequencerEntry.cpp
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.h
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerHandle.cpp
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerReader.cpp
branches/soc-2011-pepper/intern/audaspace/intern/AUD_SoftwareDevice.cpp
branches/soc-2011-pepper/release/scripts/startup/bl_ui/space_info.py
branches/soc-2011-pepper/source/blender/blenkernel/BKE_sound.h
branches/soc-2011-pepper/source/blender/blenkernel/intern/sound.c
branches/soc-2011-pepper/source/blender/editors/object/object_add.c
branches/soc-2011-pepper/source/blender/makesdna/DNA_scene_types.h
branches/soc-2011-pepper/source/blender/makesrna/intern/rna_scene.c
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_3DMath.h 2011-08-03 09:25:40 UTC (rev 38977)
@@ -102,6 +102,15 @@
* Retrieves the components of the vector.
* \return The components as float[3].
*/
+ inline float* get()
+ {
+ return m_v;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \return The components as float[3].
+ */
inline const float* get() const
{
return m_v;
@@ -152,6 +161,14 @@
{
return AUD_Vector3(-m_x, -m_y, -m_z);
}
+
+ inline AUD_Vector3& operator-=(const AUD_Vector3& op)
+ {
+ m_x -= op.m_x;
+ m_y -= op.m_y;
+ m_z -= op.m_z;
+ return *this;
+ }
};
class AUD_Quaternion
@@ -234,6 +251,15 @@
* Retrieves the components of the vector.
* \return The components as float[4].
*/
+ inline float* get()
+ {
+ return m_v;
+ }
+
+ /**
+ * Retrieves the components of the vector.
+ * \return The components as float[4].
+ */
inline const float* get() const
{
return m_v;
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.cpp 2011-08-03 09:25:40 UTC (rev 38977)
@@ -39,6 +39,7 @@
#include "AUD_PyAPI.h"
#endif
+#include <set>
#include <cstdlib>
#include <cstring>
#include <cmath>
@@ -898,12 +899,12 @@
void AUD_setSequencerMuted(AUD_Sound* sequencer, int muted)
{
- ((AUD_SequencerFactory*)sequencer->get())->mute(muted);
+ dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->mute(muted);
}
void AUD_setSequencerFPS(AUD_Sound* sequencer, float fps)
{
- ((AUD_SequencerFactory*)sequencer->get())->setFPS(fps);
+ dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->setFPS(fps);
}
AUD_SEntry* AUD_addSequence(AUD_Sound* sequencer, AUD_Sound* sound,
@@ -916,7 +917,7 @@
void AUD_removeSequence(AUD_Sound* sequencer, AUD_SEntry* entry)
{
- ((AUD_SequencerFactory*)sequencer->get())->remove(*entry);
+ dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->remove(*entry);
delete entry;
}
@@ -930,6 +931,11 @@
(*entry)->mute(mute);
}
+void AUD_setRelativeSequence(AUD_SEntry* entry, char relative)
+{
+ (*entry)->setRelative(relative);
+}
+
void AUD_updateSequenceSound(AUD_SEntry* entry, AUD_Sound* sound)
{
if(sound)
@@ -949,21 +955,38 @@
void AUD_setSequencerAnimData(AUD_Sound* sequencer, AUD_AnimateablePropertyType type, int frame, float* data, char animated)
{
- AUD_AnimateableProperty* prop = ((AUD_SequencerFactory*)sequencer->get())->getAnimProperty(type);
+ AUD_AnimateableProperty* prop = dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->getAnimProperty(type);
if(animated)
prop->write(data, frame, 1);
else
prop->write(data);
}
+void AUD_updateSequenceData(AUD_SEntry* entry, float volume_max, float volume_min,
+ float distance_max, float distance_reference, float attenuation,
+ float cone_angle_outer, float cone_angle_inner, float cone_volume_outer)
+{
+ (*entry)->updateAll(volume_max, volume_min, distance_max, distance_reference, attenuation,
+ cone_angle_outer, cone_angle_inner, cone_volume_outer);
+}
+
+void AUD_updateSequencerData(AUD_Sound* sequencer, float speed_of_sound,
+ float factor, AUD_DistanceModel model)
+{
+ AUD_SequencerFactory* f = dynamic_cast<AUD_SequencerFactory*>(sequencer->get());
+ f->setSpeedOfSound(speed_of_sound);
+ f->setDopplerFactor(factor);
+ f->setDistanceModel(model);
+}
+
void AUD_setSequencerDeviceSpecs(AUD_Sound* sequencer)
{
- ((AUD_SequencerFactory*)sequencer->get())->setSpecs(AUD_device->getSpecs().specs);
+ dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->setSpecs(AUD_device->getSpecs().specs);
}
void AUD_setSequencerSpecs(AUD_Sound* sequencer, AUD_Specs specs)
{
- ((AUD_SequencerFactory*)sequencer->get())->setSpecs(specs);
+ dynamic_cast<AUD_SequencerFactory*>(sequencer->get())->setSpecs(specs);
}
void AUD_seekSequencer(AUD_Handle* handle, float time)
@@ -1090,3 +1113,43 @@
{
delete handle;
}
+
+void* AUD_createSet()
+{
+ return new std::set<void*>();
+}
+
+void AUD_destroySet(void* set)
+{
+ delete reinterpret_cast<std::set<void*>*>(set);
+}
+
+char AUD_removeSet(void* set, void* entry)
+{
+ if(set)
+ return reinterpret_cast<std::set<void*>*>(set)->erase(entry);
+ return 0;
+}
+
+void AUD_addSet(void* set, void* entry)
+{
+ if(entry)
+ reinterpret_cast<std::set<void*>*>(set)->insert(entry);
+}
+
+void* AUD_getSet(void* set)
+{
+ if(set)
+ {
+ std::set<void*>* rset = reinterpret_cast<std::set<void*>*>(set);
+ if(!rset->empty())
+ {
+ std::set<void*>::iterator it = rset->begin();
+ void* result = *it;
+ rset->erase(it);
+ return result;
+ }
+ }
+
+ return NULL;
+}
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_C-API.h 2011-08-03 09:25:40 UTC (rev 38977)
@@ -469,12 +469,21 @@
extern void AUD_muteSequence(AUD_SEntry* entry, char mute);
+extern void AUD_setRelativeSequence(AUD_SEntry* entry, char relative);
+
extern void AUD_updateSequenceSound(AUD_SEntry* entry, AUD_Sound* sound);
extern void AUD_setSequenceAnimData(AUD_SEntry* entry, AUD_AnimateablePropertyType type, int frame, float* data, char animated);
extern void AUD_setSequencerAnimData(AUD_Sound* sequencer, AUD_AnimateablePropertyType type, int frame, float* data, char animated);
+extern void AUD_updateSequenceData(AUD_SEntry* entry, float volume_max, float volume_min,
+ float distance_max, float distance_reference, float attenuation,
+ float cone_angle_outer, float cone_angle_inner, float cone_volume_outer);
+
+extern void AUD_updateSequencerData(AUD_Sound* sequencer, float speed_of_sound,
+ float factor, AUD_DistanceModel model);
+
extern void AUD_setSequencerDeviceSpecs(AUD_Sound* sequencer);
extern void AUD_setSequencerSpecs(AUD_Sound* sequencer, AUD_Specs specs);
@@ -499,6 +508,16 @@
extern void AUD_freeHandle(AUD_Handle* channel);
+extern void* AUD_createSet();
+
+extern void AUD_destroySet(void* set);
+
+extern char AUD_removeSet(void* set, void* entry);
+
+extern void AUD_addSet(void* set, void* entry);
+
+extern void* AUD_getSet(void* set);
+
#ifdef WITH_PYTHON
extern PyObject* AUD_getPythonFactory(AUD_Sound* sound);
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.cpp 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.cpp 2011-08-03 09:25:40 UTC (rev 38977)
@@ -66,8 +66,11 @@
void AUD_SequencerEntry::setSound(AUD_Reference<AUD_IFactory> sound)
{
- m_sound = sound;
- m_sound_status++;
+ if(m_sound.get() != sound.get())
+ {
+ m_sound = sound;
+ m_sound_status++;
+ }
}
void AUD_SequencerEntry::move(float begin, float end, float skip)
@@ -110,6 +113,59 @@
}
}
+void AUD_SequencerEntry::updateAll(float volume_max, float volume_min, float distance_max,
+ float distance_reference, float attenuation, float cone_angle_outer,
+ float cone_angle_inner, float cone_volume_outer)
+{
+ if(volume_max != m_volume_max)
+ {
+ m_volume_max = volume_max;
+ m_status++;
+ }
+
+ if(volume_min != m_volume_min)
+ {
+ m_volume_min = volume_min;
+ m_status++;
+ }
+
+ if(distance_max != m_distance_max)
+ {
+ m_distance_max = distance_max;
+ m_status++;
+ }
+
+ if(distance_reference != m_distance_reference)
+ {
+ m_distance_reference = distance_reference;
+ m_status++;
+ }
+
+ if(attenuation != m_attenuation)
+ {
+ m_attenuation = attenuation;
+ m_status++;
+ }
+
+ if(cone_angle_outer != m_cone_angle_outer)
+ {
+ m_cone_angle_outer = cone_angle_outer;
+ m_status++;
+ }
+
+ if(cone_angle_inner != m_cone_angle_inner)
+ {
+ m_cone_angle_inner = cone_angle_inner;
+ m_status++;
+ }
+
+ if(cone_volume_outer != m_cone_volume_outer)
+ {
+ m_cone_volume_outer = cone_volume_outer;
+ m_status++;
+ }
+}
+
bool AUD_SequencerEntry::isRelative()
{
return m_relative;
@@ -117,8 +173,11 @@
void AUD_SequencerEntry::setRelative(bool relative)
{
- m_relative = relative;
- m_status++;
+ if(m_relative != relative)
+ {
+ m_relative = relative;
+ m_status++;
+ }
}
float AUD_SequencerEntry::getVolumeMaximum()
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.h 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerEntry.h 2011-08-03 09:25:40 UTC (rev 38977)
@@ -78,6 +78,10 @@
AUD_AnimateableProperty* getAnimProperty(AUD_AnimateablePropertyType type);
+ void updateAll(float volume_max, float volume_min, float distance_max,
+ float distance_reference, float attenuation, float cone_angle_outer,
+ float cone_angle_inner, float cone_volume_outer);
+
/**
* Checks whether the source location, velocity and orientation are relative
* to the listener.
Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerHandle.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerHandle.cpp 2011-08-03 09:25:34 UTC (rev 38976)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_SequencerHandle.cpp 2011-08-03 09:25:40 UTC (rev 38977)
@@ -70,7 +70,7 @@
{
if(!m_handle.isNull())
{
- if(position >= m_entry->m_end)
+ if(position >= m_entry->m_end && m_entry->m_end >= 0)
m_handle->pause();
else if(position >= m_entry->m_begin)
m_handle->resume();
@@ -120,8 +120,17 @@
m_entry->m_panning.read(frame, &value);
AUD_SoftwareDevice::setPanning(m_handle.get(), value);
- // AUD_XXX: TODO: animation data
+ AUD_Vector3 v, v2;
+ AUD_Quaternion q;
+ m_entry->m_orientation.read(frame, q.get());
+ m_3dhandle->setSourceOrientation(q);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list