18#ifndef SPA_API_POD_ITER
20 #define SPA_API_POD_ITER SPA_API_IMPL
22 #define SPA_API_POD_ITER static inline
82#define SPA_POD_ARRAY_BODY_FOREACH(body, _size, iter) \
83 for ((iter) = (__typeof__(iter))SPA_PTROFF((body), sizeof(struct spa_pod_array_body), void); \
84 (body)->child.size > 0 && spa_ptrinside(body, _size, iter, (body)->child.size, NULL); \
85 (iter) = (__typeof__(iter))SPA_PTROFF((iter), (body)->child.size, void))
87#define SPA_POD_ARRAY_FOREACH(obj, iter) \
88 SPA_POD_ARRAY_BODY_FOREACH(&(obj)->body, SPA_POD_BODY_SIZE(obj), iter)
90#define SPA_POD_CHOICE_BODY_FOREACH(body, _size, iter) \
91 for ((iter) = (__typeof__(iter))SPA_PTROFF((body), sizeof(struct spa_pod_choice_body), void); \
92 (body)->child.size > 0 && spa_ptrinside(body, _size, iter, (body)->child.size, NULL); \
93 (iter) = (__typeof__(iter))SPA_PTROFF((iter), (body)->child.size, void))
95#define SPA_POD_CHOICE_FOREACH(obj, iter) \
96 SPA_POD_CHOICE_BODY_FOREACH(&(obj)->body, SPA_POD_BODY_SIZE(obj), iter)
98#define SPA_POD_FOREACH(pod, size, iter) \
99 for ((iter) = (pod); \
100 spa_pod_is_inside(pod, size, iter); \
101 (iter) = (__typeof__(iter))spa_pod_next(iter))
103#define SPA_POD_STRUCT_FOREACH(obj, iter) \
104 SPA_POD_FOREACH(SPA_POD_STRUCT_BODY(obj), SPA_POD_BODY_SIZE(obj), iter)
106#define SPA_POD_OBJECT_BODY_FOREACH(body, size, iter) \
107 for ((iter) = spa_pod_prop_first(body); \
108 spa_pod_prop_is_inside(body, size, iter); \
109 (iter) = spa_pod_prop_next(iter))
111#define SPA_POD_OBJECT_FOREACH(obj, iter) \
112 SPA_POD_OBJECT_BODY_FOREACH(&(obj)->body, SPA_POD_BODY_SIZE(obj), iter)
114#define SPA_POD_SEQUENCE_BODY_FOREACH(body, size, iter) \
115 for ((iter) = spa_pod_control_first(body); \
116 spa_pod_control_is_inside(body, size, iter); \
117 (iter) = spa_pod_control_next(iter))
119#define SPA_POD_SEQUENCE_FOREACH(seq, iter) \
120 SPA_POD_SEQUENCE_BODY_FOREACH(&(seq)->body, SPA_POD_BODY_SIZE(seq), iter)
197 uint32_t *val_size, uint32_t *val_type)
208 uint32_t
size,
void *values, uint32_t max_values)
210 uint32_t n_values, val_size, val_type;
212 if (v == NULL || max_values == 0 || val_type !=
type || val_size !=
size)
215 memcpy(values, v, val_size * n_values);
219#define spa_pod_copy_array(pod,type,values,max_values) \
220 spa_pod_copy_array_full(pod,type,sizeof(values[0]),values,max_values)
223 uint32_t *n_vals, uint32_t *choice)
uint32_t int int res
Definition core.h:433
SPA_API_POD_ITER bool spa_pod_control_is_inside(const struct spa_pod_sequence_body *body, uint32_t size, const struct spa_pod_control *iter)
Definition iter.h:75
SPA_API_POD_ITER int spa_pod_get_int(const struct spa_pod *pod, int32_t *value)
Definition iter.h:148
SPA_API_POD_ITER struct spa_pod_prop * spa_pod_prop_first(const struct spa_pod_object_body *body)
Definition iter.h:51
SPA_API_POD_ITER void * spa_pod_from_data(void *data, size_t maxsize, off_t offset, size_t size)
Definition iter.h:129
SPA_API_POD_BODY int spa_pod_body_get_pointer(const struct spa_pod *pod, const void *body, uint32_t *type, const void **value)
Definition body.h:252
#define SPA_POD_BODY_CONST(pod)
Definition pod.h:46
SPA_API_POD_ITER const struct spa_pod_prop * spa_pod_find_prop(const struct spa_pod *pod, const struct spa_pod_prop *start, uint32_t key)
Definition iter.h:274
SPA_API_POD_BODY const void * spa_pod_body_get_array_values(const struct spa_pod *pod, const void *body, uint32_t *n_values, uint32_t *val_size, uint32_t *val_type)
Definition body.h:348
SPA_API_POD_ITER struct spa_pod * spa_pod_get_values(const struct spa_pod *pod, uint32_t *n_vals, uint32_t *choice)
Definition iter.h:229
SPA_API_POD_ITER bool spa_pod_prop_is_inside(const struct spa_pod_object_body *body, uint32_t size, const struct spa_pod_prop *iter)
Definition iter.h:56
SPA_API_POD_ITER struct spa_pod_control * spa_pod_control_next(const struct spa_pod_control *iter)
Definition iter.h:84
SPA_API_POD_BODY int spa_pod_body_get_string(const struct spa_pod *pod, const void *body, const char **value)
Definition body.h:206
SPA_API_POD_ITER int spa_pod_get_pointer(const struct spa_pod *pod, uint32_t *type, const void **value)
Definition iter.h:183
SPA_API_POD_ITER int spa_pod_get_id(const struct spa_pod *pod, uint32_t *value)
Definition iter.h:143
SPA_API_POD_ITER int spa_pod_get_bytes(const struct spa_pod *pod, const void **value, uint32_t *len)
Definition iter.h:178
SPA_API_POD_BODY int spa_pod_body_get_fraction(const struct spa_pod *pod, const void *body, struct spa_fraction *value)
Definition body.h:300
SPA_API_POD_ITER const struct spa_pod_prop * spa_pod_object_find_prop(const struct spa_pod_object *pod, const struct spa_pod_prop *start, uint32_t key)
Definition iter.h:254
SPA_API_POD_ITER int spa_pod_object_fixate(struct spa_pod_object *pod)
Definition iter.h:290
#define SPA_POD_OBJECT_FOREACH(obj, iter)
Definition iter.h:118
#define SPA_POD_BODY(pod)
Definition pod.h:44
SPA_API_POD_BODY int spa_pod_is_object(const struct spa_pod *pod)
Definition body.h:393
SPA_API_POD_ITER void * spa_pod_next(const void *iter)
Definition iter.h:46
SPA_API_POD_ITER int spa_pod_get_fd(const struct spa_pod *pod, int64_t *value)
Definition iter.h:188
#define SPA_POD_BODY_SIZE(pod)
Definition pod.h:31
SPA_API_POD_ITER void * spa_pod_get_array_full(const struct spa_pod *pod, uint32_t *n_values, uint32_t *val_size, uint32_t *val_type)
Definition iter.h:203
SPA_API_POD_ITER int spa_pod_get_long(const struct spa_pod *pod, int64_t *value)
Definition iter.h:153
SPA_API_POD_ITER int spa_pod_get_float(const struct spa_pod *pod, float *value)
Definition iter.h:158
SPA_API_POD_ITER struct spa_pod_control * spa_pod_control_first(const struct spa_pod_sequence_body *body)
Definition iter.h:70
SPA_API_POD_ITER int spa_pod_get_bool(const struct spa_pod *pod, bool *value)
Definition iter.h:138
#define SPA_POD_PROP_FLAG_DONT_FIXATE
choices need no fixation
Definition pod.h:244
SPA_API_POD_BODY int spa_pod_body_get_double(const struct spa_pod *pod, const void *body, double *value)
Definition body.h:191
SPA_API_POD_ITER int spa_pod_is_fixated(const struct spa_pod *pod)
Definition iter.h:318
SPA_API_POD_ITER int spa_pod_get_rectangle(const struct spa_pod *pod, struct spa_rectangle *value)
Definition iter.h:193
SPA_API_POD_ITER int spa_pod_get_double(const struct spa_pod *pod, double *value)
Definition iter.h:163
#define SPA_POD_CONTROL_SIZE(ev)
Definition pod.h:254
SPA_API_POD_BODY int spa_pod_body_copy_string(const struct spa_pod *pod, const void *body, char *dest, size_t maxlen)
Definition body.h:219
SPA_API_POD_ITER int spa_pod_fixate(struct spa_pod *pod)
Definition iter.h:311
SPA_API_POD_ITER struct spa_pod_prop * spa_pod_prop_next(const struct spa_pod_prop *iter)
Definition iter.h:65
#define SPA_POD_PROP_SIZE(prop)
Definition pod.h:224
SPA_API_POD_ITER int spa_pod_copy_string(const struct spa_pod *pod, size_t maxlen, char *dest)
Definition iter.h:173
SPA_API_POD_BODY int spa_pod_body_get_long(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:160
SPA_API_POD_BODY const void * spa_pod_choice_body_get_values(const struct spa_pod_choice *pod, const void *body, uint32_t *n_values, uint32_t *choice, uint32_t *val_size, uint32_t *val_type)
Definition body.h:374
SPA_API_POD_BODY int spa_pod_body_get_int(const struct spa_pod *pod, const void *body, int32_t *value)
Definition body.h:147
SPA_API_POD_ITER bool spa_pod_is_object_id(const struct spa_pod *pod, uint32_t id)
Definition iter.h:249
SPA_API_POD_ITER bool spa_pod_is_inside(const void *pod, uint32_t size, const void *iter)
Definition iter.h:38
SPA_API_POD_BODY int spa_pod_body_get_float(const struct spa_pod *pod, const void *body, float *value)
Definition body.h:176
#define SPA_POD_OBJECT_TYPE(obj)
Definition pod.h:192
#define SPA_POD_OBJECT_ID(obj)
Definition pod.h:194
SPA_API_POD_BODY int spa_pod_body_get_rectangle(const struct spa_pod *pod, const void *body, struct spa_rectangle *value)
Definition body.h:286
SPA_API_POD_BODY int spa_pod_body_get_bool(const struct spa_pod *pod, const void *body, bool *value)
Definition body.h:121
SPA_API_POD_ITER uint32_t spa_pod_copy_array_full(const struct spa_pod *pod, uint32_t type, uint32_t size, void *values, uint32_t max_values)
Definition iter.h:214
SPA_API_POD_ITER bool spa_pod_is_object_type(const struct spa_pod *pod, uint32_t type)
Definition iter.h:244
SPA_API_POD_ITER int spa_pod_object_is_fixated(const struct spa_pod_object *pod)
Definition iter.h:300
SPA_API_POD_ITER int spa_pod_get_string(const struct spa_pod *pod, const char **value)
Definition iter.h:168
SPA_API_POD_BODY int spa_pod_body_from_data(void *data, size_t maxsize, off_t offset, size_t size, struct spa_pod *pod, const void **body)
Definition body.h:88
#define SPA_POD_SIZE(pod)
Definition pod.h:35
#define SPA_POD_ALIGN
Definition pod.h:26
SPA_API_POD_BODY int spa_pod_body_get_fd(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:270
SPA_API_POD_ITER void * spa_pod_get_array(const struct spa_pod *pod, uint32_t *n_values)
Definition iter.h:208
SPA_API_POD_ITER int spa_pod_get_fraction(const struct spa_pod *pod, struct spa_fraction *value)
Definition iter.h:198
SPA_API_POD_BODY int spa_pod_is_choice(const struct spa_pod *pod)
Definition body.h:357
SPA_API_POD_BODY int spa_pod_body_get_id(const struct spa_pod *pod, const void *body, uint32_t *value)
Definition body.h:134
SPA_API_POD_ITER int spa_pod_object_has_props(const struct spa_pod_object *pod)
Definition iter.h:282
SPA_API_POD_BODY int spa_pod_body_get_bytes(const struct spa_pod *pod, const void *body, const void **value, uint32_t *len)
Definition body.h:237
@ SPA_CHOICE_None
no choice, first value is current
Definition pod.h:161
#define SPA_MIN(a, b)
Definition defs.h:165
#define SPA_ROUND_UP_N(num, align)
Definition defs.h:364
#define SPA_FLAG_IS_SET(field, flag)
Definition defs.h:90
#define spa_ptr_type_inside(p1, s1, p2, type, remaining)
Definition defs.h:430
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition defs.h:222
#define SPA_API_POD_ITER
Definition iter.h:29
struct spa_pod child
Definition pod.h:171
uint32_t type
type of choice, one of enum spa_choice_type
Definition pod.h:169
struct spa_pod_choice_body body
Definition pod.h:178
struct spa_pod pod
Definition pod.h:177
struct spa_pod value
control value, depends on type
Definition pod.h:260
uint32_t offset
media offset
Definition pod.h:258
struct spa_pod pod
Definition pod.h:203
struct spa_pod_object_body body
Definition pod.h:204
uint32_t key
key of property, list of valid keys depends on the object type
Definition pod.h:228
struct spa_pod value
Definition pod.h:249
uint32_t type
Definition pod.h:59
uint32_t size
Definition pod.h:58