types: remap ids

Remap ids between client and server
This commit is contained in:
Wim Taymans 2017-04-17 19:36:22 +02:00
parent be528ba7c2
commit c7333c46cc
10 changed files with 82 additions and 3 deletions

View file

@ -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");
} }
} }

View file

@ -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,

View file

@ -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,

View file

@ -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;
}

View file

@ -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

View file

@ -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

View file

@ -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)

View file

@ -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");
} }
} }

View file

@ -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);

View file

@ -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;