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++) {
|
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