mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
scheduling: don't use the graph helpers.
Simplify the scheduling by using simple lists and removing the subgraphs etc.. Make the driver node trigger all nodes it manages and when they complete, trigger the driver node to finish the graph.
This commit is contained in:
parent
f0eb59bc75
commit
b357b7a7da
8 changed files with 231 additions and 264 deletions
|
|
@ -1598,18 +1598,13 @@ static const struct pw_resource_events resource_events = {
|
|||
.pong = client_node_resource_pong,
|
||||
};
|
||||
|
||||
static int root_impl_process(void *data, struct spa_graph_node *node)
|
||||
static int process_node(void *data)
|
||||
{
|
||||
struct impl *impl = data;
|
||||
pw_log_trace("client-node %p: process", impl);
|
||||
return spa_node_process(&impl->node.node);
|
||||
}
|
||||
|
||||
static const struct spa_graph_node_callbacks root_impl = {
|
||||
SPA_VERSION_GRAPH_NODE_CALLBACKS,
|
||||
.process = root_impl_process,
|
||||
};
|
||||
|
||||
/** Create a new client node
|
||||
* \param client an owner \ref pw_client
|
||||
* \param id an id
|
||||
|
|
@ -1672,7 +1667,8 @@ struct pw_client_node *pw_client_node_new(struct pw_resource *resource,
|
|||
this->node->remote = true;
|
||||
this->flags = 0;
|
||||
|
||||
spa_graph_node_set_callbacks(&this->node->rt.root, &root_impl, this);
|
||||
this->node->rt.target.signal = process_node;
|
||||
this->node->rt.target.data = impl;
|
||||
|
||||
pw_resource_add_listener(this->resource,
|
||||
&impl->resource_listener,
|
||||
|
|
|
|||
|
|
@ -858,7 +858,7 @@ static int impl_node_process(struct spa_node *node)
|
|||
trigger = status & SPA_STATUS_HAVE_BUFFER;
|
||||
|
||||
if (trigger && !impl->this.node->driver)
|
||||
spa_graph_node_process(&impl->client_node->node->rt.root);
|
||||
impl->client_node->node->rt.target.signal(impl->client_node->node->rt.target.data);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
|
@ -1173,34 +1173,11 @@ static void node_initialized(void *data)
|
|||
pw_client_node_registered(impl->client_node, impl->this.node->global->id);
|
||||
}
|
||||
|
||||
static void node_peer_added(void *data, struct pw_node *peer)
|
||||
{
|
||||
struct impl *impl = data;
|
||||
pw_node_emit_peer_added(impl->client_node->node, peer);
|
||||
}
|
||||
|
||||
static void node_peer_removed(void *data, struct pw_node *peer)
|
||||
{
|
||||
struct impl *impl = data;
|
||||
pw_node_emit_peer_removed(impl->client_node->node, peer);
|
||||
}
|
||||
|
||||
static void node_driver_changed(void *data, struct pw_node *old, struct pw_node *driver)
|
||||
{
|
||||
struct impl *impl = data;
|
||||
pw_log_debug("client-stream %p: driver changed %p->%p", &impl->this, old, driver);
|
||||
impl->client_node->node->driver_node = driver;
|
||||
pw_node_emit_driver_changed(impl->client_node->node, old, driver);
|
||||
}
|
||||
|
||||
static const struct pw_node_events node_events = {
|
||||
PW_VERSION_NODE_EVENTS,
|
||||
.destroy = node_destroy,
|
||||
.free = node_free,
|
||||
.initialized = node_initialized,
|
||||
.peer_added = node_peer_added,
|
||||
.peer_removed = node_peer_removed,
|
||||
.driver_changed = node_driver_changed,
|
||||
};
|
||||
|
||||
/** Create a new client stream
|
||||
|
|
|
|||
|
|
@ -79,8 +79,7 @@ struct mix {
|
|||
};
|
||||
|
||||
struct link {
|
||||
struct spa_graph_link link;
|
||||
struct pw_node_activation *activation;
|
||||
struct pw_node_target target;
|
||||
int signalfd;
|
||||
uint32_t mem_id;
|
||||
};
|
||||
|
|
@ -154,7 +153,7 @@ on_rtsocket_condition(void *user_data, int fd, enum spa_io mask)
|
|||
|
||||
pw_log_trace("remote %p: process %p", data->remote, proxy);
|
||||
|
||||
spa_graph_node_process(&data->node->rt.root);
|
||||
data->node->rt.target.signal(data->node->rt.target.data);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -269,7 +268,7 @@ do_deactivate_mix(struct spa_loop *loop,
|
|||
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||
{
|
||||
struct mix *mix = user_data;
|
||||
spa_graph_port_remove(&mix->mix.port);
|
||||
spa_list_remove(&mix->mix.rt_link);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -290,7 +289,8 @@ do_activate_mix(struct spa_loop *loop,
|
|||
bool async, uint32_t seq, const void *data, size_t size, void *user_data)
|
||||
{
|
||||
struct mix *mix = user_data;
|
||||
spa_graph_port_add(&mix->port->rt.mix_node, &mix->mix.port);
|
||||
|
||||
spa_list_append(&mix->port->rt.mix_list, &mix->mix.rt_link);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -985,15 +985,14 @@ client_node_set_activation(void *object,
|
|||
if (ptr) {
|
||||
struct link *link;
|
||||
link = pw_array_add(&data->links, sizeof(struct link));
|
||||
link->activation = ptr;
|
||||
link->target.activation = ptr;
|
||||
link->signalfd = signalfd;
|
||||
link->link.signal = link_signal_func;
|
||||
link->link.signal_data = link;
|
||||
spa_graph_link_add(&node->rt.root, &link->activation->state[0], &link->link);
|
||||
link->link.state->required--;
|
||||
link->target.signal = link_signal_func;
|
||||
link->target.data = link;
|
||||
link->target.activation->state[0].required--;
|
||||
pw_log_debug("node %p: required %d, pending %d", node,
|
||||
link->link.state->required,
|
||||
link->link.state->pending);
|
||||
link->target.activation->state[0].required,
|
||||
link->target.activation->state[0].pending);
|
||||
} else {
|
||||
}
|
||||
|
||||
|
|
@ -1149,9 +1148,6 @@ static int node_ready(void *d, int status)
|
|||
pw_log_trace("node %p: ready driver:%d exported:%d status:%d", node,
|
||||
node->driver, node->exported, status);
|
||||
|
||||
if (status == SPA_STATUS_HAVE_BUFFER)
|
||||
spa_graph_node_process(&node->rt.root);
|
||||
|
||||
if (write(data->rtwritefd, &cmd, sizeof(cmd)) != sizeof(cmd))
|
||||
pw_log_warn("node %p: write failed %m", node);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue