mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-03 09:01:54 -05:00
modules: refactor param_info_parsing
To add more checks later. See #2070
This commit is contained in:
parent
ef8fa3dc6f
commit
98aa2a04c7
2 changed files with 38 additions and 42 deletions
|
|
@ -70,6 +70,23 @@ do { \
|
|||
} \
|
||||
} while(0)
|
||||
|
||||
#define parse_param_info(prs,n_params,params) \
|
||||
do { \
|
||||
uint32_t i; \
|
||||
if (spa_pod_parser_get(prs, \
|
||||
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
||||
return -EINVAL; \
|
||||
if (n_params > 0) { \
|
||||
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
||||
for (i = 0; i < n_params; i++) { \
|
||||
if (spa_pod_parser_get(prs, \
|
||||
SPA_POD_Id(&(params[i]).id), \
|
||||
SPA_POD_Int(&(params[i]).flags), NULL) < 0) \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static int device_marshal_add_listener(void *object,
|
||||
struct spa_hook *listener,
|
||||
const struct spa_device_events *events,
|
||||
|
|
@ -246,7 +263,6 @@ static int device_demarshal_info(void *object,
|
|||
struct spa_pod *ipod;
|
||||
struct spa_device_info info = SPA_DEVICE_INFO_INIT(), *infop;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
uint32_t i;
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
|
||||
|
|
@ -274,19 +290,7 @@ static int device_demarshal_info(void *object,
|
|||
if (props.n_items > 0)
|
||||
info.props = &props;
|
||||
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Int(&info.n_params), NULL) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (info.n_params > 0) {
|
||||
info.params = alloca(info.n_params * sizeof(struct spa_param_info));
|
||||
for (i = 0; i < info.n_params; i++) {
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Id(&info.params[i].id),
|
||||
SPA_POD_Int(&info.params[i].flags), NULL) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
parse_param_info(&p2, info.n_params, info.params);
|
||||
}
|
||||
else {
|
||||
infop = NULL;
|
||||
|
|
|
|||
|
|
@ -112,6 +112,23 @@ do { \
|
|||
} \
|
||||
} while(0)
|
||||
|
||||
#define parse_param_info(prs,n_params,params) \
|
||||
do { \
|
||||
uint32_t i; \
|
||||
if (spa_pod_parser_get(prs, \
|
||||
SPA_POD_Int(&(n_params)), NULL) < 0) \
|
||||
return -EINVAL; \
|
||||
if (n_params > 0) { \
|
||||
params = alloca(n_params * sizeof(struct spa_param_info)); \
|
||||
for (i = 0; i < n_params; i++) { \
|
||||
if (spa_pod_parser_get(prs, \
|
||||
SPA_POD_Id(&(params[i]).id), \
|
||||
SPA_POD_Int(&(params[i]).flags), NULL) < 0) \
|
||||
return -EINVAL; \
|
||||
} \
|
||||
} \
|
||||
} while(0)
|
||||
|
||||
static int client_node_marshal_add_listener(void *object,
|
||||
struct spa_hook *listener,
|
||||
const struct pw_client_node_events *events,
|
||||
|
|
@ -942,7 +959,6 @@ static int client_node_demarshal_update(void *object, const struct pw_protocol_n
|
|||
struct spa_node_info info = SPA_NODE_INFO_INIT(), *infop = NULL;
|
||||
struct spa_pod *ipod;
|
||||
struct spa_dict props = SPA_DICT_INIT(NULL, 0);
|
||||
uint32_t i;
|
||||
|
||||
spa_pod_parser_init(&prs, msg->data, msg->size);
|
||||
if (spa_pod_parser_push_struct(&prs, &f[0]) < 0 ||
|
||||
|
|
@ -978,19 +994,7 @@ static int client_node_demarshal_update(void *object, const struct pw_protocol_n
|
|||
if (props.n_items > 0)
|
||||
info.props = &props;
|
||||
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Int(&info.n_params), NULL) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (info.n_params > 0) {
|
||||
info.params = alloca(info.n_params * sizeof(struct spa_param_info));
|
||||
for (i = 0; i < info.n_params; i++) {
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Id(&info.params[i].id),
|
||||
SPA_POD_Int(&info.params[i].flags), NULL) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
parse_param_info(&p2, info.n_params, info.params);
|
||||
}
|
||||
|
||||
pw_resource_notify(resource, struct pw_client_node_methods, update, 0, change_mask,
|
||||
|
|
@ -1004,7 +1008,7 @@ static int client_node_demarshal_port_update(void *object, const struct pw_proto
|
|||
struct pw_resource *resource = object;
|
||||
struct spa_pod_parser prs;
|
||||
struct spa_pod_frame f;
|
||||
uint32_t i, direction, port_id, change_mask, n_params;
|
||||
uint32_t direction, port_id, change_mask, n_params;
|
||||
const struct spa_pod **params = NULL;
|
||||
struct spa_port_info info = SPA_PORT_INFO_INIT(), *infop = NULL;
|
||||
struct spa_pod *ipod;
|
||||
|
|
@ -1047,19 +1051,7 @@ static int client_node_demarshal_port_update(void *object, const struct pw_proto
|
|||
if (props.n_items > 0)
|
||||
info.props = &props;
|
||||
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Int(&info.n_params), NULL) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (info.n_params > 0) {
|
||||
info.params = alloca(info.n_params * sizeof(struct spa_param_info));
|
||||
for (i = 0; i < info.n_params; i++) {
|
||||
if (spa_pod_parser_get(&p2,
|
||||
SPA_POD_Id(&info.params[i].id),
|
||||
SPA_POD_Int(&info.params[i].flags), NULL) < 0)
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
parse_param_info(&p2, info.n_params, info.params);
|
||||
}
|
||||
|
||||
pw_resource_notify(resource, struct pw_client_node_methods, port_update, 0, direction,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue