2
0
Эх сурвалжийг харах

Merge pull request #58577 from pfertyk/issue_58543_audio_not_paused

[3.x] Fix AudioStreamPlayer not paused on pause mode change
lawnjelly 1 жил өмнө
parent
commit
a73715cf55
2 өөрчлөгдсөн 25 нэмэгдсэн , 12 устгасан
  1. 24 12
      scene/main/node.cpp
  2. 1 0
      scene/main/node.h

+ 24 - 12
scene/main/node.cpp

@@ -516,25 +516,27 @@ void Node::set_pause_mode(PauseMode p_mode) {
 	}
 
 	bool prev_inherits = data.pause_mode == PAUSE_MODE_INHERIT;
+	bool prev_can_process = is_inside_tree() && can_process();
 	data.pause_mode = p_mode;
 	if (!is_inside_tree()) {
 		return; //pointless
 	}
-	if ((data.pause_mode == PAUSE_MODE_INHERIT) == prev_inherits) {
-		return; ///nothing changed
-	}
-
-	Node *owner = nullptr;
+	if ((data.pause_mode == PAUSE_MODE_INHERIT) != prev_inherits) {
+		Node *owner = nullptr;
 
-	if (data.pause_mode == PAUSE_MODE_INHERIT) {
-		if (data.parent) {
-			owner = data.parent->data.pause_owner;
+		if (data.pause_mode == PAUSE_MODE_INHERIT) {
+			if (data.parent) {
+				owner = data.parent->data.pause_owner;
+			}
+		} else {
+			owner = this;
 		}
-	} else {
-		owner = this;
-	}
 
-	_propagate_pause_owner(owner);
+		_propagate_pause_owner(owner);
+	}
+	if (prev_can_process != can_process()) {
+		_propagate_pause_change_notification(can_process() ? NOTIFICATION_UNPAUSED : NOTIFICATION_PAUSED);
+	}
 }
 
 Node::PauseMode Node::get_pause_mode() const {
@@ -551,6 +553,16 @@ void Node::_propagate_pause_owner(Node *p_owner) {
 	}
 }
 
+void Node::_propagate_pause_change_notification(int p_notification) {
+	notification(p_notification);
+
+	for (int i = 0; i < data.children.size(); i++) {
+		if (data.children[i]->data.pause_mode == PAUSE_MODE_INHERIT) {
+			data.children[i]->_propagate_pause_change_notification(p_notification);
+		}
+	}
+}
+
 void Node::set_network_master(int p_peer_id, bool p_recursive) {
 	data.network_master = p_peer_id;
 

+ 1 - 0
scene/main/node.h

@@ -213,6 +213,7 @@ private:
 	void _print_stray_nodes();
 	void _propagate_pause_owner(Node *p_owner);
 	void _propagate_groups_dirty();
+	void _propagate_pause_change_notification(int p_notification);
 	Array _get_node_and_resource(const NodePath &p_path);
 
 	void _duplicate_signals(const Node *p_original, Node *p_copy) const;