From 3369b8289167ddf3dbca0e3895d598bf73534124 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Wed, 1 May 2019 12:46:47 +0200 Subject: Depsgraph: Add scene audio component The idea is to make that responsible for dealing with things like audio update on frame jump and such. --- source/blender/depsgraph/intern/builder/deg_builder_nodes.cc | 5 +++++ source/blender/depsgraph/intern/builder/deg_builder_nodes.h | 1 + .../depsgraph/intern/builder/deg_builder_nodes_view_layer.cc | 1 + .../blender/depsgraph/intern/builder/deg_builder_relations.cc | 10 ++++++++++ .../blender/depsgraph/intern/builder/deg_builder_relations.h | 1 + .../intern/builder/deg_builder_relations_view_layer.cc | 1 + source/blender/depsgraph/intern/depsgraph_tag.cc | 5 +++++ source/blender/makesdna/DNA_ID.h | 4 ++++ 8 files changed, 28 insertions(+) (limited to 'source/blender') diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc index 563edafcb0e..a9cafd933d9 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc @@ -1585,6 +1585,11 @@ void DepsgraphNodeBuilder::build_sequencer(Scene *scene) SEQ_END; } +void DepsgraphNodeBuilder::build_scene_audio(Scene *scene) +{ + add_operation_node(&scene->id, NodeType::AUDIO, OperationCode::SOUND_EVAL); +} + /* **** ID traversal callbacks functions **** */ void DepsgraphNodeBuilder::modifier_walk(void *user_data, diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h index 9805bd97b08..9074efefe50 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h @@ -209,6 +209,7 @@ class DepsgraphNodeBuilder : public DepsgraphBuilder { void build_speaker(Speaker *speaker); void build_sound(bSound *sound); void build_sequencer(Scene *scene); + void build_scene_audio(Scene *scene); /* Per-ID information about what was already in the dependency graph. * Allows to re-use certain values, to speed up following evaluation. */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc index c03416e956e..1b9524e5832 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_view_layer.cc @@ -154,6 +154,7 @@ void DepsgraphNodeBuilder::build_view_layer(Scene *scene, } /* Sequencer. */ if (linked_state == DEG_ID_LINKED_DIRECTLY) { + build_scene_audio(scene); build_sequencer(scene); } /* Collections. */ diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc index 46d565ad190..8fef35570fe 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc @@ -2307,15 +2307,25 @@ void DepsgraphRelationBuilder::build_sequencer(Scene *scene) /* Make sure dependnecies from sequences data goes to the sequencer evaluation. */ ComponentKey sequencer_key(&scene->id, NodeType::SEQUENCER); Sequence *seq; + bool has_audio_strips = false; SEQ_BEGIN (scene->ed, seq) { if (seq->sound != NULL) { build_sound(seq->sound); ComponentKey sound_key(&seq->sound->id, NodeType::AUDIO); add_relation(sound_key, sequencer_key, "Sound -> Sequencer"); + has_audio_strips = true; } /* TODO(sergey): Movie clip, scene, camera, mask. */ } SEQ_END; + if (has_audio_strips) { + ComponentKey scene_audio_key(&scene->id, NodeType::AUDIO); + add_relation(sequencer_key, scene_audio_key, "Sequencer -> Audio"); + } +} + +void DepsgraphRelationBuilder::build_scene_audio(Scene * /*scene*/) +{ } void DepsgraphRelationBuilder::build_copy_on_write_relations() diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.h b/source/blender/depsgraph/intern/builder/deg_builder_relations.h index 190b4064481..30fbe5bcf6b 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations.h +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.h @@ -270,6 +270,7 @@ class DepsgraphRelationBuilder : public DepsgraphBuilder { void build_speaker(Speaker *speaker); void build_sound(bSound *sound); void build_sequencer(Scene *scene); + void build_scene_audio(Scene *scene); void build_nested_datablock(ID *owner, ID *id); void build_nested_nodetree(ID *owner, bNodeTree *ntree); diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc index 8a23e4b9b6e..cadb4ab3611 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder_relations_view_layer.cc @@ -132,6 +132,7 @@ void DepsgraphRelationBuilder::build_view_layer(Scene *scene, } /* Sequencer. */ if (linked_state == DEG_ID_LINKED_DIRECTLY) { + build_scene_audio(scene); build_sequencer(scene); } /* Build all set scenes. */ diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc b/source/blender/depsgraph/intern/depsgraph_tag.cc index f7d7b76cb69..d8e895364ca 100644 --- a/source/blender/depsgraph/intern/depsgraph_tag.cc +++ b/source/blender/depsgraph/intern/depsgraph_tag.cc @@ -218,6 +218,9 @@ void depsgraph_tag_to_component_opcode(const ID *id, case ID_RECALC_SEQUENCER: *component_type = NodeType::SEQUENCER; break; + case ID_RECALC_AUDIO_JUMP: + *component_type = NodeType::AUDIO; + break; case ID_RECALC_ALL: case ID_RECALC_PSYS_ALL: BLI_assert(!"Should not happen"); @@ -620,6 +623,8 @@ const char *DEG_update_tag_as_string(IDRecalcFlag flag) return "EDITORS"; case ID_RECALC_SEQUENCER: return "SEQUENCER"; + case ID_RECALC_AUDIO_JUMP: + return "AUDIO_JUMP"; case ID_RECALC_ALL: return "ALL"; } diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 12f59cf8e78..42ee4e9a6c8 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -608,6 +608,10 @@ typedef enum IDRecalcFlag { * Use this tag with a scene ID which owns the sequences. */ ID_RECALC_SEQUENCER = (1 << 14), + /* Frame changed in a way that caused audio jump. + * Use this on a scene ID. */ + ID_RECALC_AUDIO_JUMP = (1 << 15), + /*************************************************************************** * Pseudonyms, to have more semantic meaning in the actual code without * using too much low-level and implementation specific tags. */ -- cgit v1.2.3