mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
pod: add support for maybe-NULL types
This commit is contained in:
parent
3dba9f0fd4
commit
f613240b66
3 changed files with 36 additions and 23 deletions
|
|
@ -484,13 +484,13 @@ client_node_marshal_port_update (void *object,
|
||||||
PinosProxy *proxy = object;
|
PinosProxy *proxy = object;
|
||||||
PinosConnection *connection = proxy->context->protocol_private;
|
PinosConnection *connection = proxy->context->protocol_private;
|
||||||
Builder b = { { NULL, 0, 0, NULL, write_pod }, connection };
|
Builder b = { { NULL, 0, 0, NULL, write_pod }, connection };
|
||||||
SpaPODFrame f;
|
SpaPODFrame f[2];
|
||||||
int i, n_items;
|
int i, n_items;
|
||||||
|
|
||||||
core_update_map (proxy->context);
|
core_update_map (proxy->context);
|
||||||
|
|
||||||
spa_pod_builder_add (&b.b,
|
spa_pod_builder_add (&b.b,
|
||||||
SPA_POD_TYPE_STRUCT, &f,
|
SPA_POD_TYPE_STRUCT, &f[0],
|
||||||
SPA_POD_TYPE_INT, direction,
|
SPA_POD_TYPE_INT, direction,
|
||||||
SPA_POD_TYPE_INT, port_id,
|
SPA_POD_TYPE_INT, port_id,
|
||||||
SPA_POD_TYPE_INT, change_mask,
|
SPA_POD_TYPE_INT, change_mask,
|
||||||
|
|
@ -505,9 +505,9 @@ client_node_marshal_port_update (void *object,
|
||||||
SPA_POD_TYPE_POD, props,
|
SPA_POD_TYPE_POD, props,
|
||||||
0);
|
0);
|
||||||
|
|
||||||
spa_pod_builder_add (&b.b, SPA_POD_TYPE_INT, info ? 1 : 0, 0);
|
|
||||||
if (info) {
|
if (info) {
|
||||||
spa_pod_builder_add (&b.b,
|
spa_pod_builder_add (&b.b,
|
||||||
|
SPA_POD_TYPE_STRUCT, &f[1],
|
||||||
SPA_POD_TYPE_INT, info->flags,
|
SPA_POD_TYPE_INT, info->flags,
|
||||||
SPA_POD_TYPE_LONG, info->maxbuffering,
|
SPA_POD_TYPE_LONG, info->maxbuffering,
|
||||||
SPA_POD_TYPE_LONG, info->latency,
|
SPA_POD_TYPE_LONG, info->latency,
|
||||||
|
|
@ -526,8 +526,11 @@ client_node_marshal_port_update (void *object,
|
||||||
SPA_POD_TYPE_STRING, info->extra->items[i].value,
|
SPA_POD_TYPE_STRING, info->extra->items[i].value,
|
||||||
0);
|
0);
|
||||||
}
|
}
|
||||||
|
spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f[1], 0);
|
||||||
|
} else {
|
||||||
|
spa_pod_builder_add (&b.b, SPA_POD_TYPE_POD, NULL, 0);
|
||||||
}
|
}
|
||||||
spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f, 0);
|
spa_pod_builder_add (&b.b, -SPA_POD_TYPE_STRUCT, &f[0], 0);
|
||||||
|
|
||||||
pinos_connection_end_write (connection, proxy->id, 1, b.b.offset);
|
pinos_connection_end_write (connection, proxy->id, 1, b.b.offset);
|
||||||
}
|
}
|
||||||
|
|
@ -680,7 +683,7 @@ client_node_demarshal_set_format (void *object,
|
||||||
SPA_POD_TYPE_INT, &direction,
|
SPA_POD_TYPE_INT, &direction,
|
||||||
SPA_POD_TYPE_INT, &port_id,
|
SPA_POD_TYPE_INT, &port_id,
|
||||||
SPA_POD_TYPE_INT, &flags,
|
SPA_POD_TYPE_INT, &flags,
|
||||||
SPA_POD_TYPE_OBJECT, &format,
|
-SPA_POD_TYPE_OBJECT, &format,
|
||||||
0))
|
0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -811,7 +811,7 @@ client_node_demarshal_update (void *object,
|
||||||
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,
|
||||||
SPA_POD_TYPE_INT, &max_output_ports,
|
SPA_POD_TYPE_INT, &max_output_ports,
|
||||||
SPA_POD_TYPE_OBJECT, &props,
|
-SPA_POD_TYPE_OBJECT, &props,
|
||||||
0))
|
0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
@ -826,10 +826,11 @@ client_node_demarshal_port_update (void *object,
|
||||||
{
|
{
|
||||||
PinosResource *resource = object;
|
PinosResource *resource = object;
|
||||||
SpaPODIter it;
|
SpaPODIter it;
|
||||||
uint32_t i, t, direction, port_id, change_mask, n_possible_formats;
|
uint32_t i, direction, port_id, change_mask, n_possible_formats;
|
||||||
const SpaProps *props = NULL;
|
const SpaProps *props = NULL;
|
||||||
const SpaFormat **possible_formats = NULL, *format = NULL;
|
const SpaFormat **possible_formats = NULL, *format = NULL;
|
||||||
SpaPortInfo info, *infop = NULL;
|
SpaPortInfo info, *infop = NULL;
|
||||||
|
SpaPOD *ipod;
|
||||||
|
|
||||||
if (!spa_pod_iter_struct (&it, data, size) ||
|
if (!spa_pod_iter_struct (&it, data, size) ||
|
||||||
!spa_pod_iter_get (&it,
|
!spa_pod_iter_get (&it,
|
||||||
|
|
@ -846,19 +847,19 @@ client_node_demarshal_port_update (void *object,
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!spa_pod_iter_get (&it,
|
if (!spa_pod_iter_get (&it,
|
||||||
SPA_POD_TYPE_OBJECT, &format,
|
-SPA_POD_TYPE_OBJECT, &format,
|
||||||
SPA_POD_TYPE_OBJECT, &props,
|
-SPA_POD_TYPE_OBJECT, &props,
|
||||||
|
-SPA_POD_TYPE_STRUCT, &ipod,
|
||||||
0))
|
0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &t, 0))
|
if (ipod) {
|
||||||
return false;
|
|
||||||
|
|
||||||
if (t) {
|
|
||||||
SpaDict dict;
|
SpaDict dict;
|
||||||
|
SpaPODIter it2;
|
||||||
infop = &info;
|
infop = &info;
|
||||||
|
|
||||||
if (!spa_pod_iter_get (&it,
|
if (!spa_pod_iter_pod (&it2, ipod) ||
|
||||||
|
!spa_pod_iter_get (&it2,
|
||||||
SPA_POD_TYPE_INT, &info.flags,
|
SPA_POD_TYPE_INT, &info.flags,
|
||||||
SPA_POD_TYPE_LONG, &info.maxbuffering,
|
SPA_POD_TYPE_LONG, &info.maxbuffering,
|
||||||
SPA_POD_TYPE_LONG, &info.latency,
|
SPA_POD_TYPE_LONG, &info.latency,
|
||||||
|
|
@ -868,16 +869,16 @@ client_node_demarshal_port_update (void *object,
|
||||||
|
|
||||||
info.params = alloca (info.n_params * sizeof (SpaAllocParam *));
|
info.params = alloca (info.n_params * sizeof (SpaAllocParam *));
|
||||||
for (i = 0; i < info.n_params; i++)
|
for (i = 0; i < info.n_params; i++)
|
||||||
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_OBJECT, &info.params[i], 0))
|
if (!spa_pod_iter_get (&it2, SPA_POD_TYPE_OBJECT, &info.params[i], 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!spa_pod_iter_get (&it, SPA_POD_TYPE_INT, &dict.n_items, 0))
|
if (!spa_pod_iter_get (&it2, SPA_POD_TYPE_INT, &dict.n_items, 0))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
info.extra = &dict;
|
info.extra = &dict;
|
||||||
dict.items = alloca (dict.n_items * sizeof (SpaDictItem));
|
dict.items = alloca (dict.n_items * sizeof (SpaDictItem));
|
||||||
for (i = 0; i < dict.n_items; i++) {
|
for (i = 0; i < dict.n_items; i++) {
|
||||||
if (!spa_pod_iter_get (&it,
|
if (!spa_pod_iter_get (&it2,
|
||||||
SPA_POD_TYPE_STRING, &dict.items[i].key,
|
SPA_POD_TYPE_STRING, &dict.items[i].key,
|
||||||
SPA_POD_TYPE_STRING, &dict.items[i].value,
|
SPA_POD_TYPE_STRING, &dict.items[i].value,
|
||||||
0))
|
0))
|
||||||
|
|
|
||||||
|
|
@ -97,16 +97,16 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
||||||
*(va_arg (args, SpaPOD **)) = pod; \
|
*(va_arg (args, SpaPOD **)) = pod; \
|
||||||
} else if ((pod)->type == SPA_POD_TYPE_NONE) { \
|
} else if ((pod)->type == SPA_POD_TYPE_NONE) { \
|
||||||
switch (type) { \
|
switch (type) { \
|
||||||
case SPA_POD_TYPE_ARRAY: \
|
case -SPA_POD_TYPE_ARRAY: \
|
||||||
case SPA_POD_TYPE_STRUCT: \
|
case -SPA_POD_TYPE_STRUCT: \
|
||||||
case SPA_POD_TYPE_OBJECT: \
|
case -SPA_POD_TYPE_OBJECT: \
|
||||||
case SPA_POD_TYPE_PROP: \
|
case -SPA_POD_TYPE_PROP: \
|
||||||
*(va_arg (args, SpaPOD **)) = NULL; \
|
*(va_arg (args, SpaPOD **)) = NULL; \
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
goto error; \
|
goto error; \
|
||||||
} \
|
} \
|
||||||
} else if ((pod)->type == type) { \
|
} else if ((pod)->type == type || (pod)->type == -type) { \
|
||||||
switch (type) { \
|
switch (type) { \
|
||||||
case SPA_POD_TYPE_BOOL: \
|
case SPA_POD_TYPE_BOOL: \
|
||||||
case SPA_POD_TYPE_URI: \
|
case SPA_POD_TYPE_URI: \
|
||||||
|
|
@ -155,6 +155,10 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
||||||
case SPA_POD_TYPE_STRUCT: \
|
case SPA_POD_TYPE_STRUCT: \
|
||||||
case SPA_POD_TYPE_OBJECT: \
|
case SPA_POD_TYPE_OBJECT: \
|
||||||
case SPA_POD_TYPE_PROP: \
|
case SPA_POD_TYPE_PROP: \
|
||||||
|
case -SPA_POD_TYPE_ARRAY: \
|
||||||
|
case -SPA_POD_TYPE_STRUCT: \
|
||||||
|
case -SPA_POD_TYPE_OBJECT: \
|
||||||
|
case -SPA_POD_TYPE_PROP: \
|
||||||
*(va_arg (args, SpaPOD **)) = pod; \
|
*(va_arg (args, SpaPOD **)) = pod; \
|
||||||
break; \
|
break; \
|
||||||
default: \
|
default: \
|
||||||
|
|
@ -177,6 +181,7 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
||||||
case SPA_POD_TYPE_FLOAT: \
|
case SPA_POD_TYPE_FLOAT: \
|
||||||
case SPA_POD_TYPE_DOUBLE: \
|
case SPA_POD_TYPE_DOUBLE: \
|
||||||
case SPA_POD_TYPE_STRING: \
|
case SPA_POD_TYPE_STRING: \
|
||||||
|
case -SPA_POD_TYPE_STRING: \
|
||||||
case SPA_POD_TYPE_RECTANGLE: \
|
case SPA_POD_TYPE_RECTANGLE: \
|
||||||
case SPA_POD_TYPE_FRACTION: \
|
case SPA_POD_TYPE_FRACTION: \
|
||||||
case SPA_POD_TYPE_BITMASK: \
|
case SPA_POD_TYPE_BITMASK: \
|
||||||
|
|
@ -185,6 +190,10 @@ spa_pod_object_find_prop (const SpaPODObject *obj, uint32_t key)
|
||||||
case SPA_POD_TYPE_OBJECT: \
|
case SPA_POD_TYPE_OBJECT: \
|
||||||
case SPA_POD_TYPE_PROP: \
|
case SPA_POD_TYPE_PROP: \
|
||||||
case SPA_POD_TYPE_POD: \
|
case SPA_POD_TYPE_POD: \
|
||||||
|
case -SPA_POD_TYPE_ARRAY: \
|
||||||
|
case -SPA_POD_TYPE_STRUCT: \
|
||||||
|
case -SPA_POD_TYPE_OBJECT: \
|
||||||
|
case -SPA_POD_TYPE_PROP: \
|
||||||
va_arg (args, void*); \
|
va_arg (args, void*); \
|
||||||
default: \
|
default: \
|
||||||
break; \
|
break; \
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue