mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-22 06:59:59 -05:00
graph: add new scheduler
Move the activation state to the graph Replace an old scheduler with a new one that works with the new activation states. Remove the DISABLED port flags, we explicitly add and remove to make ports enabled/disabled. Find first compatible port for link Remove the node based scheduler and use the spa one.
This commit is contained in:
parent
c547baf952
commit
6eea9247ea
15 changed files with 293 additions and 328 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-scheduler6.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
|
|||
|
|
@ -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-scheduler6.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
@ -116,9 +116,11 @@ struct data {
|
|||
struct spa_graph graph;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
struct spa_graph_port source_out;
|
||||
struct spa_graph_port sink_in;
|
||||
struct spa_graph_node sink_node;
|
||||
struct spa_graph_state sink_state;
|
||||
|
||||
struct spa_node *sink;
|
||||
|
||||
|
|
@ -396,13 +398,13 @@ static int make_nodes(struct data *data, const char *device)
|
|||
data->type.io.Buffers,
|
||||
&data->source_sink_io[0], sizeof(data->source_sink_io[0]));
|
||||
|
||||
spa_graph_node_init(&data->source_node);
|
||||
spa_graph_node_init(&data->source_node, &data->source_state);
|
||||
spa_graph_node_set_implementation(&data->source_node, data->source);
|
||||
spa_graph_node_add(&data->graph, &data->source_node);
|
||||
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);
|
||||
|
||||
spa_graph_node_init(&data->sink_node);
|
||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||
spa_graph_node_set_implementation(&data->sink_node, data->sink);
|
||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_sink_io[0]);
|
||||
|
|
|
|||
|
|
@ -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-scheduler6.h>
|
||||
#include <spa/graph/graph-scheduler1.h>
|
||||
|
||||
#include <lib/debug.h>
|
||||
|
||||
|
|
@ -109,12 +109,15 @@ struct data {
|
|||
struct spa_graph graph;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
struct spa_graph_port source_out;
|
||||
struct spa_graph_port volume_in;
|
||||
struct spa_graph_node volume_node;
|
||||
struct spa_graph_state volume_state;
|
||||
struct spa_graph_port volume_out;
|
||||
struct spa_graph_port sink_in;
|
||||
struct spa_graph_node sink_node;
|
||||
struct spa_graph_state sink_state;
|
||||
|
||||
struct spa_node *sink;
|
||||
struct spa_io_buffers volume_sink_io[1];
|
||||
|
|
@ -141,7 +144,7 @@ struct data {
|
|||
|
||||
#define MIN_LATENCY 64
|
||||
|
||||
#define BUFFER_SIZE MIN_LATENCY
|
||||
#define BUFFER_SIZE (MIN_LATENCY * sizeof(int16_t) * 2)
|
||||
|
||||
static void
|
||||
init_buffer(struct data *data, struct spa_buffer **bufs, struct buffer *ba, int n_buffers,
|
||||
|
|
@ -353,13 +356,13 @@ static int make_nodes(struct data *data, const char *device)
|
|||
data->type.io.Buffers,
|
||||
&data->volume_sink_io[0], sizeof(data->volume_sink_io[0]));
|
||||
|
||||
spa_graph_node_init(&data->source_node);
|
||||
spa_graph_node_init(&data->source_node, &data->source_state);
|
||||
spa_graph_node_set_implementation(&data->source_node, data->source);
|
||||
spa_graph_node_add(&data->graph, &data->source_node);
|
||||
spa_graph_port_init(&data->source_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source_volume_io[0]);
|
||||
spa_graph_port_add(&data->source_node, &data->source_out);
|
||||
|
||||
spa_graph_node_init(&data->volume_node);
|
||||
spa_graph_node_init(&data->volume_node, &data->volume_state);
|
||||
spa_graph_node_set_implementation(&data->volume_node, data->volume);
|
||||
spa_graph_node_add(&data->graph, &data->volume_node);
|
||||
spa_graph_port_init(&data->volume_in, SPA_DIRECTION_INPUT, 0, 0, &data->source_volume_io[0]);
|
||||
|
|
@ -370,7 +373,7 @@ static int make_nodes(struct data *data, const char *device)
|
|||
spa_graph_port_init(&data->volume_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->volume_sink_io[0]);
|
||||
spa_graph_port_add(&data->volume_node, &data->volume_out);
|
||||
|
||||
spa_graph_node_init(&data->sink_node);
|
||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||
spa_graph_node_set_implementation(&data->sink_node, data->sink);
|
||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->volume_sink_io[0]);
|
||||
|
|
|
|||
|
|
@ -170,11 +170,11 @@ static int make_graph1(struct data *data)
|
|||
{
|
||||
int v = start_write(data);
|
||||
|
||||
spa_graph_node_init(&data->source_node[v]);
|
||||
spa_graph_node_init(&data->source_node[v], NULL);
|
||||
spa_graph_node_add(&data->graph[v], &data->source_node[v]);
|
||||
spa_graph_port_add(&data->source_node[v], &data->source_out[v]);
|
||||
|
||||
spa_graph_node_init(&data->volume_node[v]);
|
||||
spa_graph_node_init(&data->volume_node[v], NULL);
|
||||
spa_graph_node_add(&data->graph[v], &data->volume_node[v]);
|
||||
spa_graph_port_add(&data->volume_node[v], &data->volume_in[v]);
|
||||
|
||||
|
|
@ -182,7 +182,7 @@ static int make_graph1(struct data *data)
|
|||
|
||||
spa_graph_port_add(&data->volume_node[v], &data->volume_out[v]);
|
||||
|
||||
spa_graph_node_init(&data->sink_node[v]);
|
||||
spa_graph_node_init(&data->sink_node[v], NULL);
|
||||
spa_graph_node_add(&data->graph[v], &data->sink_node[v]);
|
||||
spa_graph_port_add(&data->sink_node[v], &data->sink_in[v]);
|
||||
|
||||
|
|
|
|||
|
|
@ -117,14 +117,18 @@ struct data {
|
|||
struct spa_graph graph;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source1_node;
|
||||
struct spa_graph_state source1_state;
|
||||
struct spa_graph_port source1_out;
|
||||
struct spa_graph_node source2_node;
|
||||
struct spa_graph_state source2_state;
|
||||
struct spa_graph_port source2_out;
|
||||
struct spa_graph_port mix_in[2];
|
||||
struct spa_graph_node mix_node;
|
||||
struct spa_graph_state mix_state;
|
||||
struct spa_graph_port mix_out;
|
||||
struct spa_graph_port sink_in;
|
||||
struct spa_graph_node sink_node;
|
||||
struct spa_graph_state sink_state;
|
||||
|
||||
struct spa_node *sink;
|
||||
struct spa_io_buffers mix_sink_io[1];
|
||||
|
|
@ -157,7 +161,7 @@ struct data {
|
|||
unsigned int n_fds;
|
||||
};
|
||||
|
||||
#define MIN_LATENCY 64
|
||||
#define MIN_LATENCY 512
|
||||
|
||||
#define BUFFER_SIZE1 MIN_LATENCY
|
||||
#define BUFFER_SIZE2 MIN_LATENCY - 4
|
||||
|
|
@ -467,19 +471,19 @@ static int make_nodes(struct data *data, const char *device)
|
|||
|
||||
|
||||
#ifdef USE_GRAPH
|
||||
spa_graph_node_init(&data->source1_node);
|
||||
spa_graph_node_init(&data->source1_node, &data->source1_state);
|
||||
spa_graph_node_set_implementation(&data->source1_node, data->source1);
|
||||
spa_graph_port_init(&data->source1_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source1_mix_io[0]);
|
||||
spa_graph_port_add(&data->source1_node, &data->source1_out);
|
||||
spa_graph_node_add(&data->graph, &data->source1_node);
|
||||
|
||||
spa_graph_node_init(&data->source2_node);
|
||||
spa_graph_node_init(&data->source2_node, &data->source2_state);
|
||||
spa_graph_node_set_implementation(&data->source2_node, data->source2);
|
||||
spa_graph_port_init(&data->source2_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->source2_mix_io[0]);
|
||||
spa_graph_port_add(&data->source2_node, &data->source2_out);
|
||||
spa_graph_node_add(&data->graph, &data->source2_node);
|
||||
|
||||
spa_graph_node_init(&data->mix_node);
|
||||
spa_graph_node_init(&data->mix_node, &data->mix_state);
|
||||
spa_graph_node_set_implementation(&data->mix_node, data->mix);
|
||||
spa_graph_port_init(&data->mix_in[0], SPA_DIRECTION_INPUT,
|
||||
data->mix_ports[0], 0, &data->source1_mix_io[0]);
|
||||
|
|
@ -495,7 +499,7 @@ static int make_nodes(struct data *data, const char *device)
|
|||
spa_graph_port_init(&data->mix_out, SPA_DIRECTION_OUTPUT, 0, 0, &data->mix_sink_io[0]);
|
||||
spa_graph_port_add(&data->mix_node, &data->mix_out);
|
||||
|
||||
spa_graph_node_init(&data->sink_node);
|
||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||
spa_graph_node_set_implementation(&data->sink_node, data->sink);
|
||||
spa_graph_port_init(&data->sink_in, SPA_DIRECTION_INPUT, 0, 0, &data->mix_sink_io[0]);
|
||||
spa_graph_port_add(&data->sink_node, &data->sink_in);
|
||||
|
|
|
|||
|
|
@ -111,9 +111,11 @@ struct data {
|
|||
struct spa_graph graph;
|
||||
struct spa_graph_data graph_data;
|
||||
struct spa_graph_node source_node;
|
||||
struct spa_graph_state source_state;
|
||||
struct spa_graph_port source_out;
|
||||
struct spa_graph_port sink_in;
|
||||
struct spa_graph_node sink_node;
|
||||
struct spa_graph_state sink_state;
|
||||
|
||||
struct spa_node *sink;
|
||||
struct spa_io_buffers source_sink_io[1];
|
||||
|
|
@ -226,7 +228,6 @@ static int make_node(struct data *data, struct spa_node **node, const char *lib,
|
|||
static void on_sink_pull(struct data *data)
|
||||
{
|
||||
spa_log_trace(data->log, "do sink pull");
|
||||
data->sink_node.state = SPA_STATUS_NEED_BUFFER;
|
||||
if (data->mode & MODE_DIRECT) {
|
||||
spa_node_process_output(data->source);
|
||||
spa_node_process_input(data->sink);
|
||||
|
|
@ -373,7 +374,7 @@ static int make_nodes(struct data *data)
|
|||
data->type.io.Buffers,
|
||||
&data->source_sink_io[0], sizeof(data->source_sink_io[0]));
|
||||
|
||||
spa_graph_node_init(&data->source_node);
|
||||
spa_graph_node_init(&data->source_node, &data->source_state);
|
||||
spa_graph_node_set_implementation(&data->source_node, data->source);
|
||||
spa_graph_node_add(&data->graph, &data->source_node);
|
||||
|
||||
|
|
@ -381,7 +382,7 @@ static int make_nodes(struct data *data)
|
|||
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);
|
||||
|
||||
spa_graph_node_init(&data->sink_node);
|
||||
spa_graph_node_init(&data->sink_node, &data->sink_state);
|
||||
spa_graph_node_set_implementation(&data->sink_node, data->sink);
|
||||
spa_graph_node_add(&data->graph, &data->sink_node);
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue