diff --git a/spa/lib/control.c b/spa/lib/control.c index a92e2e752..c3ad82efb 100644 --- a/spa/lib/control.c +++ b/spa/lib/control.c @@ -394,6 +394,21 @@ parse_format (SpaMemory *mem, void *p, off_t offset) return f; } +static void +iter_parse_node_update (struct stack_iter *si, SpaControlCmdNodeUpdate *nu) +{ + void *p; + SpaMemory *mem; + + memcpy (nu, si->data, sizeof (SpaControlCmdNodeUpdate)); + + mem = spa_memory_alloc_size (SPA_MEMORY_POOL_LOCAL, si->data, si->size); + p = spa_memory_ensure_ptr (mem); + + if (nu->props) + nu->props = parse_props (mem, p, SPA_PTR_TO_INT (nu->props)); +} + static void iter_parse_port_update (struct stack_iter *si, SpaControlCmdPortUpdate *pu) { @@ -447,7 +462,7 @@ spa_control_iter_parse_cmd (SpaControlIter *iter, switch (si->cmd) { /* C -> S */ case SPA_CONTROL_CMD_NODE_UPDATE: - fprintf (stderr, "implement iter of %d\n", si->cmd); + iter_parse_node_update (si, command); break; case SPA_CONTROL_CMD_PORT_UPDATE: @@ -930,6 +945,30 @@ write_format (void *p, const SpaFormat *format) return write_props (p, &format->props, sizeof (SpaFormat)); } +static void +builder_add_node_update (struct stack_builder *sb, SpaControlCmdNodeUpdate *nu) +{ + size_t len; + void *p, *base; + SpaControlCmdNodeUpdate *d; + + /* calc len */ + len = sizeof (SpaControlCmdNodeUpdate); + len += calc_props_len (nu->props); + + base = builder_add_cmd (sb, SPA_CONTROL_CMD_NODE_UPDATE, len); + memcpy (base, nu, sizeof (SpaControlCmdNodeUpdate)); + d = base; + + p = SPA_MEMBER (d, sizeof (SpaControlCmdNodeUpdate), void); + if (nu->props) { + len = write_props (p, nu->props, sizeof (SpaProps)); + d->props = SPA_INT_TO_PTR (SPA_PTRDIFF (p, base)); + } else { + d->props = 0; + } +} + static void builder_add_port_update (struct stack_builder *sb, SpaControlCmdPortUpdate *pu) { @@ -974,7 +1013,6 @@ builder_add_port_update (struct stack_builder *sb, SpaControlCmdPortUpdate *pu) /* FIXME add more things */ } - static void builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf) { @@ -1018,7 +1056,7 @@ spa_control_builder_add_cmd (SpaControlBuilder *builder, switch (cmd) { /* C -> S */ case SPA_CONTROL_CMD_NODE_UPDATE: - fprintf (stderr, "implement builder of %d\n", cmd); + builder_add_node_update (sb, command); break; case SPA_CONTROL_CMD_PORT_UPDATE: diff --git a/spa/plugins/remote/proxy.c b/spa/plugins/remote/proxy.c index 0cfc030bc..81551ce8f 100644 --- a/spa/plugins/remote/proxy.c +++ b/spa/plugins/remote/proxy.c @@ -73,7 +73,9 @@ struct _SpaProxy { SpaPollFd fds[1]; SpaPollItem poll; + unsigned int max_inputs; unsigned int n_inputs; + unsigned int max_outputs; unsigned int n_outputs; SpaProxyPort ports[MAX_PORTS]; }; @@ -293,9 +295,9 @@ spa_proxy_node_get_n_ports (SpaNode *node, if (n_output_ports) *n_output_ports = this->n_outputs; if (max_input_ports) - *max_input_ports = MAX_INPUTS; + *max_input_ports = this->max_inputs; if (max_output_ports) - *max_output_ports = MAX_OUTPUTS; + *max_output_ports = this->max_outputs; return SPA_RESULT_OK; } @@ -914,11 +916,23 @@ parse_control (SpaProxy *this, fprintf (stderr, "proxy %p: got unexpected control %d\n", this, cmd); break; - case SPA_CONTROL_CMD_NODE_UPDATE: case SPA_CONTROL_CMD_PORT_REMOVED: fprintf (stderr, "proxy %p: command not implemented %d\n", this, cmd); break; + case SPA_CONTROL_CMD_NODE_UPDATE: + { + SpaControlCmdNodeUpdate nu; + + fprintf (stderr, "proxy %p: got node update %d\n", this, cmd); + if (spa_control_iter_parse_cmd (&it, &nu) < 0) + break; + + this->max_inputs = nu.max_input_ports; + this->max_outputs = nu.max_output_ports; + break; + } + case SPA_CONTROL_CMD_PORT_UPDATE: { SpaControlCmdPortUpdate pu;