mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-14 06:59:57 -05:00
node: improve states
Only change state when different
This commit is contained in:
parent
f5cf90ccd1
commit
6b10b0784f
1 changed files with 28 additions and 25 deletions
|
|
@ -1021,6 +1021,9 @@ int pw_node_set_state(struct pw_node *node, enum pw_node_state state)
|
||||||
int res = 0;
|
int res = 0;
|
||||||
struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this);
|
struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this);
|
||||||
|
|
||||||
|
if (node->info.state == state)
|
||||||
|
return 0;
|
||||||
|
|
||||||
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state);
|
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_request, state);
|
||||||
|
|
||||||
pw_log_debug("node %p: set state %s", node, pw_node_state_as_string(state));
|
pw_log_debug("node %p: set state %s", node, pw_node_state_as_string(state));
|
||||||
|
|
@ -1072,37 +1075,37 @@ void pw_node_update_state(struct pw_node *node, enum pw_node_state state, char *
|
||||||
{
|
{
|
||||||
struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this);
|
struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this);
|
||||||
enum pw_node_state old;
|
enum pw_node_state old;
|
||||||
|
struct pw_resource *resource;
|
||||||
|
|
||||||
old = node->info.state;
|
old = node->info.state;
|
||||||
if (old != state) {
|
if (old == state)
|
||||||
struct pw_resource *resource;
|
return;
|
||||||
|
|
||||||
pw_log_debug("node %p: update state from %s -> %s", node,
|
pw_log_debug("node %p: update state from %s -> %s", node,
|
||||||
pw_node_state_as_string(old), pw_node_state_as_string(state));
|
pw_node_state_as_string(old), pw_node_state_as_string(state));
|
||||||
|
|
||||||
if (node->info.error)
|
if (node->info.error)
|
||||||
free((char*)node->info.error);
|
free((char*)node->info.error);
|
||||||
node->info.error = error;
|
node->info.error = error;
|
||||||
node->info.state = state;
|
node->info.state = state;
|
||||||
|
|
||||||
if (state == PW_NODE_STATE_IDLE) {
|
if (state == PW_NODE_STATE_IDLE) {
|
||||||
if (impl->pause_on_idle)
|
if (impl->pause_on_idle)
|
||||||
do_pause_node(node);
|
do_pause_node(node);
|
||||||
node_deactivate(node);
|
node_deactivate(node);
|
||||||
}
|
|
||||||
|
|
||||||
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_changed,
|
|
||||||
old, state, error);
|
|
||||||
|
|
||||||
node->info.change_mask |= PW_NODE_CHANGE_MASK_STATE;
|
|
||||||
spa_hook_list_call(&node->listener_list, struct pw_node_events,
|
|
||||||
info_changed, &node->info);
|
|
||||||
|
|
||||||
spa_list_for_each(resource, &node->resource_list, link)
|
|
||||||
pw_node_resource_info(resource, &node->info);
|
|
||||||
|
|
||||||
node->info.change_mask = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
spa_hook_list_call(&node->listener_list, struct pw_node_events, state_changed,
|
||||||
|
old, state, error);
|
||||||
|
|
||||||
|
node->info.change_mask |= PW_NODE_CHANGE_MASK_STATE;
|
||||||
|
spa_hook_list_call(&node->listener_list, struct pw_node_events,
|
||||||
|
info_changed, &node->info);
|
||||||
|
|
||||||
|
spa_list_for_each(resource, &node->resource_list, link)
|
||||||
|
pw_node_resource_info(resource, &node->info);
|
||||||
|
|
||||||
|
node->info.change_mask = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pw_node_set_active(struct pw_node *node, bool active)
|
int pw_node_set_active(struct pw_node *node, bool active)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue