[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [40995] trunk/blender: Fixing [#28907] Frozen playback.

Joerg Mueller nexyon at gmail.com
Fri Oct 14 00:19:30 CEST 2011


Revision: 40995
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=40995
Author:   nexyon
Date:     2011-10-13 22:19:29 +0000 (Thu, 13 Oct 2011)
Log Message:
-----------
Fixing [#28907] Frozen playback.
Also fixing two more crashes when audio files don't exist/cannot be read and apply a changed file path of a sound, reported by Jens Verwiebe in IRC.

Modified Paths:
--------------
    trunk/blender/intern/audaspace/intern/AUD_NULLDevice.cpp
    trunk/blender/source/blender/blenkernel/intern/sound.c
    trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
    trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
    trunk/blender/source/blender/windowmanager/intern/wm_event_system.c

Modified: trunk/blender/intern/audaspace/intern/AUD_NULLDevice.cpp
===================================================================
--- trunk/blender/intern/audaspace/intern/AUD_NULLDevice.cpp	2011-10-13 22:14:41 UTC (rev 40994)
+++ trunk/blender/intern/audaspace/intern/AUD_NULLDevice.cpp	2011-10-13 22:19:29 UTC (rev 40995)
@@ -69,7 +69,7 @@
 
 float AUD_NULLDevice::AUD_NULLHandle::getPosition()
 {
-	return 0.0f;
+	return std::numeric_limits<float>::quiet_NaN();
 }
 
 AUD_Status AUD_NULLDevice::AUD_NULLHandle::getStatus()
@@ -79,7 +79,7 @@
 
 float AUD_NULLDevice::AUD_NULLHandle::getVolume()
 {
-	return 0.0f;
+	return std::numeric_limits<float>::quiet_NaN();
 }
 
 bool AUD_NULLDevice::AUD_NULLHandle::setVolume(float volume)
@@ -89,7 +89,7 @@
 
 float AUD_NULLDevice::AUD_NULLHandle::getPitch()
 {
-	return 0.0f;
+	return std::numeric_limits<float>::quiet_NaN();
 }
 
 bool AUD_NULLDevice::AUD_NULLHandle::setPitch(float pitch)
@@ -153,7 +153,7 @@
 
 float AUD_NULLDevice::getVolume() const
 {
-	return 0;
+	return std::numeric_limits<float>::quiet_NaN();
 }
 
 void AUD_NULLDevice::setVolume(float volume)

Modified: trunk/blender/source/blender/blenkernel/intern/sound.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/sound.c	2011-10-13 22:14:41 UTC (rev 40994)
+++ trunk/blender/source/blender/blenkernel/intern/sound.c	2011-10-13 22:19:29 UTC (rev 40995)
@@ -295,7 +295,10 @@
 		AUD_unload(sound->cache);
 
 	sound->cache = AUD_bufferSound(sound->handle);
-	sound->playback_handle = sound->cache;
+	if(sound->cache)
+		sound->playback_handle = sound->cache;
+	else
+		sound->playback_handle = sound->handle;
 }
 
 void sound_cache_notifying(struct Main* main, struct bSound* sound)
@@ -332,6 +335,8 @@
 			sound->playback_handle = NULL;
 		}
 
+		sound_free_waveform(sound);
+
 // XXX unused currently
 #if 0
 		switch(sound->type)
@@ -625,7 +630,7 @@
 		else
 			return AUD_getPosition(scene->sound_scene_handle);
 	}
-	return 0.0f;
+	return .0f/.0f;
 }
 
 int sound_scene_playing(struct Scene *scene)
@@ -782,7 +787,7 @@
 void sound_play_scene(struct Scene *UNUSED(scene)) {}
 void sound_stop_scene(struct Scene *UNUSED(scene)) {}
 void sound_seek_scene(struct Main *UNUSED(bmain), struct Scene *UNUSED(scene)) {}
-float sound_sync_scene(struct Scene *UNUSED(scene)) { return 0.0f; }
+float sound_sync_scene(struct Scene *UNUSED(scene)) { return .0f/.0f; }
 int sound_scene_playing(struct Scene *UNUSED(scene)) { return -1; }
 int sound_read_sound_buffer(struct bSound* UNUSED(sound), float* UNUSED(buffer), int UNUSED(length), float UNUSED(start), float UNUSED(end)) { return 0; }
 void sound_read_waveform(struct bSound* sound) { (void)sound; }

Modified: trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2011-10-13 22:14:41 UTC (rev 40994)
+++ trunk/blender/source/blender/editors/space_sequencer/sequencer_draw.c	2011-10-13 22:19:29 UTC (rev 40995)
@@ -192,6 +192,9 @@
 
 		waveform = seq->sound->waveform;
 
+		if(!waveform)
+			return;
+
 		startsample = floor((seq->startofs + seq->anim_startofs)/FPS * SOUND_WAVE_SAMPLES_PER_SECOND);
 		endsample = ceil((seq->startofs + seq->anim_startofs + seq->enddisp - seq->startdisp)/FPS * SOUND_WAVE_SAMPLES_PER_SECOND);
 		samplestep = (endsample-startsample) * stepsize / (x2-x1);

Modified: trunk/blender/source/blender/makesrna/intern/rna_sequencer.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2011-10-13 22:14:41 UTC (rev 40994)
+++ trunk/blender/source/blender/makesrna/intern/rna_sequencer.c	2011-10-13 22:19:29 UTC (rev 40995)
@@ -453,6 +453,8 @@
 		PointerRNA id_ptr;
 		RNA_id_pointer_create((ID *)seq->sound, &id_ptr);
 		RNA_string_set(&id_ptr, "filepath", value);
+		sound_load(G.main, seq->sound);
+		sound_update_scene_sound(seq->scene_sound, seq->sound);
 	}
 
 	BLI_split_dirfile(value, dir, name);

Modified: trunk/blender/source/blender/windowmanager/intern/wm_event_system.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2011-10-13 22:14:41 UTC (rev 40994)
+++ trunk/blender/source/blender/windowmanager/intern/wm_event_system.c	2011-10-13 22:19:29 UTC (rev 40995)
@@ -1790,11 +1790,14 @@
 					}
 					
 					if(playing == 0) {
-						int ncfra = sound_sync_scene(scene) * (float)FPS + 0.5f;
-						if(ncfra != scene->r.cfra)	{
-							scene->r.cfra = ncfra;
-							ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
-							WM_event_add_notifier(C, NC_WINDOW, NULL);
+						float time = sound_sync_scene(scene);
+						if(finite(time)) {
+							int ncfra = sound_sync_scene(scene) * (float)FPS + 0.5f;
+							if(ncfra != scene->r.cfra)	{
+								scene->r.cfra = ncfra;
+								ED_update_for_newframe(CTX_data_main(C), scene, win->screen, 1);
+								WM_event_add_notifier(C, NC_WINDOW, NULL);
+							}
 						}
 					}
 					




More information about the Bf-blender-cvs mailing list