mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-23 06:59:58 -05:00
graph: new scheduling model
Make explicit links between elements that are used to activate the next element in the graph. Make subgraphs a special regular node. Make a link from the subgraph children to the parent so that the subgraph completes when all the children completed. Implement a single process function in plugins Remove many messages in the client node
This commit is contained in:
parent
9b0a880afb
commit
33a322b96e
36 changed files with 401 additions and 750 deletions
|
|
@ -48,7 +48,7 @@ static struct spa_log *logger;
|
|||
#define spa_debug(f,...) spa_log_trace(logger, f, __VA_ARGS__)
|
||||
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
@ -117,6 +117,7 @@ struct data {
|
|||
struct spa_monitor *monitor;
|
||||
|
||||
struct spa_graph graph;
|
||||
struct spa_graph_state graph_state;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_port source_out;
|
||||
|
|
@ -305,7 +306,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
data.monitor = iface;
|
||||
|
||||
spa_graph_init(&data.graph);
|
||||
spa_graph_init(&data.graph, &data.graph_state);
|
||||
spa_graph_data_init(&data.graph_data, &data.graph);
|
||||
spa_graph_set_callbacks(&data.graph, &spa_graph_impl_default, &data.graph_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ static SPA_LOG_IMPL(default_log);
|
|||
#define spa_debug(f,...) spa_log_trace(&default_log.log, f, __VA_ARGS__)
|
||||
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
@ -114,6 +114,7 @@ struct data {
|
|||
uint32_t n_support;
|
||||
|
||||
struct spa_graph graph;
|
||||
struct spa_graph_state graph_state;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
|
|
@ -255,13 +256,13 @@ static void update_props(struct data *data)
|
|||
data->volume_accum -= M_PI_M2;
|
||||
}
|
||||
|
||||
static void on_sink_need_input(void *_data)
|
||||
static void on_sink_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
|
||||
update_props(data);
|
||||
|
||||
spa_graph_need_input(&data->graph, &data->sink_node);
|
||||
spa_graph_node_process(&data->sink_node);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
@ -276,7 +277,7 @@ static const struct spa_node_callbacks sink_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_sink_done,
|
||||
.event = on_sink_event,
|
||||
.need_input = on_sink_need_input,
|
||||
.process = on_sink_process,
|
||||
.reuse_buffer = on_sink_reuse_buffer
|
||||
};
|
||||
|
||||
|
|
@ -564,7 +565,7 @@ int main(int argc, char *argv[])
|
|||
int res;
|
||||
const char *str;
|
||||
|
||||
spa_graph_init(&data.graph);
|
||||
spa_graph_init(&data.graph, &data.graph_state);
|
||||
spa_graph_data_init(&data.graph_data, &data.graph);
|
||||
spa_graph_set_callbacks(&data.graph, &spa_graph_impl_default, &data.graph_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -42,7 +42,7 @@ static SPA_LOG_IMPL(default_log);
|
|||
#define spa_debug(f,...) spa_log_trace(&default_log.log, f, __VA_ARGS__)
|
||||
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
@ -107,6 +107,7 @@ struct data {
|
|||
uint32_t n_support;
|
||||
|
||||
struct spa_graph graph;
|
||||
struct spa_graph_state graph_state;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
|
|
@ -239,17 +240,16 @@ static void on_sink_event(void *data, struct spa_event *event)
|
|||
printf("got event %d\n", SPA_EVENT_TYPE(event));
|
||||
}
|
||||
|
||||
static void on_sink_need_input(void *_data)
|
||||
static void on_sink_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
spa_graph_need_input(&data->graph, &data->sink_node);
|
||||
spa_graph_node_process(&data->sink_node);
|
||||
}
|
||||
|
||||
static void
|
||||
on_sink_reuse_buffer(void *_data, uint32_t port_id, uint32_t buffer_id)
|
||||
{
|
||||
struct data *data = _data;
|
||||
|
||||
data->volume_sink_io[0].buffer_id = buffer_id;
|
||||
}
|
||||
|
||||
|
|
@ -257,7 +257,7 @@ static const struct spa_node_callbacks sink_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_sink_done,
|
||||
.event = on_sink_event,
|
||||
.need_input = on_sink_need_input,
|
||||
.process = on_sink_process,
|
||||
.reuse_buffer = on_sink_reuse_buffer
|
||||
};
|
||||
|
||||
|
|
@ -557,7 +557,7 @@ int main(int argc, char *argv[])
|
|||
int res;
|
||||
const char *str;
|
||||
|
||||
spa_graph_init(&data.graph);
|
||||
spa_graph_init(&data.graph, &data.graph_state);
|
||||
spa_graph_data_init(&data.graph_data, &data.graph);
|
||||
spa_graph_set_callbacks(&data.graph, &spa_graph_impl_default, &data.graph_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -35,7 +35,7 @@
|
|||
#include <spa/param/audio/format-utils.h>
|
||||
#include <spa/param/format-utils.h>
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
static SPA_TYPE_MAP_IMPL(default_map, 4096);
|
||||
static SPA_LOG_IMPL(default_log);
|
||||
|
|
@ -63,6 +63,7 @@ struct data {
|
|||
int writers;
|
||||
struct version version;
|
||||
struct spa_graph graph[2];
|
||||
struct spa_graph_state graph_state[2];
|
||||
|
||||
struct spa_graph_node source_node[2];
|
||||
struct spa_graph_port source_out[2];
|
||||
|
|
@ -229,8 +230,8 @@ int main(int argc, char *argv[])
|
|||
struct data data = { NULL };
|
||||
const char *str;
|
||||
|
||||
spa_graph_init(&data.graph[0]);
|
||||
spa_graph_init(&data.graph[1]);
|
||||
spa_graph_init(&data.graph[0], &data.graph_state[0]);
|
||||
spa_graph_init(&data.graph[1], &data.graph_state[1]);
|
||||
|
||||
data.map = &default_map.map;
|
||||
data.log = &default_log.log;
|
||||
|
|
|
|||
|
|
@ -50,7 +50,7 @@ static SPA_LOG_IMPL(default_log);
|
|||
#define spa_debug(...) spa_log_trace(&default_log.log,__VA_ARGS__)
|
||||
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
struct type {
|
||||
uint32_t node;
|
||||
|
|
@ -115,6 +115,7 @@ struct data {
|
|||
uint32_t n_support;
|
||||
|
||||
struct spa_graph graph;
|
||||
struct spa_graph_state graph_state;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source1_node;
|
||||
struct spa_graph_state source1_state;
|
||||
|
|
@ -269,12 +270,12 @@ static void update_props(struct data *data)
|
|||
data->ctrl_volume[1].value = 1.0 - data->ctrl_volume[0].value;
|
||||
}
|
||||
|
||||
static void on_sink_need_input(void *_data)
|
||||
static void on_sink_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
|
||||
#ifdef USE_GRAPH
|
||||
spa_graph_need_input(&data->graph, &data->sink_node);
|
||||
spa_graph_node_process(&data->sink_node);
|
||||
#else
|
||||
int res;
|
||||
|
||||
|
|
@ -322,7 +323,7 @@ static const struct spa_node_callbacks sink_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_sink_done,
|
||||
.event = on_sink_event,
|
||||
.need_input = &on_sink_need_input,
|
||||
.process = &on_sink_process,
|
||||
.reuse_buffer = on_sink_reuse_buffer
|
||||
};
|
||||
|
||||
|
|
@ -717,7 +718,7 @@ int main(int argc, char *argv[])
|
|||
data.data_loop.remove_source = do_remove_source;
|
||||
data.data_loop.invoke = do_invoke;
|
||||
|
||||
spa_graph_init(&data.graph);
|
||||
spa_graph_init(&data.graph, &data.graph_state);
|
||||
spa_graph_data_init(&data.graph_data, &data.graph);
|
||||
spa_graph_set_callbacks(&data.graph, &spa_graph_impl_default, &data.graph_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -36,7 +36,7 @@
|
|||
#include <spa/param/audio/format-utils.h>
|
||||
#include <spa/param/format-utils.h>
|
||||
#include <spa/graph/graph.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
#include <spa/graph/graph-scheduler2.h>
|
||||
|
||||
#define MODE_SYNC_PUSH (1<<0)
|
||||
#define MODE_SYNC_PULL (1<<1)
|
||||
|
|
@ -109,6 +109,7 @@ struct data {
|
|||
int iterations;
|
||||
|
||||
struct spa_graph graph;
|
||||
struct spa_graph_state graph_state;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
|
|
@ -232,7 +233,7 @@ static void on_sink_pull(struct data *data)
|
|||
spa_node_process(data->source);
|
||||
spa_node_process(data->sink);
|
||||
} else {
|
||||
spa_graph_need_input(&data->graph, &data->sink_node);
|
||||
spa_graph_node_trigger(&data->sink_node);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -243,7 +244,7 @@ static void on_source_push(struct data *data)
|
|||
spa_node_process(data->source);
|
||||
spa_node_process(data->sink);
|
||||
} else {
|
||||
spa_graph_have_output(&data->graph, &data->source_node);
|
||||
spa_graph_node_trigger(&data->source_node);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -259,7 +260,7 @@ static void on_sink_event(void *_data, struct spa_event *event)
|
|||
spa_log_trace(data->log, "got sink event %d", SPA_EVENT_TYPE(event));
|
||||
}
|
||||
|
||||
static void on_sink_need_input(void *_data)
|
||||
static void on_sink_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
spa_log_trace(data->log, "need input");
|
||||
|
|
@ -280,7 +281,7 @@ static const struct spa_node_callbacks sink_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_sink_done,
|
||||
.event = on_sink_event,
|
||||
.need_input = on_sink_need_input,
|
||||
.process = on_sink_process,
|
||||
.reuse_buffer = on_sink_reuse_buffer
|
||||
};
|
||||
|
||||
|
|
@ -296,7 +297,7 @@ static void on_source_event(void *_data, struct spa_event *event)
|
|||
spa_log_trace(data->log, "got source event %d", SPA_EVENT_TYPE(event));
|
||||
}
|
||||
|
||||
static void on_source_have_output(void *_data)
|
||||
static void on_source_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
spa_log_trace(data->log, "have_output");
|
||||
|
|
@ -309,7 +310,7 @@ static const struct spa_node_callbacks source_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_source_done,
|
||||
.event = on_source_event,
|
||||
.have_output = on_source_have_output
|
||||
.process = on_source_process
|
||||
};
|
||||
|
||||
|
||||
|
|
@ -378,7 +379,6 @@ static int make_nodes(struct data *data)
|
|||
spa_graph_node_set_callbacks(&data->source_node, &spa_graph_node_impl_default, data->source);
|
||||
spa_graph_node_add(&data->graph, &data->source_node);
|
||||
|
||||
data->source_node.flags = (data->mode & MODE_ASYNC_PUSH) ? SPA_GRAPH_NODE_FLAG_ASYNC : 0;
|
||||
spa_graph_port_init( &data->source_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source_sink_io[0]);
|
||||
spa_graph_port_add(&data->source_node, &data->source_out);
|
||||
|
||||
|
|
@ -386,7 +386,6 @@ static int make_nodes(struct data *data)
|
|||
spa_graph_node_set_callbacks(&data->sink_node, &spa_graph_node_impl_default, data->sink);
|
||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||
|
||||
data->sink_node.flags = (data->mode & MODE_ASYNC_PULL) ? SPA_GRAPH_NODE_FLAG_ASYNC : 0;
|
||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_sink_io[0]);
|
||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||
|
||||
|
|
@ -545,7 +544,7 @@ int main(int argc, char *argv[])
|
|||
int res;
|
||||
const char *str;
|
||||
|
||||
spa_graph_init(&data.graph);
|
||||
spa_graph_init(&data.graph, &data.graph_state);
|
||||
spa_graph_data_init(&data.graph_data, &data.graph);
|
||||
spa_graph_set_callbacks(&data.graph, &spa_graph_impl_default, &data.graph_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -214,7 +214,7 @@ static void on_sink_event(void *data, struct spa_event *event)
|
|||
printf("got event %d\n", SPA_EVENT_TYPE(event));
|
||||
}
|
||||
|
||||
static void on_sink_need_input(void *_data)
|
||||
static void on_sink_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
int res;
|
||||
|
|
@ -222,7 +222,6 @@ static void on_sink_need_input(void *_data)
|
|||
res = spa_node_process(data->source);
|
||||
if (res != SPA_STATUS_HAVE_BUFFER)
|
||||
printf("got process error from source %d\n", res);
|
||||
|
||||
if ((res = spa_node_process(data->sink)) < 0)
|
||||
printf("got process error from sink %d\n", res);
|
||||
}
|
||||
|
|
@ -240,7 +239,7 @@ static const struct spa_node_callbacks sink_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_sink_done,
|
||||
.event = on_sink_event,
|
||||
.need_input = on_sink_need_input,
|
||||
.process = on_sink_process,
|
||||
.reuse_buffer = on_sink_reuse_buffer
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -198,7 +198,7 @@ static void on_source_event(void *_data, struct spa_event *event)
|
|||
printf("got event %d\n", SPA_EVENT_TYPE(event));
|
||||
}
|
||||
|
||||
static void on_source_have_output(void *_data)
|
||||
static void on_source_process(void *_data, int status)
|
||||
{
|
||||
struct data *data = _data;
|
||||
int res;
|
||||
|
|
@ -284,7 +284,7 @@ static const struct spa_node_callbacks source_callbacks = {
|
|||
SPA_VERSION_NODE_CALLBACKS,
|
||||
.done = on_source_done,
|
||||
.event = on_source_event,
|
||||
.have_output = on_source_have_output
|
||||
.process = on_source_process
|
||||
};
|
||||
|
||||
static int do_add_source(struct spa_loop *loop, struct spa_source *source)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue