mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	add node-update support
This commit is contained in:
		
							parent
							
								
									45ee7b4490
								
							
						
					
					
						commit
						55c3262a6a
					
				
					 2 changed files with 58 additions and 6 deletions
				
			
		| 
						 | 
					@ -394,6 +394,21 @@ parse_format (SpaMemory *mem, void *p, off_t offset)
 | 
				
			||||||
  return f;
 | 
					  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
 | 
					static void
 | 
				
			||||||
iter_parse_port_update (struct stack_iter *si, SpaControlCmdPortUpdate *pu)
 | 
					iter_parse_port_update (struct stack_iter *si, SpaControlCmdPortUpdate *pu)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -447,7 +462,7 @@ spa_control_iter_parse_cmd (SpaControlIter *iter,
 | 
				
			||||||
  switch (si->cmd) {
 | 
					  switch (si->cmd) {
 | 
				
			||||||
    /* C -> S */
 | 
					    /* C -> S */
 | 
				
			||||||
    case SPA_CONTROL_CMD_NODE_UPDATE:
 | 
					    case SPA_CONTROL_CMD_NODE_UPDATE:
 | 
				
			||||||
      fprintf (stderr, "implement iter of %d\n", si->cmd);
 | 
					      iter_parse_node_update (si, command);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case SPA_CONTROL_CMD_PORT_UPDATE:
 | 
					    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));
 | 
					  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
 | 
					static void
 | 
				
			||||||
builder_add_port_update (struct stack_builder *sb, SpaControlCmdPortUpdate *pu)
 | 
					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 */
 | 
					  /* FIXME add more things */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
static void
 | 
					static void
 | 
				
			||||||
builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
 | 
					builder_add_set_format (struct stack_builder *sb, SpaControlCmdSetFormat *sf)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -1018,7 +1056,7 @@ spa_control_builder_add_cmd (SpaControlBuilder *builder,
 | 
				
			||||||
  switch (cmd) {
 | 
					  switch (cmd) {
 | 
				
			||||||
    /* C -> S */
 | 
					    /* C -> S */
 | 
				
			||||||
    case SPA_CONTROL_CMD_NODE_UPDATE:
 | 
					    case SPA_CONTROL_CMD_NODE_UPDATE:
 | 
				
			||||||
      fprintf (stderr, "implement builder of %d\n", cmd);
 | 
					      builder_add_node_update (sb, command);
 | 
				
			||||||
      break;
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    case SPA_CONTROL_CMD_PORT_UPDATE:
 | 
					    case SPA_CONTROL_CMD_PORT_UPDATE:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,7 +73,9 @@ struct _SpaProxy {
 | 
				
			||||||
  SpaPollFd fds[1];
 | 
					  SpaPollFd fds[1];
 | 
				
			||||||
  SpaPollItem poll;
 | 
					  SpaPollItem poll;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  unsigned int max_inputs;
 | 
				
			||||||
  unsigned int n_inputs;
 | 
					  unsigned int n_inputs;
 | 
				
			||||||
 | 
					  unsigned int max_outputs;
 | 
				
			||||||
  unsigned int n_outputs;
 | 
					  unsigned int n_outputs;
 | 
				
			||||||
  SpaProxyPort ports[MAX_PORTS];
 | 
					  SpaProxyPort ports[MAX_PORTS];
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -293,9 +295,9 @@ spa_proxy_node_get_n_ports (SpaNode       *node,
 | 
				
			||||||
  if (n_output_ports)
 | 
					  if (n_output_ports)
 | 
				
			||||||
    *n_output_ports = this->n_outputs;
 | 
					    *n_output_ports = this->n_outputs;
 | 
				
			||||||
  if (max_input_ports)
 | 
					  if (max_input_ports)
 | 
				
			||||||
    *max_input_ports = MAX_INPUTS;
 | 
					    *max_input_ports = this->max_inputs;
 | 
				
			||||||
  if (max_output_ports)
 | 
					  if (max_output_ports)
 | 
				
			||||||
    *max_output_ports = MAX_OUTPUTS;
 | 
					    *max_output_ports = this->max_outputs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  return SPA_RESULT_OK;
 | 
					  return SPA_RESULT_OK;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -914,11 +916,23 @@ parse_control (SpaProxy   *this,
 | 
				
			||||||
        fprintf (stderr, "proxy %p: got unexpected control %d\n", this, cmd);
 | 
					        fprintf (stderr, "proxy %p: got unexpected control %d\n", this, cmd);
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      case SPA_CONTROL_CMD_NODE_UPDATE:
 | 
					 | 
				
			||||||
      case SPA_CONTROL_CMD_PORT_REMOVED:
 | 
					      case SPA_CONTROL_CMD_PORT_REMOVED:
 | 
				
			||||||
        fprintf (stderr, "proxy %p: command not implemented %d\n", this, cmd);
 | 
					        fprintf (stderr, "proxy %p: command not implemented %d\n", this, cmd);
 | 
				
			||||||
        break;
 | 
					        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:
 | 
					      case SPA_CONTROL_CMD_PORT_UPDATE:
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        SpaControlCmdPortUpdate pu;
 | 
					        SpaControlCmdPortUpdate pu;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue