mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-12-23 08:56:47 -05:00
node: Use the work queue to cancel old operations
Keep track of the last state change and cancel the previous one if it's still busy.
This commit is contained in:
parent
af1cf3d87a
commit
6e77791c8e
1 changed files with 9 additions and 6 deletions
|
|
@ -46,6 +46,7 @@ struct impl {
|
||||||
struct pw_impl_node this;
|
struct pw_impl_node this;
|
||||||
|
|
||||||
enum pw_node_state pending;
|
enum pw_node_state pending;
|
||||||
|
uint32_t pending_id;
|
||||||
|
|
||||||
struct pw_work_queue *work;
|
struct pw_work_queue *work;
|
||||||
|
|
||||||
|
|
@ -1113,6 +1114,7 @@ struct pw_impl_node *pw_context_create_node(struct pw_context *context,
|
||||||
res = -errno;
|
res = -errno;
|
||||||
goto error_clean;
|
goto error_clean;
|
||||||
}
|
}
|
||||||
|
impl->pending_id = SPA_ID_INVALID;
|
||||||
|
|
||||||
this->data_loop = context->data_loop;
|
this->data_loop = context->data_loop;
|
||||||
|
|
||||||
|
|
@ -1866,8 +1868,7 @@ static void on_state_complete(void *obj, void *data, int res, uint32_t seq)
|
||||||
enum pw_node_state state = SPA_PTR_TO_INT(data);
|
enum pw_node_state state = SPA_PTR_TO_INT(data);
|
||||||
char *error = NULL;
|
char *error = NULL;
|
||||||
|
|
||||||
if (impl->pending != state)
|
impl->pending_id = SPA_ID_INVALID;
|
||||||
return;
|
|
||||||
|
|
||||||
pw_log_debug(NAME" %p: state complete res:%d seq:%d", node, res, seq);
|
pw_log_debug(NAME" %p: state complete res:%d seq:%d", node, res, seq);
|
||||||
if (impl->last_error < 0) {
|
if (impl->last_error < 0) {
|
||||||
|
|
@ -1956,12 +1957,14 @@ int pw_impl_node_set_state(struct pw_impl_node *node, enum pw_node_state state)
|
||||||
if (SPA_RESULT_IS_ASYNC(res)) {
|
if (SPA_RESULT_IS_ASYNC(res)) {
|
||||||
res = spa_node_sync(node->node, res);
|
res = spa_node_sync(node->node, res);
|
||||||
}
|
}
|
||||||
impl->pending = state;
|
|
||||||
|
|
||||||
if (old != state)
|
if (old != state) {
|
||||||
pw_work_queue_add(impl->work,
|
impl->pending = state;
|
||||||
|
if (impl->pending_id != SPA_ID_INVALID)
|
||||||
|
pw_work_queue_cancel(impl->work, node, impl->pending_id);
|
||||||
|
impl->pending_id = pw_work_queue_add(impl->work,
|
||||||
node, res, on_state_complete, SPA_INT_TO_PTR(state));
|
node, res, on_state_complete, SPA_INT_TO_PTR(state));
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue