Add example to play sine wave

Various build fixes and cleanups
Move port_add to private and make node ports based on implementation.
Improve pull based scheduling on remote nodes
This commit is contained in:
Wim Taymans 2017-09-07 10:22:32 +02:00
parent 36ac8a6545
commit 21cd5a2918
26 changed files with 640 additions and 185 deletions

View file

@ -67,14 +67,12 @@ struct data {
SDL_Window *window;
SDL_Texture *texture;
bool running;
struct pw_loop *loop;
struct pw_main_loop *loop;
struct spa_source *timer;
struct pw_core *core;
struct pw_type *t;
struct pw_node *node;
struct pw_port *port;
struct spa_port_info port_info;
struct pw_node *v4l2;
@ -105,7 +103,7 @@ static void handle_events(struct data *data)
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
data->running = false;
pw_main_loop_quit(data->loop);
break;
}
}
@ -199,6 +197,28 @@ static int impl_set_callbacks(struct spa_node *node,
return SPA_RESULT_OK;
}
static int impl_get_n_ports(struct spa_node *node,
uint32_t *n_input_ports,
uint32_t *max_input_ports,
uint32_t *n_output_ports,
uint32_t *max_output_ports)
{
*n_input_ports = *max_input_ports = 1;
*n_output_ports = *max_output_ports = 0;
return SPA_RESULT_OK;
}
static int impl_get_port_ids(struct spa_node *node,
uint32_t n_input_ports,
uint32_t *input_ids,
uint32_t n_output_ports,
uint32_t *output_ids)
{
if (n_input_ports > 0)
input_ids[0] = 0;
return SPA_RESULT_OK;
}
static int impl_port_set_io(struct spa_node *node, enum spa_direction direction, uint32_t port_id,
struct spa_port_io *io)
{
@ -414,6 +434,8 @@ static const struct spa_node impl_node = {
NULL,
.send_command = impl_send_command,
.set_callbacks = impl_set_callbacks,
.get_n_ports = impl_get_n_ports,
.get_port_ids = impl_get_port_ids,
.port_set_io = impl_port_set_io,
.port_enum_formats = impl_port_enum_formats,
.port_set_format = impl_port_set_format,
@ -432,8 +454,6 @@ static void make_nodes(struct data *data)
data->impl_node = impl_node;
pw_node_set_implementation(data->node, &data->impl_node);
data->port = pw_port_new(PW_DIRECTION_INPUT, 0, NULL, 0);
pw_port_add(data->port, data->node);
pw_node_register(data->node);
factory = pw_core_find_node_factory(data->core, "spa-node-factory");
@ -444,7 +464,7 @@ static void make_nodes(struct data *data)
data->link = pw_link_new(data->core,
NULL,
pw_node_get_free_port(data->v4l2, PW_DIRECTION_OUTPUT),
data->port,
pw_node_find_port(data->node, PW_DIRECTION_INPUT, 0),
NULL,
NULL,
NULL,
@ -458,9 +478,8 @@ int main(int argc, char *argv[])
pw_init(&argc, &argv);
data.loop = pw_loop_new(NULL);
data.running = true;
data.core = pw_core_new(data.loop, NULL);
data.loop = pw_main_loop_new(NULL);
data.core = pw_core_new(pw_main_loop_get_loop(data.loop), NULL);
data.t = pw_core_get_type(data.core);
pw_module_load(data.core, "libpipewire-module-spa-node-factory", NULL);
@ -482,16 +501,12 @@ int main(int argc, char *argv[])
make_nodes(&data);
pw_loop_enter(data.loop);
while (data.running) {
pw_loop_iterate(data.loop, 100);
}
pw_loop_leave(data.loop);
pw_main_loop_run(data.loop);
pw_link_destroy(data.link);
pw_node_destroy(data.node);
pw_core_destroy(data.core);
pw_loop_destroy(data.loop);
pw_main_loop_destroy(data.loop);
return 0;
}