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

Joerg Mueller nexyon at gmail.com
Tue Aug 9 10:38:15 CEST 2011


Revision: 39206
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39206
Author:   nexyon
Date:     2011-08-09 08:38:14 +0000 (Tue, 09 Aug 2011)
Log Message:
-----------
3D Audio GSoC:
Speaker objects fully functional!

Minor changes:
* Fixed three memory bugs found via valgrind.
* Fixed bug with jack transport crashing after file loading.
* Sound NLA Strips now start at CFRA instead of 0.

Modified Paths:
--------------
    branches/soc-2011-pepper/intern/audaspace/FX/AUD_DoubleReader.cpp
    branches/soc-2011-pepper/intern/audaspace/FX/AUD_SuperposeReader.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_AnimateableProperty.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_LinearResampleReader.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_ReadDevice.cpp
    branches/soc-2011-pepper/intern/audaspace/intern/AUD_Space.h
    branches/soc-2011-pepper/source/blender/blenkernel/BKE_sound.h
    branches/soc-2011-pepper/source/blender/blenkernel/intern/blender.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/library.c
    branches/soc-2011-pepper/source/blender/blenkernel/intern/scene.c
    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_anim_types.h

Modified: branches/soc-2011-pepper/intern/audaspace/FX/AUD_DoubleReader.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/FX/AUD_DoubleReader.cpp	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/FX/AUD_DoubleReader.cpp	2011-08-09 08:38:14 UTC (rev 39206)
@@ -97,7 +97,7 @@
 			AUD_Specs specs1, specs2;
 			specs1 = m_reader1->getSpecs();
 			specs2 = m_reader2->getSpecs();
