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.
This commit is contained in:
parent
8d09ec63b7
commit
23fbc9f22f
Notes:
blender-bot
2023-02-14 11:01:36 +01:00
Referenced by issue #39083, Logical error with speaker update
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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; }
|
||||
|
|
Loading…
Reference in New Issue