From 0122e15611e1826a6b2e00049bd856f72841fc08 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 2 Jul 2018 12:14:23 +0200 Subject: [PATCH] node: improve scheduling --- src/pipewire/node.c | 33 ++++++++++++++++++--------------- src/pipewire/private.h | 6 +++--- src/pipewire/remote.c | 9 --------- 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/src/pipewire/node.c b/src/pipewire/node.c index 819c65ad1..2761cc95f 100644 --- a/src/pipewire/node.c +++ b/src/pipewire/node.c @@ -646,9 +646,8 @@ static void node_event(void *data, struct spa_event *event) spa_hook_list_call(&node->listener_list, struct pw_node_events, event, event); } -static void node_process(void *data, int status) +void pw_node_process(struct pw_node *node, int status) { - struct pw_node *node = data; struct impl *impl = SPA_CONTAINER_OF(node, struct impl, this); pw_log_trace("node %p: process driver:%d exported:%d", node, node->driver, node->exported); @@ -656,28 +655,32 @@ static void node_process(void *data, int status) spa_hook_list_call(&node->listener_list, struct pw_node_events, process); if (node->driver) { - if (!node->exported) { - if (node->rt.driver->state->pending == 0 || !node->remote) { - struct timespec ts; - struct pw_driver_quantum *q; - q = node->rt.quantum; + if (node->rt.driver->state->pending == 0 || !node->remote) { + struct timespec ts; + struct pw_driver_quantum *q; + q = node->rt.quantum; - q->position = impl->next_position; - impl->next_position += q->size; + q->position = impl->next_position; + impl->next_position += q->size; - clock_gettime(CLOCK_MONOTONIC, &ts); - q->nsec = ts.tv_sec * SPA_NSEC_PER_SEC + ts.tv_nsec; + clock_gettime(CLOCK_MONOTONIC, &ts); + q->nsec = ts.tv_sec * SPA_NSEC_PER_SEC + ts.tv_nsec; - spa_graph_run(node->rt.driver); - } - else - spa_graph_node_trigger(&node->rt.node); + spa_graph_run(node->rt.driver); } + else + spa_graph_node_trigger(&node->rt.node); } else spa_graph_node_trigger(&node->rt.node); } +static void node_process(void *data, int status) +{ + struct pw_node *node = data; + pw_node_process(node, status); +} + static void node_reuse_buffer(void *data, uint32_t port_id, uint32_t buffer_id) { struct pw_node *node = data; diff --git a/src/pipewire/private.h b/src/pipewire/private.h index 01e0d0456..9e4ddfa23 100644 --- a/src/pipewire/private.h +++ b/src/pipewire/private.h @@ -620,9 +620,9 @@ int pw_node_initialized(struct pw_node *node); int pw_node_set_driver(struct pw_node *node, struct pw_node *driver); -/** Activate a link \memberof pw_link - * Starts the negotiation of formats and buffers on \a link and then - * starts data streaming */ +void pw_node_process(struct pw_node *node, int status); + +/** starts streaming on a link */ int pw_link_activate(struct pw_link *link); /** Deactivate a link \memberof pw_link */ diff --git a/src/pipewire/remote.c b/src/pipewire/remote.c index a142fe491..b450ff907 100644 --- a/src/pipewire/remote.c +++ b/src/pipewire/remote.c @@ -504,14 +504,6 @@ static void unhandle_socket(struct node_data *data) do_remove_source, 1, NULL, 0, true, data); } -static void node_process(void *data) -{ - struct node_data *d = data; - uint64_t cmd = 1; - pw_log_trace("remote %p: send process", data); - write(d->rtwritefd, &cmd, 8); -} - static void node_finish(void *data) { struct node_data *d = data; @@ -1334,7 +1326,6 @@ static const struct pw_node_events node_events = { .destroy = node_destroy, .info_changed = node_info_changed, .active_changed = node_active_changed, - .process = node_process, .finish = node_finish, };