Fix T66431: SE - Audio Caching crash
authorSergey Sharybin <sergey.vfx@gmail.com>
Mon, 8 Jul 2019 13:57:33 +0000 (15:57 +0200)
committerSergey Sharybin <sergey.vfx@gmail.com>
Mon, 8 Jul 2019 13:57:33 +0000 (15:57 +0200)
Moved the caching code from direct calls in DNA to dependency graph.

In fact, not much was needed to be done apart form removing the direct
cache updates. The rest seemed to work fine.

Possible to avoid full sound file re-load, but doesn't seem this is
causing any issues.

source/blender/blenkernel/intern/sequencer.c
source/blender/blenkernel/intern/sound.c
source/blender/editors/sound/sound_ops.c
source/blender/makesrna/intern/rna_sound.c

index f2e0ee0c7fa2a3495b99e5c2203d693c1ef2cff0..ceb06c29f095edd4271c43a93e386f86d7aecc00 100644 (file)
@@ -5400,7 +5400,7 @@ static void seq_load_apply(Main *bmain, Scene *scene, Sequence *seq, SeqLoadInfo
 
     if (seq_load->flag & SEQ_LOAD_SOUND_CACHE) {
       if (seq->sound) {
-        BKE_sound_cache(seq->sound);
+        seq->sound->flags |= SOUND_FLAGS_CACHING;
       }
     }
 
index 1722b888d280d0ddc4d134ef2d251559789cf4ea..6d782726e07c126a870cde10b0d80fd36004e861 100644 (file)
@@ -389,7 +389,6 @@ void BKE_sound_cache(bSound *sound)
 {
   sound_verify_evaluated_id(&sound->id);
 
-  sound->flags |= SOUND_FLAGS_CACHING;
   if (sound->cache) {
     AUD_Sound_free(sound->cache);
   }
@@ -405,7 +404,6 @@ void BKE_sound_cache(bSound *sound)
 
 void BKE_sound_delete_cache(bSound *sound)
 {
-  sound->flags &= ~SOUND_FLAGS_CACHING;
   if (sound->cache) {
     AUD_Sound_free(sound->cache);
     sound->cache = NULL;
index f4191f87df6e49fdb68347ac1893a1b11e9d84ec..0241a2fbe88997828eccdb30dc357d4639ce77ee 100644 (file)
@@ -104,7 +104,7 @@ static int sound_open_exec(bContext *C, wmOperator *op)
   }
 
   if (RNA_boolean_get(op->ptr, "cache")) {
-    BKE_sound_cache(sound);
+    sound->flags |= SOUND_FLAGS_CACHING;
   }
 
   /* hook into UI */
index e4b120261c6230f490639fc9171d67ffc276dce2..8402c4a8705bb7b0512470e7fbc8ce5d8b749a0b 100644 (file)
@@ -40,26 +40,10 @@ static void rna_Sound_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerR
   DEG_id_tag_update(&sound->id, ID_RECALC_AUDIO);
 }
 
-static bool rna_Sound_caching_get(PointerRNA *ptr)
+static void rna_Sound_caching_update(Main *bmain, Scene *scene, PointerRNA *ptr)
 {
-  bSound *sound = (bSound *)(ptr->data);
-  return (sound->flags & SOUND_FLAGS_CACHING) != 0;
-}
-
-static void rna_Sound_caching_set(PointerRNA *ptr, const bool value)
-{
-  bSound *sound = (bSound *)(ptr->data);
-  if (value) {
-    BKE_sound_cache(sound);
-  }
-  else {
-    BKE_sound_delete_cache(sound);
-  }
-}
-
-static void rna_Sound_caching_update(Main *UNUSED(bmain), Scene *scene, PointerRNA *ptr)
-{
-  BKE_sequencer_update_sound(scene, (bSound *)(ptr->data));
+  rna_Sound_update(bmain, scene, ptr);
+  DEG_id_tag_update(&scene->id, ID_RECALC_SEQUENCER_STRIPS);
 }
 
 #else
@@ -87,7 +71,7 @@ static void rna_def_sound(BlenderRNA *brna)
   RNA_def_property_ui_text(prop, "Packed File", "");
 
   prop = RNA_def_property(srna, "use_memory_cache", PROP_BOOLEAN, PROP_NONE);
-  RNA_def_property_boolean_funcs(prop, "rna_Sound_caching_get", "rna_Sound_caching_set");
+  RNA_def_property_boolean_sdna(prop, NULL, "flags", SOUND_FLAGS_CACHING);
   RNA_def_property_ui_text(prop, "Caching", "The sound file is decoded and loaded into RAM");
   RNA_def_property_update(prop, 0, "rna_Sound_caching_update");