mirror of
				https://gitlab.freedesktop.org/pipewire/pipewire.git
				synced 2025-11-03 09:01:54 -05:00 
			
		
		
		
	types: remap ids
Remap ids between client and server
This commit is contained in:
		
							parent
							
								
									be528ba7c2
								
							
						
					
					
						commit
						c7333c46cc
					
				
					 10 changed files with 82 additions and 3 deletions
				
			
		| 
						 | 
					@ -172,7 +172,7 @@ core_event_update_types (void          *object,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0; i < n_types; i++, first_id++) {
 | 
					  for (i = 0; i < n_types; i++, first_id++) {
 | 
				
			||||||
    SpaType this_id = spa_type_map_get_id (this->type.map, types[i]);
 | 
					    SpaType this_id = spa_type_map_get_id (this->type.map, types[i]);
 | 
				
			||||||
    if (!pinos_map_insert_at (&this->types, first_id, SPA_UINT32_TO_PTR (this_id)))
 | 
					    if (!pinos_map_insert_at (&this->types, first_id, PINOS_MAP_ID_TO_PTR (this_id)))
 | 
				
			||||||
      pinos_log_error ("can't add type for client");
 | 
					      pinos_log_error ("can't add type for client");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -53,6 +53,9 @@ struct _PinosMap {
 | 
				
			||||||
#define pinos_map_has_item(m,id)         (pinos_map_check_id(m,id) && !pinos_map_id_is_free(m, id))
 | 
					#define pinos_map_has_item(m,id)         (pinos_map_check_id(m,id) && !pinos_map_id_is_free(m, id))
 | 
				
			||||||
#define pinos_map_lookup_unchecked(m,id) pinos_map_get_item(m,id)->data
 | 
					#define pinos_map_lookup_unchecked(m,id) pinos_map_get_item(m,id)->data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define PINOS_MAP_ID_TO_PTR(id)          (SPA_UINT32_TO_PTR((id)<<1))
 | 
				
			||||||
 | 
					#define PINOS_MAP_PTR_TO_ID(p)           (SPA_PTR_TO_UINT32(p)>>1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static inline void
 | 
					static inline void
 | 
				
			||||||
pinos_map_init (PinosMap *map,
 | 
					pinos_map_init (PinosMap *map,
 | 
				
			||||||
                size_t    size,
 | 
					                size_t    size,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -400,6 +400,7 @@ node_demarshal_info (void   *object,
 | 
				
			||||||
  int i;
 | 
					  int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &info.id,
 | 
					        SPA_POD_TYPE_INT, &info.id,
 | 
				
			||||||
        SPA_POD_TYPE_LONG, &info.change_mask,
 | 
					        SPA_POD_TYPE_LONG, &info.change_mask,
 | 
				
			||||||
| 
						 | 
					@ -599,6 +600,7 @@ client_node_demarshal_event (void   *object,
 | 
				
			||||||
  const SpaEvent *event;
 | 
					  const SpaEvent *event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_OBJECT, &event,
 | 
					        SPA_POD_TYPE_OBJECT, &event,
 | 
				
			||||||
        0))
 | 
					        0))
 | 
				
			||||||
| 
						 | 
					@ -661,6 +663,7 @@ client_node_demarshal_set_format (void   *object,
 | 
				
			||||||
  const SpaFormat *format = NULL;
 | 
					  const SpaFormat *format = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &seq,
 | 
					        SPA_POD_TYPE_INT, &seq,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &direction,
 | 
					        SPA_POD_TYPE_INT, &direction,
 | 
				
			||||||
| 
						 | 
					@ -816,6 +819,7 @@ client_node_demarshal_node_command (void   *object,
 | 
				
			||||||
  uint32_t seq;
 | 
					  uint32_t seq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &seq,
 | 
					        SPA_POD_TYPE_INT, &seq,
 | 
				
			||||||
        SPA_POD_TYPE_OBJECT, &command,
 | 
					        SPA_POD_TYPE_OBJECT, &command,
 | 
				
			||||||
| 
						 | 
					@ -837,6 +841,7 @@ client_node_demarshal_port_command (void   *object,
 | 
				
			||||||
  uint32_t port_id;
 | 
					  uint32_t port_id;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &proxy->context->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &port_id,
 | 
					        SPA_POD_TYPE_INT, &port_id,
 | 
				
			||||||
        SPA_POD_TYPE_OBJECT, &command,
 | 
					        SPA_POD_TYPE_OBJECT, &command,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -56,3 +56,62 @@ pinos_type_init (PinosType *type)
 | 
				
			||||||
  spa_type_alloc_param_meta_enable_map (type->map, &type->alloc_param_meta_enable);
 | 
					  spa_type_alloc_param_meta_enable_map (type->map, &type->alloc_param_meta_enable);
 | 
				
			||||||
  spa_type_alloc_param_video_padding_map (type->map, &type->alloc_param_video_padding);
 | 
					  spa_type_alloc_param_video_padding_map (type->map, &type->alloc_param_video_padding);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool
 | 
				
			||||||
 | 
					pinos_pod_remap_data (uint32_t type, void * body, uint32_t size, PinosMap *types)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  void *t;
 | 
				
			||||||
 | 
					  switch (type) {
 | 
				
			||||||
 | 
					    case SPA_POD_TYPE_ID:
 | 
				
			||||||
 | 
					      if ((t = pinos_map_lookup (types, *(int32_t*)body)) == NULL)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      *(int32_t*)body = PINOS_MAP_PTR_TO_ID (t);
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    case SPA_POD_TYPE_PROP:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      SpaPODPropBody *b = body;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if ((t = pinos_map_lookup (types, b->key)) == NULL)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      b->key = PINOS_MAP_PTR_TO_ID (t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if (b->value.type == SPA_POD_TYPE_ID) {
 | 
				
			||||||
 | 
					        void *alt;
 | 
				
			||||||
 | 
					        if (!pinos_pod_remap_data (b->value.type, SPA_POD_BODY (&b->value), b->value.size, types))
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        SPA_POD_PROP_ALTERNATIVE_FOREACH (b, size, alt)
 | 
				
			||||||
 | 
					          if (!pinos_pod_remap_data (b->value.type, alt, b->value.size, types))
 | 
				
			||||||
 | 
					            return false;
 | 
				
			||||||
 | 
					      }
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case SPA_POD_TYPE_OBJECT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      SpaPODObjectBody *b = body;
 | 
				
			||||||
 | 
					      SpaPOD *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      if ((t = pinos_map_lookup (types, b->type)) == NULL)
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					      b->type = PINOS_MAP_PTR_TO_ID (t);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      SPA_POD_OBJECT_BODY_FOREACH (b, size, p)
 | 
				
			||||||
 | 
					        if (!pinos_pod_remap_data (p->type, SPA_POD_BODY (p), p->size, types))
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    case SPA_POD_TYPE_STRUCT:
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					      SpaPOD *b = body, *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					      SPA_POD_FOREACH (b, size, p)
 | 
				
			||||||
 | 
					        if (!pinos_pod_remap_data (p->type, SPA_POD_BODY (p), p->size, types))
 | 
				
			||||||
 | 
					          return false;
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    default:
 | 
				
			||||||
 | 
					      break;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,6 +64,14 @@ struct _PinosType {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void pinos_type_init (PinosType *type);
 | 
					void pinos_type_init (PinosType *type);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool pinos_pod_remap_data  (uint32_t type, void *body, uint32_t size, PinosMap *types);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline bool
 | 
				
			||||||
 | 
					pinos_pod_remap (SpaPOD *pod, PinosMap *types)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					  return pinos_pod_remap_data (pod->type, SPA_POD_BODY (pod), pod->size, types);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __cplusplus
 | 
					#ifdef __cplusplus
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,4 +3,5 @@ load-module libpinos-module-protocol-native
 | 
				
			||||||
load-module libpinos-module-suspend-on-idle
 | 
					load-module libpinos-module-suspend-on-idle
 | 
				
			||||||
load-module libpinos-module-spa --pattern snow
 | 
					load-module libpinos-module-spa --pattern snow
 | 
				
			||||||
load-module libpinos-module-autolink
 | 
					load-module libpinos-module-autolink
 | 
				
			||||||
 | 
					#load-module libpinos-module-mixer
 | 
				
			||||||
load-module libpinos-module-flatpak
 | 
					load-module libpinos-module-flatpak
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -650,7 +650,6 @@ wakeup_main (void *userdata)
 | 
				
			||||||
                          true);
 | 
					                          true);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
static ModuleImpl *
 | 
					static ModuleImpl *
 | 
				
			||||||
module_new (PinosCore       *core,
 | 
					module_new (PinosCore       *core,
 | 
				
			||||||
            PinosProperties *properties)
 | 
					            PinosProperties *properties)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -311,7 +311,7 @@ core_update_types (void          *object,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  for (i = 0; i < n_types; i++, first_id++) {
 | 
					  for (i = 0; i < n_types; i++, first_id++) {
 | 
				
			||||||
    uint32_t this_id = spa_type_map_get_id (this->type.map, types[i]);
 | 
					    uint32_t this_id = spa_type_map_get_id (this->type.map, types[i]);
 | 
				
			||||||
    if (!pinos_map_insert_at (&client->types, first_id, SPA_UINT32_TO_PTR (this_id)))
 | 
					    if (!pinos_map_insert_at (&client->types, first_id, PINOS_MAP_ID_TO_PTR (this_id)))
 | 
				
			||||||
      pinos_log_error ("can't add type for client");
 | 
					      pinos_log_error ("can't add type for client");
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -282,6 +282,7 @@ do_pull (PinosNode *this)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      /* pull */
 | 
					      /* pull */
 | 
				
			||||||
      *po = *pi;
 | 
					      *po = *pi;
 | 
				
			||||||
 | 
					      pi->buffer_id = SPA_ID_INVALID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      pinos_log_trace ("node %p: process output %p %d", outport->node, po, po->buffer_id);
 | 
					      pinos_log_trace ("node %p: process output %p %d", outport->node, po, po->buffer_id);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -807,6 +807,7 @@ client_node_demarshal_update (void  *object,
 | 
				
			||||||
  const SpaProps *props;
 | 
					  const SpaProps *props;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &resource->client->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &change_mask,
 | 
					        SPA_POD_TYPE_INT, &change_mask,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &max_input_ports,
 | 
					        SPA_POD_TYPE_INT, &max_input_ports,
 | 
				
			||||||
| 
						 | 
					@ -833,6 +834,7 @@ client_node_demarshal_port_update (void  *object,
 | 
				
			||||||
  SpaPOD *ipod;
 | 
					  SpaPOD *ipod;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &resource->client->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it,
 | 
					      !spa_pod_iter_get (&it,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &direction,
 | 
					        SPA_POD_TYPE_INT, &direction,
 | 
				
			||||||
        SPA_POD_TYPE_INT, &port_id,
 | 
					        SPA_POD_TYPE_INT, &port_id,
 | 
				
			||||||
| 
						 | 
					@ -908,6 +910,7 @@ client_node_demarshal_event (void   *object,
 | 
				
			||||||
  SpaEvent *event;
 | 
					  SpaEvent *event;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
					  if (!spa_pod_iter_struct (&it, data, size) ||
 | 
				
			||||||
 | 
					      !pinos_pod_remap_data (SPA_POD_TYPE_STRUCT, data, size, &resource->client->types) ||
 | 
				
			||||||
      !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &event, 0))
 | 
					      !spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &event, 0))
 | 
				
			||||||
    return false;
 | 
					    return false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue