[Bf-blender-cvs] [45f25c6] free-refcount-ids: Free IDs: Sound & Speaker.

Bastien Montagne noreply at git.blender.org
Thu Oct 1 17:44:23 CEST 2015


Commit: 45f25c62417f7236af06034c5dab01dcbf2cbb19
Author: Bastien Montagne
Date:   Thu Oct 1 16:47:12 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB45f25c62417f7236af06034c5dab01dcbf2cbb19

Free IDs: Sound & Speaker.

Also cleanup, removed horrible `BKE_sound_delete()`!

===================================================================

M	source/blender/blenkernel/BKE_sound.h
M	source/blender/blenkernel/BKE_speaker.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/blenkernel/intern/sound.c
M	source/blender/blenkernel/intern/speaker.c
M	source/blender/editors/sound/sound_ops.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_sound.h b/source/blender/blenkernel/BKE_sound.h
index e68be70..4712316 100644
--- a/source/blender/blenkernel/BKE_sound.h
+++ b/source/blender/blenkernel/BKE_sound.h
@@ -70,15 +70,13 @@ struct bSound *BKE_sound_new_buffer(struct Main *bmain, struct bSound *source);
 struct bSound *BKE_sound_new_limiter(struct Main *bmain, struct bSound *source, float start, float end);
 #endif
 
-void BKE_sound_delete(struct Main *bmain, struct bSound *sound);
-
 void BKE_sound_cache(struct bSound *sound);
 
 void BKE_sound_delete_cache(struct bSound *sound);
 
 void BKE_sound_load(struct Main *main, struct bSound *sound);
 
-void BKE_sound_free(struct bSound *sound);
+void BKE_sound_free(struct bSound *sound, const bool do_id_user);
 
 #if defined(__AUD_C_API_H__) || defined(WITH_SYSTEM_AUDASPACE)
 AUD_Device *BKE_sound_mixdown(struct Scene *scene, AUD_DeviceSpecs specs, int start, float volume);
diff --git a/source/blender/blenkernel/BKE_speaker.h b/source/blender/blenkernel/BKE_speaker.h
index 5d93b98..56500c6 100644
--- a/source/blender/blenkernel/BKE_speaker.h
+++ b/source/blender/blenkernel/BKE_speaker.h
@@ -33,6 +33,7 @@ struct Main;
 void *BKE_speaker_add(struct Main *bmain, const char *name);
 struct Speaker *BKE_speaker_copy(struct Speaker *spk);
 void BKE_speaker_make_local(struct Speaker *spk);
-void BKE_speaker_free(struct Speaker *spk);
+void BKE_speaker_release_datablocks(struct Speaker *spk);
+void BKE_speaker_free(struct Speaker *spk, const bool do_id_user);
 
 #endif
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index b824396..0244b97 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1000,10 +1000,10 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 			/* deprecated */
 			break;
 		case ID_SPK:
-			BKE_speaker_free((Speaker *)id);
+			BKE_speaker_free((Speaker *)id, do_id_user);
 			break;
 		case ID_SO:
-			BKE_sound_free((bSound *)id);
+			BKE_sound_free((bSound *)id, do_id_user);
 			break;
 		case ID_GR:
 			BKE_group_free((Group *)id);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index f0e59ed..daabacb 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -5012,7 +5012,7 @@ Sequence *BKE_sequencer_add_sound_strip(bContext *C, ListBase *seqbasep, SeqLoad
 	info = AUD_getInfo(sound->playback_handle);
 
 	if (info.specs.channels == AUD_CHANNELS_INVALID) {
-		BKE_sound_delete(bmain, sound);
+		BKE_libblock_free(bmain, sound);
 #if 0
 		if (op)
 			BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
diff --git a/source/blender/blenkernel/intern/sound.c b/source/blender/blenkernel/intern/sound.c
index 0b89931..4cee974 100644
--- a/source/blender/blenkernel/intern/sound.c
+++ b/source/blender/blenkernel/intern/sound.c
@@ -99,8 +99,10 @@ bSound *BKE_sound_new_file(struct Main *bmain, const char *filename)
 	return sound;
 }
 
-void BKE_sound_free(bSound *sound)
+void BKE_sound_free(bSound *sound, const bool UNUSED(do_id_user))
 {
+	/* This ID has no animdata. */
+
 	if (sound->packedfile) {
 		freePackedFile(sound->packedfile);
 		sound->packedfile = NULL;
@@ -124,8 +126,7 @@ void BKE_sound_free(bSound *sound)
 		BLI_spin_end(sound->spinlock);
 		MEM_freeN(sound->spinlock);
 		sound->spinlock = NULL;
-	}
-	
+	}	
 #endif  /* WITH_AUDASPACE */
 }
 
@@ -291,15 +292,6 @@ bSound *BKE_sound_new_limiter(struct Main *bmain, bSound *source, float start, f
 }
 #endif
 
-void BKE_sound_delete(struct Main *bmain, bSound *sound)
-{
-	if (sound) {
-		BKE_sound_free(sound);
-
-		BKE_libblock_free(bmain, sound);
-	}
-}
-
 void BKE_sound_cache(bSound *sound)
 {
 	sound->flags |= SOUND_FLAGS_CACHING;
diff --git a/source/blender/blenkernel/intern/speaker.c b/source/blender/blenkernel/intern/speaker.c
index 7a80055..b9e2e7c 100644
--- a/source/blender/blenkernel/intern/speaker.c
+++ b/source/blender/blenkernel/intern/speaker.c
@@ -125,10 +125,31 @@ void BKE_speaker_make_local(Speaker *spk)
 	}
 }
 
-void BKE_speaker_free(Speaker *spk)
+/**
+ * Release all datablocks (ID) used by this speaker (datablocks are never freed, they are just unreferenced).
+ *
+ * \param spk The speaker which has to release its data.
+ */
+void BKE_speaker_release_datablocks(Speaker *spk)
 {
-	if (spk->sound)
-		spk->sound->id.us--;
+	if (spk->sound) {
+		id_us_min(&spk->sound->id);
+		spk->sound = NULL;
+	}
+}
+
+/**
+ * Free (or release) any data used by this speaker (does not free the speaker itself).
+ *
+ * \param spk The speaker to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this speaker are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_speaker_free(Speaker *spk, const bool do_id_user)
+{
+	if (do_id_user) {
+		BKE_speaker_release_datablocks(spk);
+	}
 
 	BKE_animdata_free((ID *)spk);
 }
diff --git a/source/blender/editors/sound/sound_ops.c b/source/blender/editors/sound/sound_ops.c
index f8d84cc..d34f575 100644
--- a/source/blender/editors/sound/sound_ops.c
+++ b/source/blender/editors/sound/sound_ops.c
@@ -116,7 +116,7 @@ static int sound_open_exec(bContext *C, wmOperator *op)
 	info = AUD_getInfo(sound->playback_handle);
 
 	if (info.specs.channels == AUD_CHANNELS_INVALID) {
-		BKE_sound_delete(bmain, sound);
+		BKE_libblock_free(bmain, sound);
 		if (op->customdata) MEM_freeN(op->customdata);
 		BKE_report(op->reports, RPT_ERROR, "Unsupported audio format");
 		return OPERATOR_CANCELLED;




More information about the Bf-blender-cvs mailing list