[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