From 23fbc9f22f3dfd7151c4396a17fbe586b0594d81 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 11 Mar 2014 14:44:13 +1100 Subject: [PATCH] Fix T39083: speakers were evaluated multiple times when used in sets also skip checking all objects for speakers when no speakers are in the blend file. --- source/blender/blenkernel/BKE_sound.h | 2 +- source/blender/blenkernel/intern/scene.c | 7 ++++--- source/blender/blenkernel/intern/sound.c | 12 ++++++++++-- 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h index 64f0b97c3f0..eb0aec50300 100644 --- a/source/blender/blenkernel/BKE_sound.h +++ b/source/blender/blenkernel/BKE_sound.h @@ -134,7 +134,7 @@ void sound_free_waveform(struct bSound *sound); void sound_read_waveform(struct bSound *sound); -void sound_update_scene(struct Scene *scene); +void sound_update_scene(struct Main *bmain, struct Scene *scene); void *sound_get_factory(void *sound); diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c index bc83adb31d3..110e91711f0 100644 --- a/source/blender/blenkernel/intern/scene.c +++ b/source/blender/blenkernel/intern/scene.c @@ -1539,9 +1539,6 @@ static void scene_update_tagged_recursive(EvaluationContext *eval_ctx, Main *bma /* scene drivers... */ scene_update_drivers(bmain, scene); - /* update sound system animation */ - sound_update_scene(scene); - /* update masking curves */ BKE_mask_update_scene(bmain, scene); @@ -1575,6 +1572,8 @@ void BKE_scene_update_tagged(EvaluationContext *eval_ctx, Main *bmain, Scene *sc * in the future this should handle updates for all datablocks, not * only objects and scenes. - brecht */ scene_update_tagged_recursive(eval_ctx, bmain, scene, scene); + /* update sound system animation (TODO, move to depsgraph) */ + sound_update_scene(bmain, scene); /* extra call here to recalc scene animation (for sequencer) */ { @@ -1680,6 +1679,8 @@ void BKE_scene_update_for_newframe_ex(EvaluationContext *eval_ctx, Main *bmain, /* BKE_object_handle_update() on all objects, groups and sets */ scene_update_tagged_recursive(eval_ctx, bmain, sce, sce); + /* update sound system animation (TODO, move to depsgraph) */ + sound_update_scene(bmain, sce); scene_depsgraph_hack(eval_ctx, sce, sce); diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c index 3a8754e8dd2..1fe73a1f692 100644 --- a/source/blender/blenkernel/intern/sound.c +++ b/source/blender/blenkernel/intern/sound.c @@ -681,7 +681,7 @@ void sound_read_waveform(bSound *sound) } } -void sound_update_scene(struct Scene *scene) +void sound_update_scene(Main *bmain, struct Scene *scene) { Object *ob; Base *base; @@ -694,6 +694,11 @@ void sound_update_scene(struct Scene *scene) void *handle; float quat[4]; + /* cheap test to skip looping over all objects (no speakers is a common case) */ + if (BLI_listbase_is_empty(&bmain->speaker)) { + goto skip_speakers; + } + for (SETLOOPER(scene, sce_it, base)) { ob = base->object; if (ob->type == OB_SPEAKER) { @@ -743,6 +748,9 @@ void sound_update_scene(struct Scene *scene) } } + +skip_speakers: + while ((handle = AUD_getSet(scene->speaker_handles))) { AUD_removeSequence(scene->sound_scene, handle); } @@ -808,7 +816,7 @@ void sound_read_waveform(struct bSound *sound) { (void)sound; } void sound_init_main(struct Main *bmain) { (void)bmain; } void sound_set_cfra(int cfra) { (void)cfra; } void sound_update_sequencer(struct Main *main, struct bSound *sound) { (void)main; (void)sound; } -void sound_update_scene(struct Scene *scene) { (void)scene; } +void sound_update_scene(struct Main *UNUSED(bmain), struct Scene *UNUSED(scene)) { } void sound_update_scene_sound(void *handle, struct bSound *sound) { (void)handle; (void)sound; } void sound_update_scene_listener(struct Scene *scene) { (void)scene; } void sound_update_fps(struct Scene *scene) { (void)scene; }