mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -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++) {
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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_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
|
||||
pinos_map_init (PinosMap *map,
|
||||
size_t size,
|
||||
|
|
|
|||
|
|
@ -400,6 +400,7 @@ node_demarshal_info (void *object,
|
|||
int i;
|
||||
|
||||
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_TYPE_INT, &info.id,
|
||||
SPA_POD_TYPE_LONG, &info.change_mask,
|
||||
|
|
@ -599,6 +600,7 @@ client_node_demarshal_event (void *object,
|
|||
const SpaEvent *event;
|
||||
|
||||
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_TYPE_OBJECT, &event,
|
||||
0))
|
||||
|
|
@ -661,6 +663,7 @@ client_node_demarshal_set_format (void *object,
|
|||
const SpaFormat *format = NULL;
|
||||
|
||||
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_TYPE_INT, &seq,
|
||||
SPA_POD_TYPE_INT, &direction,
|
||||
|
|
@ -816,6 +819,7 @@ client_node_demarshal_node_command (void *object,
|
|||
uint32_t seq;
|
||||
|
||||
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_TYPE_INT, &seq,
|
||||
SPA_POD_TYPE_OBJECT, &command,
|
||||
|
|
@ -837,6 +841,7 @@ client_node_demarshal_port_command (void *object,
|
|||
uint32_t port_id;
|
||||
|
||||
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_TYPE_INT, &port_id,
|
||||
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_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);
|
||||
|
||||
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
|
||||
}
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -3,4 +3,5 @@ load-module libpinos-module-protocol-native
|
|||
load-module libpinos-module-suspend-on-idle
|
||||
load-module libpinos-module-spa --pattern snow
|
||||
load-module libpinos-module-autolink
|
||||
#load-module libpinos-module-mixer
|
||||
load-module libpinos-module-flatpak
|
||||
|
|
|
|||
|
|
@ -650,7 +650,6 @@ wakeup_main (void *userdata)
|
|||
true);
|
||||
}
|
||||
|
||||
|
||||
static ModuleImpl *
|
||||
module_new (PinosCore *core,
|
||||
PinosProperties *properties)
|
||||
|
|
|
|||
|
|
@ -311,7 +311,7 @@ core_update_types (void *object,
|
|||
|
||||
for (i = 0; i < n_types; i++, first_id++) {
|
||||
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");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -282,6 +282,7 @@ do_pull (PinosNode *this)
|
|||
|
||||
/* pull */
|
||||
*po = *pi;
|
||||
pi->buffer_id = SPA_ID_INVALID;
|
||||
|
||||
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;
|
||||
|
||||
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_INT, &change_mask,
|
||||
SPA_POD_TYPE_INT, &max_input_ports,
|
||||
|
|
@ -833,6 +834,7 @@ client_node_demarshal_port_update (void *object,
|
|||
SpaPOD *ipod;
|
||||
|
||||
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_INT, &direction,
|
||||
SPA_POD_TYPE_INT, &port_id,
|
||||
|
|
@ -908,6 +910,7 @@ client_node_demarshal_event (void *object,
|
|||
SpaEvent *event;
|
||||
|
||||
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))
|
||||
return false;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue