diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-11 11:55:13 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-06-11 16:11:07 +0300 |
commit | 0767f95a63959e156c302520db7fbf480159abe0 (patch) | |
tree | e4f416474ae320156e9e35b1d25d2b8300ad628e /source/blender/editors/space_sequencer | |
parent | 3a6f6c87e051edd3e98c92428980a52bafd7abf0 (diff) |
Sound: Fix queries of sound info
A lot of areas were querying sound information directly using audio handle
which does not exist on an original sound IDs.
This change basically makes it so it's possible to query information about
given sound ID, without worrying about whether it's loaded or not: if it is
needed to load it first it happens automatically (no automatically-opened
handles are left behind though).
While this seems a bit extreme to open files on such queries it is still
better than the old situation when all sound handles were opened on file
load, no matter if it's needed or not. Besides, none of the changed code
paths are performance critical, just handful of tools.
Fixes T65696: Sequencer fails to create a new sound sequence strip via Python
Fixes T65656: Audio strip - SHIFT K crashes Blender
Reviewers: brecht
Reviewed By: brecht
Subscribers: ISS
Maniphest Tasks: T65696, T65656
Differential Revision: https://developer.blender.org/D5061
Diffstat (limited to 'source/blender/editors/space_sequencer')
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_edit.c | 34 | ||||
-rw-r--r-- | source/blender/editors/space_sequencer/sequencer_preview.c | 4 |
2 files changed, 21 insertions, 17 deletions
diff --git a/source/blender/editors/space_sequencer/sequencer_edit.c b/source/blender/editors/space_sequencer/sequencer_edit.c index c214b84b611..b32f73323b2 100644 --- a/source/blender/editors/space_sequencer/sequencer_edit.c +++ b/source/blender/editors/space_sequencer/sequencer_edit.c @@ -726,7 +726,8 @@ static void recurs_del_seq_flag(Scene *scene, ListBase *lb, short flag, short de } } -static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, ListBase *new_seq_list, int cutframe) +static Sequence *cut_seq_hard( + Main *bmain, Scene *scene, Sequence *seq, ListBase *new_seq_list, int cutframe) { TransSeq ts; Sequence *seqn = NULL; @@ -755,7 +756,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, ListBase *new_seq_lis * blend file, or our code may have minor differences reading file length between versions. * This causes hard-cut to fail, see: T47862 */ if (seq->type != SEQ_TYPE_META) { - BKE_sequence_reload_new_file(scene, seq, true); + BKE_sequence_reload_new_file(bmain, scene, seq, true); BKE_sequence_calc(scene, seq); } @@ -790,7 +791,7 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, ListBase *new_seq_lis } } - BKE_sequence_reload_new_file(scene, seq, false); + BKE_sequence_reload_new_file(bmain, scene, seq, false); BKE_sequence_calc(scene, seq); if (!skip_dup) { @@ -837,13 +838,14 @@ static Sequence *cut_seq_hard(Scene *scene, Sequence *seq, ListBase *new_seq_lis seqn->startstill = 0; } - BKE_sequence_reload_new_file(scene, seqn, false); + BKE_sequence_reload_new_file(bmain, scene, seqn, false); BKE_sequence_calc(scene, seqn); } return seqn; } -static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, ListBase *new_seq_list, int cutframe) +static Sequence *cut_seq_soft( + Main *UNUSED(bmain), Scene *scene, Sequence *seq, ListBase *new_seq_list, int cutframe) { TransSeq ts; Sequence *seqn = NULL; @@ -949,10 +951,11 @@ static Sequence *cut_seq_soft(Scene *scene, Sequence *seq, ListBase *new_seq_lis * may generate strips with the same name (which will mess up animdata) */ -static bool cut_seq_list(Scene *scene, +static bool cut_seq_list(Main *bmain, + Scene *scene, ListBase *slist, int cutframe, - Sequence *(*cut_seq)(Scene *, Sequence *, ListBase *, int)) + Sequence *(*cut_seq)(Main *bmain, Scene *, Sequence *, ListBase *, int)) { Sequence *seq, *seq_next_iter; Sequence *seq_first_new = NULL; @@ -964,7 +967,7 @@ static bool cut_seq_list(Scene *scene, seq->tmp = NULL; if (seq->flag & SELECT) { if (cutframe > seq->startdisp && cutframe < seq->enddisp) { - Sequence *seqn = cut_seq(scene, seq, slist, cutframe); + Sequence *seqn = cut_seq(bmain, scene, seq, slist, cutframe); if (seqn) { if (seq_first_new == NULL) { seq_first_new = seqn; @@ -1040,7 +1043,7 @@ static void set_filter_seq(Scene *scene) if (seq->flag & SELECT) { if (seq->type == SEQ_TYPE_MOVIE) { seq->flag |= SEQ_FILTERY; - BKE_sequence_reload_new_file(scene, seq, false); + BKE_sequence_reload_new_file(bmain, scene, seq, false); BKE_sequence_calc(scene, seq); } } @@ -1622,6 +1625,7 @@ static void sequencer_slip_update_header(Scene *scene, ScrArea *sa, SlipData *da static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *event) { + Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); SlipData *data = (SlipData *)op->customdata; ScrArea *sa = CTX_wm_area(C); @@ -1702,7 +1706,7 @@ static int sequencer_slip_modal(bContext *C, wmOperator *op, const wmEvent *even for (i = 0; i < data->num_seq; i++) { Sequence *seq = data->seq_array[i]; - BKE_sequence_reload_new_file(scene, seq, false); + BKE_sequence_reload_new_file(bmain, scene, seq, false); BKE_sequence_calc(scene, seq); } @@ -1956,6 +1960,7 @@ void SEQUENCER_OT_unlock(struct wmOperatorType *ot) /* reload operator */ static int sequencer_reload_exec(bContext *C, wmOperator *op) { + Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); Editing *ed = BKE_sequencer_editing_get(scene, false); Sequence *seq; @@ -1964,7 +1969,7 @@ static int sequencer_reload_exec(bContext *C, wmOperator *op) for (seq = ed->seqbasep->first; seq; seq = seq->next) { if (seq->flag & SELECT) { BKE_sequencer_update_changed_seq_and_deps(scene, seq, 0, 1); - BKE_sequence_reload_new_file(scene, seq, !adjust_length); + BKE_sequence_reload_new_file(bmain, scene, seq, !adjust_length); if (adjust_length) { if (BKE_sequence_test_overlap(ed->seqbasep, seq)) { @@ -2139,6 +2144,7 @@ static const EnumPropertyItem prop_cut_types[] = { static int sequencer_cut_exec(bContext *C, wmOperator *op) { + Main *bmain = CTX_data_main(C); Scene *scene = CTX_data_scene(C); Editing *ed = BKE_sequencer_editing_get(scene, false); int cut_side, cut_hard, cut_frame; @@ -2150,10 +2156,10 @@ static int sequencer_cut_exec(bContext *C, wmOperator *op) cut_side = RNA_enum_get(op->ptr, "side"); if (cut_hard == SEQ_CUT_HARD) { - changed = cut_seq_list(scene, ed->seqbasep, cut_frame, cut_seq_hard); + changed = cut_seq_list(bmain, scene, ed->seqbasep, cut_frame, cut_seq_hard); } else { - changed = cut_seq_list(scene, ed->seqbasep, cut_frame, cut_seq_soft); + changed = cut_seq_list(bmain, scene, ed->seqbasep, cut_frame, cut_seq_soft); } if (changed) { /* got new strips ? */ @@ -3948,7 +3954,7 @@ static int sequencer_change_path_exec(bContext *C, wmOperator *op) /* correct start/end frames so we don't move * important not to set seq->len = len; allow the function to handle it */ - BKE_sequence_reload_new_file(scene, seq, true); + BKE_sequence_reload_new_file(bmain, scene, seq, true); BKE_sequence_calc(scene, seq); diff --git a/source/blender/editors/space_sequencer/sequencer_preview.c b/source/blender/editors/space_sequencer/sequencer_preview.c index 8a4e8c007f7..81ddd0dd8cc 100644 --- a/source/blender/editors/space_sequencer/sequencer_preview.c +++ b/source/blender/editors/space_sequencer/sequencer_preview.c @@ -80,9 +80,7 @@ static void preview_startjob(void *data, short *stop, short *do_update, float *p PreviewJobAudio *preview_next; bSound *sound = previewjb->sound; - BKE_sound_load_audio(previewjb->bmain, sound); - BKE_sound_read_waveform(sound, stop); - BKE_sound_free_audio(sound); + BKE_sound_read_waveform(previewjb->bmain, sound, stop); if (*stop || G.is_break) { BLI_mutex_lock(pj->mutex); |