-			if(memcmp(&specs1, &specs2, sizeof(AUD_Specs)))
+			if(AUD_COMPARE_SPECS(specs1, specs2))
 				length = len;
 			else
 			{

Modified: branches/soc-2011-pepper/intern/audaspace/FX/AUD_SuperposeReader.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/FX/AUD_SuperposeReader.cpp	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/FX/AUD_SuperposeReader.cpp	2011-08-09 08:38:14 UTC (rev 39206)
@@ -81,7 +81,7 @@
 {
 	AUD_Specs specs = m_reader1->getSpecs();
 	AUD_Specs s2 = m_reader2->getSpecs();
-	if(memcmp(&specs, &s2, sizeof(AUD_Specs)))
+	if(AUD_COMPARE_SPECS(specs, s2))
 		AUD_THROW(AUD_ERROR_SPECS, specs_error);
 
 	int samplesize = AUD_SAMPLE_SIZE(specs);

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_AnimateableProperty.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_AnimateableProperty.cpp	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_AnimateableProperty.cpp	2011-08-09 08:38:14 UTC (rev 39206)
@@ -105,10 +105,10 @@
 		return;
 	}
 
-	float last = (getSize() / (sizeof(float) * m_count) - 1);
+	int last = getSize() / (sizeof(float) * m_count) - 1;
 	float t = position - floor(position);
 
-	if(position > last)
+	if(position >= last)
 	{
 		position = last;
 		t = 0;
@@ -128,24 +128,18 @@
 		float* p1 = getBuffer() + pos;
 		float* p2;
 		float* p3;
+		last *= m_count;
 
 		if(pos == 0)
 			p0 = p1;
 		else
 			p0 = p1 - m_count;
 
-		if(pos > last)
-		{
-			p3 = p2 = p1;
-		}
+		p2 = p1 + m_count;
+		if(pos + m_count == last)
+			p3 = p2;
 		else
-		{
-			p2 = p1 + m_count;
-			if(pos + m_count > last)
-				p3 = p2;
-			else
-				p3 = p2 + m_count;
-		}
+			p3 = p2 + m_count;
 
 		for(int i = 0; i < m_count; i++)
 		{

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_LinearResampleReader.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_LinearResampleReader.cpp	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_LinearResampleReader.cpp	2011-08-09 08:38:14 UTC (rev 39206)
@@ -82,7 +82,7 @@
 
 	int samplesize = AUD_SAMPLE_SIZE(specs);
 	int size = length;
-	float factor = float(m_rate) / float(m_reader->getSpecs().rate);
+	float factor = m_rate / m_reader->getSpecs().rate;
 	float spos;
 	sample_t low, high;
 	eos = false;

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_ReadDevice.cpp
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_ReadDevice.cpp	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_ReadDevice.cpp	2011-08-09 08:38:14 UTC (rev 39206)
@@ -70,7 +70,7 @@
 
 void AUD_ReadDevice::changeSpecs(AUD_Specs specs)
 {
-	if(memcmp(&specs, &m_specs.specs, sizeof(specs)))
+	if(AUD_COMPARE_SPECS(specs, m_specs.specs))
 		setSpecs(specs);
 }
 

Modified: branches/soc-2011-pepper/intern/audaspace/intern/AUD_Space.h
===================================================================
--- branches/soc-2011-pepper/intern/audaspace/intern/AUD_Space.h	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/intern/audaspace/intern/AUD_Space.h	2011-08-09 08:38:14 UTC (rev 39206)
@@ -41,6 +41,8 @@
 /// Throws a AUD_Exception with the provided error code.
 #define AUD_THROW(exception, errorstr) { AUD_Exception e; e.error = exception; e.str = errorstr; throw e; }
 
+#define AUD_COMPARE_SPECS(s1, s2) ((s1.rate == s2.rate) && (s1.channels == s2.channels))
+
 /// Returns the bit for a channel mask.
 #define AUD_CHANNEL_BIT(channel) (0x01 << channel)
 

Modified: branches/soc-2011-pepper/source/blender/blenkernel/BKE_sound.h
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/BKE_sound.h	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/source/blender/blenkernel/BKE_sound.h	2011-08-09 08:38:14 UTC (rev 39206)
@@ -46,6 +46,8 @@
 
 void sound_init(struct Main *main);
 
+void sound_init_main(struct Main *bmain);
+
 void sound_exit(void);
 
 void sound_force_device(int device);
@@ -124,6 +126,8 @@
 
 int sound_get_channels(struct bSound* sound);
 
+void sound_update_scene(struct Main* bmain, struct Scene* scene);
+
 void* sound_get_factory(void* sound);
 
 #endif

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/blender.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/blender.c	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/blender.c	2011-08-09 08:38:14 UTC (rev 39206)
@@ -82,6 +82,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_sequencer.h"
+#include "BKE_sound.h"
 
 
 #include "BLO_undofile.h"
@@ -247,6 +248,8 @@
 	G.main= bfd->main;
 
 	CTX_data_main_set(C, G.main);
+
+	sound_init_main(G.main);
 	
 	if (bfd->user) {
 		

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/library.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/library.c	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/library.c	2011-08-09 08:38:14 UTC (rev 39206)
@@ -533,7 +533,6 @@
 	lb[a++]= &(main->latt);
 	lb[a++]= &(main->lamp);
 	lb[a++]= &(main->camera);
-	lb[a++]= &(main->speaker);
 
 	lb[a++]= &(main->text);
 	lb[a++]= &(main->sound);
@@ -541,6 +540,7 @@
 	lb[a++]= &(main->brush);
 	lb[a++]= &(main->script);
 	lb[a++]= &(main->particle);
+	lb[a++]= &(main->speaker);
 
 	lb[a++]= &(main->world);
 	lb[a++]= &(main->screen);

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/scene.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/scene.c	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/scene.c	2011-08-09 08:38:14 UTC (rev 39206)
@@ -966,6 +966,9 @@
 	
 	/* scene drivers... */
 	scene_update_drivers(bmain, scene);
+
+	/* update sound system animation */
+	sound_update_scene(bmain, scene);
 }
 
 /* this is called in main loop, doing tagged updates before redraw */

Modified: branches/soc-2011-pepper/source/blender/blenkernel/intern/sound.c
===================================================================
--- branches/soc-2011-pepper/source/blender/blenkernel/intern/sound.c	2011-08-09 07:48:40 UTC (rev 39205)
+++ branches/soc-2011-pepper/source/blender/blenkernel/intern/sound.c	2011-08-09 08:38:14 UTC (rev 39206)
@@ -13,13 +13,16 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_blenlib.h"
+#include "BLI_math.h"
 
 #include "DNA_anim_types.h"
+#include "DNA_object_types.h"
 #include "DNA_scene_types.h"
 #include "DNA_sequence_types.h"
 #include "DNA_packedFile_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_sound_types.h"
+#include "DNA_speaker_types.h"
 
 #ifdef WITH_AUDASPACE
 #  include "AUD_C-API.h"
@@ -175,7 +178,12 @@
 
 	if(!AUD_init(device, specs, buffersize))
 		AUD_init(AUD_NULL_DEVICE, specs, buffersize);
-		
+
+	sound_init_main(bmain);
+}
+
+void sound_init_main(struct Main *bmain)
+{
 #ifdef WITH_JACK
 	AUD_setSyncCallback(sound_sync_callback, bmain);
 #else
@@ -617,6 +625,84 @@
 	return info.specs.channels;
 }
 
+void sound_update_scene(struct Main* bmain, struct Scene* scene)
+{
+	Object* ob;
+	NlaTrack* track;
+	NlaStrip* strip;
+	Speaker* speaker;
+
+	void* new_set = AUD_createSet();
+	void* handle;
+	float quat[4];
+
+	for(ob = bmain->object.first; ob; ob = ob->id.next)
+	{
+		if(ob->type == OB_SPEAKER)
+		{
+			if(ob->adt)
+			{
+				for(track = ob->adt->nla_tracks.first; track; track = track->next)
+				{
+					for(strip = track->strips.first; strip; strip = strip->next)
+					{
+						if(strip->type == NLASTRIP_TYPE_SOUND)
+						{
+							speaker = (Speaker*)ob->data;
+
+							if(AUD_removeSet(scene->speaker_handles, strip->speaker_handle))
+							{
+								AUD_moveSequence(strip->speaker_handle, strip->start / FPS, -1, 0);
+							}
+							else
+							{
+								if(speaker && speaker->sound)
+								{
+									strip->speaker_handle = AUD_addSequence(scene->sound_scene, speaker->sound->playback_handle, strip->start / FPS, -1, 0);
+									AUD_setRelativeSequence(strip->speaker_handle, 0);
+								}
+							}
+
+							if(strip->speaker_handle)
+							{
+								AUD_addSet(new_set, strip->speaker_handle);
+								AUD_updateSequenceData(strip->speaker_handle, speaker->volume_max,
+													   speaker->volume_min, speaker->distance_max,
+													   speaker->distance_reference, speaker->attenuation,
+													   speaker->cone_angle_outer, speaker->cone_angle_inner,
+													   speaker->cone_volume_outer);
+
+								mat4_to_quat(quat, ob->obmat);
+								AUD_setSequenceAnimData(strip->speaker_handle, AUD_AP_LOCATION, CFRA, ob->obmat[3], 1);
+								AUD_setSequenceAnimData(strip->speaker_handle, AUD_AP_ORIENTATION, CFRA, quat, 1);
+								AUD_setSequenceAnimData(strip->speaker_handle, AUD_AP_VOLUME, CFRA, &speaker->volume, 1);
+								AUD_setSequenceAnimData(strip->speaker_handle, AUD_AP_PITCH, CFRA, &speaker->pitch, 1);
+								AUD_updateSequenceSound(strip->speaker_handle, speaker->sound->playback_handle);
+								AUD_muteSequence(strip->speaker_handle, ((strip->flag & NLASTRIP_FLAG_MUTED) != 0) || ((speaker->flag & SPK_MUTED) != 0));
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+	while((handle = AUD_getSet(scene->speaker_handles)))
+	{
+		AUD_removeSequence(scene->sound_scene, handle);
+	}
+
+	if(scene->camera)
+	{
+		mat4_to_quat(quat, scene->camera->obmat);
+		AUD_setSequencerAnimData(scene->sound_scene, AUD_AP_LOCATION, CFRA, scene->camera->obmat[3], 1);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list