PipeWire 1.7.0
Loading...
Searching...
No Matches
body.h
Go to the documentation of this file.
1/* Simple Plugin API */
2/* SPDX-FileCopyrightText: Copyright © 2018 Wim Taymans */
3/* SPDX-License-Identifier: MIT */
4
5#ifndef SPA_POD_BODY_H
6#define SPA_POD_BODY_H
7
8#include <errno.h>
9#include <sys/types.h>
10
11#include <spa/pod/pod.h>
12#include <spa/utils/atomic.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18#ifndef SPA_API_POD_BODY
19 #ifdef SPA_API_IMPL
20 #define SPA_API_POD_BODY SPA_API_IMPL
21 #else
22 #define SPA_API_POD_BODY static inline
23 #endif
24#endif
25
30
31struct spa_pod_frame {
32 struct spa_pod pod;
33 struct spa_pod_frame *parent;
34 uint32_t offset;
35 uint32_t flags;
36};
37
38SPA_API_POD_BODY uint32_t spa_pod_type_size(uint32_t type)
40 switch (type) {
43 case SPA_TYPE_Struct:
44 case SPA_TYPE_Pod:
45 return 0;
46 case SPA_TYPE_String:
47 return 1;
48 case SPA_TYPE_Bool:
49 case SPA_TYPE_Int:
50 return sizeof(int32_t);
51 case SPA_TYPE_Id:
52 return sizeof(uint32_t);
53 case SPA_TYPE_Long:
54 return sizeof(int64_t);
55 case SPA_TYPE_Float:
56 return sizeof(float);
57 case SPA_TYPE_Double:
58 return sizeof(double);
60 return sizeof(struct spa_rectangle);
62 return sizeof(struct spa_fraction);
63 case SPA_TYPE_Bitmap:
64 return sizeof(uint8_t);
65 case SPA_TYPE_Array:
66 return sizeof(struct spa_pod_array_body);
67 case SPA_TYPE_Object:
68 return sizeof(struct spa_pod_object_body);
70 return sizeof(struct spa_pod_sequence_body);
72 return sizeof(struct spa_pod_pointer_body);
73 case SPA_TYPE_Fd:
74 return sizeof(int64_t);
75 case SPA_TYPE_Choice:
76 return sizeof(struct spa_pod_choice_body);
77 }
78 return 0;
79}
80
81SPA_API_POD_BODY int spa_pod_choice_n_values(uint32_t choice_type, uint32_t *min, uint32_t *max)
82{
83 switch (choice_type) {
84 case SPA_CHOICE_Enum:
85 *min = 2;
86 *max = UINT32_MAX;
87 break;
89 *min = *max = 3;
90 break;
91 case SPA_CHOICE_Step:
92 *min = *max = 4;
93 break;
94 case SPA_CHOICE_None:
96 *min = *max = 1;
97 break;
98 default:
99 /*
100 * This must always return at least 1, because callers
101 * assume that n_vals >= spa_pod_choice_n_values()
102 * mean that n_vals is at least 1.
103 */
104 *min = 1;
105 *max = UINT32_MAX;
106 return 0;
107 }
108 return 1;
109}
110
111SPA_API_POD_BODY int spa_pod_body_from_data(void *data, size_t maxsize, off_t offset, size_t size,
112 struct spa_pod *pod, const void **body)
113{
114 if (offset < 0)
115 return -EINVAL;
116 /* On 32-bit platforms, off_t is a signed 32-bit type (since it tracks pointer
117 * width), and consequently can never exceed UINT32_MAX. Skip the upper-bound
118 * check on 32-bit platforms to avoid a compiler warning. */
119#if __SIZEOF_POINTER__ > 4
120 if (offset > (int64_t)UINT32_MAX)
121 return -EINVAL;
122#endif
123 if (size < sizeof(struct spa_pod) ||
124 size > maxsize ||
125 maxsize - size < (uint32_t)offset)
126 return -EINVAL;
127 memcpy(pod, SPA_PTROFF(data, offset, void), sizeof(struct spa_pod));
128 if (!SPA_POD_IS_VALID(pod))
129 return -EINVAL;
130 if (pod->size > size - sizeof(struct spa_pod))
131 return -EINVAL;
132 *body = SPA_PTROFF(data, offset + sizeof(struct spa_pod), void);
133 return 0;
134}
135
136SPA_API_POD_BODY int spa_pod_is_none(const struct spa_pod *pod)
137{
139}
140
141SPA_API_POD_BODY int spa_pod_is_bool(const struct spa_pod *pod)
142{
143 return SPA_POD_CHECK(pod, SPA_TYPE_Bool, sizeof(int32_t));
144}
145
146#define SPA_POD_BODY_LOAD_ONCE(a, b) (*(a) = SPA_LOAD_ONCE(*(__typeof__(a))(b)))
147#define SPA_POD_BODY_LOAD_FIELD_ONCE(a, b, field) ((a)->field = SPA_LOAD_ONCE(((__typeof__(a))(b))->field))
149SPA_API_POD_BODY int spa_pod_body_get_bool(const struct spa_pod *pod, const void *body, bool *value)
150{
151 if (!spa_pod_is_bool(pod))
152 return -EINVAL;
153 *value = !!__atomic_load_n((const int32_t *)body, __ATOMIC_RELAXED);
154 return 0;
155}
157SPA_API_POD_BODY int spa_pod_is_id(const struct spa_pod *pod)
159 return SPA_POD_CHECK(pod, SPA_TYPE_Id, sizeof(uint32_t));
160}
161
162SPA_API_POD_BODY int spa_pod_body_get_id(const struct spa_pod *pod, const void *body, uint32_t *value)
163{
164 if (!spa_pod_is_id(pod))
165 return -EINVAL;
167 return 0;
168}
169
170SPA_API_POD_BODY int spa_pod_is_int(const struct spa_pod *pod)
172 return SPA_POD_CHECK(pod, SPA_TYPE_Int, sizeof(int32_t));
173}
174
175SPA_API_POD_BODY int spa_pod_body_get_int(const struct spa_pod *pod, const void *body, int32_t *value)
176{
177 if (!spa_pod_is_int(pod))
178 return -EINVAL;
180 return 0;
181}
182
183SPA_API_POD_BODY int spa_pod_is_long(const struct spa_pod *pod)
185 return SPA_POD_CHECK(pod, SPA_TYPE_Long, sizeof(int64_t));
186}
187
188SPA_API_POD_BODY int spa_pod_body_get_long(const struct spa_pod *pod, const void *body, int64_t *value)
189{
190 if (!spa_pod_is_long(pod))
191 return -EINVAL;
192 /* TODO this is wrong per C standard, but if it breaks so does the Linux kernel. */
194 memcpy(value, body, sizeof *value);
196 return 0;
198
199SPA_API_POD_BODY int spa_pod_is_float(const struct spa_pod *pod)
200{
201 return SPA_POD_CHECK(pod, SPA_TYPE_Float, sizeof(float));
202}
203
204SPA_API_POD_BODY int spa_pod_body_get_float(const struct spa_pod *pod, const void *body, float *value)
205{
206 if (!spa_pod_is_float(pod))
207 return -EINVAL;
209 memcpy(value, body, sizeof *value);
211 return 0;
212}
214SPA_API_POD_BODY int spa_pod_is_double(const struct spa_pod *pod)
215{
216 return SPA_POD_CHECK(pod, SPA_TYPE_Double, sizeof(double));
217}
218
219SPA_API_POD_BODY int spa_pod_body_get_double(const struct spa_pod *pod, const void *body, double *value)
220{
221 if (!spa_pod_is_double(pod))
222 return -EINVAL;
224 memcpy(value, body, sizeof *value);
226 return 0;
227}
229SPA_API_POD_BODY int spa_pod_is_string(const struct spa_pod *pod)
230{
231 return SPA_POD_CHECK(pod, SPA_TYPE_String, 1);
232}
233
235 const void *body, const char **value)
236{
237 const char *s;
239 return -EINVAL;
240 s = (const char *)body;
241 if (((const volatile char *)s)[pod->size-1] != '\0')
242 return -EINVAL;
243 *value = s;
244 return 0;
245}
246
247SPA_API_POD_BODY int spa_pod_body_copy_string(const struct spa_pod *pod, const void *body,
248 char *dest, size_t maxlen)
249{
250 const char *s;
251 if (spa_pod_body_get_string(pod, body, &s) < 0 || maxlen < 1)
252 return -EINVAL;
253 /* pod->size includes the null terminator; a string that does not fit
254 * is reported as -ENOSPC instead of being silently truncated. */
255 if (pod->size > maxlen) {
256 dest[0] = '\0';
257 return -ENOSPC;
258 }
260 strncpy(dest, s, maxlen-1);
262 dest[maxlen-1]= '\0';
263 return 0;
264}
265
266SPA_API_POD_BODY int spa_pod_is_bytes(const struct spa_pod *pod)
267{
269}
270
271SPA_API_POD_BODY int spa_pod_body_get_bytes(const struct spa_pod *pod, const void *body,
272 const void **value, uint32_t *len)
273{
274 if (!spa_pod_is_bytes(pod))
275 return -EINVAL;
276 *value = (const void *)body;
277 *len = pod->size;
278 return 0;
279}
281SPA_API_POD_BODY int spa_pod_is_pointer(const struct spa_pod *pod)
282{
283 return SPA_POD_CHECK(pod, SPA_TYPE_Pointer, sizeof(struct spa_pod_pointer_body));
284}
285
286SPA_API_POD_BODY int spa_pod_body_get_pointer(const struct spa_pod *pod, const void *body,
287 uint32_t *type, const void **value)
288{
289 struct spa_pod_pointer_body b;
291 return -EINVAL;
292 SPA_POD_BODY_LOAD_FIELD_ONCE(&b, body, type);
294 *type = b.type;
295 *value = b.value;
296 return 0;
297}
298
299SPA_API_POD_BODY int spa_pod_is_fd(const struct spa_pod *pod)
300{
301 return SPA_POD_CHECK(pod, SPA_TYPE_Fd, sizeof(int64_t));
302}
303
304SPA_API_POD_BODY int spa_pod_body_get_fd(const struct spa_pod *pod, const void *body,
305 int64_t *value)
306{
307 if (!spa_pod_is_fd(pod))
308 return -EINVAL;
310 memcpy(value, body, sizeof *value);
312 return 0;
314
315SPA_API_POD_BODY int spa_pod_is_rectangle(const struct spa_pod *pod)
316{
317 return SPA_POD_CHECK(pod, SPA_TYPE_Rectangle, sizeof(struct spa_rectangle));
318}
319
320SPA_API_POD_BODY int spa_pod_body_get_rectangle(const struct spa_pod *pod, const void *body,
321 struct spa_rectangle *value)
322{
323 if (!spa_pod_is_rectangle(pod))
324 return -EINVAL;
326 SPA_POD_BODY_LOAD_FIELD_ONCE(value, body, height);
327 return 0;
328}
330SPA_API_POD_BODY int spa_pod_is_fraction(const struct spa_pod *pod)
331{
332 return SPA_POD_CHECK(pod, SPA_TYPE_Fraction, sizeof(struct spa_fraction));
333}
334SPA_API_POD_BODY int spa_pod_body_get_fraction(const struct spa_pod *pod, const void *body,
335 struct spa_fraction *value)
336{
337 if (!spa_pod_is_fraction(pod))
338 return -EINVAL;
341 return 0;
342}
344SPA_API_POD_BODY int spa_pod_is_bitmap(const struct spa_pod *pod)
345{
346 return SPA_POD_CHECK(pod, SPA_TYPE_Bitmap, sizeof(uint8_t));
347}
348SPA_API_POD_BODY int spa_pod_body_get_bitmap(const struct spa_pod *pod, const void *body,
349 const uint8_t **value)
350{
351 if (!spa_pod_is_bitmap(pod))
352 return -EINVAL;
353 *value = (const uint8_t *)body;
354 return 0;
355}
356
358{
359 return SPA_POD_CHECK(pod, SPA_TYPE_Array, sizeof(struct spa_pod_array_body));
360}
361SPA_API_POD_BODY int spa_pod_body_get_array(const struct spa_pod *pod, const void *body,
362 struct spa_pod_array *arr, const void **arr_body)
363{
364 if (!spa_pod_is_array(pod))
365 return -EINVAL;
366 arr->pod = *pod;
367 SPA_POD_BODY_LOAD_FIELD_ONCE(&arr->body.child, body, type);
368 SPA_POD_BODY_LOAD_FIELD_ONCE(&arr->body.child, body, size);
369 *arr_body = SPA_PTROFF(body, sizeof(struct spa_pod_array_body), void);
370 return 0;
371}
373 const void *body, uint32_t *n_values, uint32_t *val_size, uint32_t *val_type)
374{
375 uint32_t child_size = arr->body.child.size;
376 *n_values = child_size ? (arr->pod.size - sizeof(arr->body)) / child_size : 0;
377 *val_size = child_size;
378 *val_type = arr->body.child.type;
379 if (*val_size < spa_pod_type_size(*val_type))
380 *n_values = 0;
381 return body;
382}
383
384SPA_API_POD_BODY const void *spa_pod_body_get_array_values(const struct spa_pod *pod,
385 const void *body, uint32_t *n_values, uint32_t *val_size, uint32_t *val_type)
386{
387 struct spa_pod_array arr;
388 if (spa_pod_body_get_array(pod, body, &arr, &body) < 0)
389 return NULL;
390 return spa_pod_array_body_get_values(&arr, body, n_values, val_size, val_type);
391}
392
394{
395 return SPA_POD_CHECK(pod, SPA_TYPE_Choice, sizeof(struct spa_pod_choice_body));
396}
397SPA_API_POD_BODY int spa_pod_body_get_choice(const struct spa_pod *pod, const void *body,
398 struct spa_pod_choice *choice, const void **choice_body)
399{
401 return -EINVAL;
402 choice->pod = *pod;
403 SPA_POD_BODY_LOAD_FIELD_ONCE(&choice->body, body, type);
404 SPA_POD_BODY_LOAD_FIELD_ONCE(&choice->body, body, flags);
405 SPA_POD_BODY_LOAD_FIELD_ONCE(&choice->body, body, child.size);
406 SPA_POD_BODY_LOAD_FIELD_ONCE(&choice->body, body, child.type);
407 *choice_body = SPA_PTROFF(body, sizeof(struct spa_pod_choice_body), void);
408 return 0;
409}
411 const void *body, uint32_t *n_values, uint32_t *choice,
412 uint32_t *val_size, uint32_t *val_type)
413{
414 uint32_t child_size = pod->body.child.size, min, max;
415 *val_size = child_size;
416 *val_type = pod->body.child.type;
417 *n_values = child_size ? (pod->pod.size - sizeof(pod->body)) / child_size : 0;
418 *choice = pod->body.type;
419 spa_pod_choice_n_values(*choice, &min, &max);
420 if (*n_values < min || *val_size < spa_pod_type_size(*val_type))
421 *n_values = 0;
422 else if (*n_values > max)
423 *n_values = max;
424 return body;
425}
426
428{
430}
431
433{
434 return SPA_POD_CHECK(pod, SPA_TYPE_Object, sizeof(struct spa_pod_object_body));
435}
437 struct spa_pod_object *object, const void **object_body)
438{
440 return -EINVAL;
441 object->pod = *pod;
442 SPA_POD_BODY_LOAD_FIELD_ONCE(&object->body, body, type);
443 SPA_POD_BODY_LOAD_FIELD_ONCE(&object->body, body, id);
444 *object_body = SPA_PTROFF(body, sizeof(struct spa_pod_object_body), void);
445 return 0;
446}
447
449{
451}
452SPA_API_POD_BODY int spa_pod_body_get_sequence(const struct spa_pod *pod, const void *body,
453 struct spa_pod_sequence *seq, const void **seq_body)
454{
456 return -EINVAL;
457 seq->pod = *pod;
460 *seq_body = SPA_PTROFF(body, sizeof(struct spa_pod_sequence_body), void);
461 return 0;
462}
463
467
468#ifdef __cplusplus
469} /* extern "C" */
470#endif
471
472#endif /* SPA_POD_BODY_H */
#define SPA_API_POD_BODY
Definition body.h:29
uint32_t int seq
Definition core.h:432
SPA_API_POD_BODY int spa_pod_is_sequence(const struct spa_pod *pod)
Definition body.h:457
SPA_API_POD_BODY int spa_pod_is_pointer(const struct spa_pod *pod)
Definition body.h:290
SPA_API_POD_BODY int spa_pod_is_bitmap(const struct spa_pod *pod)
Definition body.h:353
#define SPA_POD_IS_VALID(pod)
Definition pod.h:48
SPA_API_POD_BODY int spa_pod_is_fraction(const struct spa_pod *pod)
Definition body.h:339
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:295
SPA_API_POD_BODY int spa_pod_is_double(const struct spa_pod *pod)
Definition body.h:223
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:393
SPA_API_POD_BODY int spa_pod_body_get_sequence(const struct spa_pod *pod, const void *body, struct spa_pod_sequence *seq, const void **seq_body)
Definition body.h:461
SPA_API_POD_BODY int spa_pod_body_get_string(const struct spa_pod *pod, const void *body, const char **value)
Definition body.h:243
SPA_API_POD_BODY int spa_pod_is_array(const struct spa_pod *pod)
Definition body.h:366
SPA_API_POD_BODY int spa_pod_is_rectangle(const struct spa_pod *pod)
Definition body.h:324
SPA_API_POD_BODY int spa_pod_is_struct(const struct spa_pod *pod)
Definition body.h:436
SPA_API_POD_BODY int spa_pod_is_int(const struct spa_pod *pod)
Definition body.h:179
SPA_API_POD_BODY int spa_pod_is_fd(const struct spa_pod *pod)
Definition body.h:308
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:343
SPA_API_POD_BODY int spa_pod_is_none(const struct spa_pod *pod)
Definition body.h:143
SPA_API_POD_BODY int spa_pod_choice_n_values(uint32_t choice_type, uint32_t *min, uint32_t *max)
Definition body.h:88
SPA_API_POD_BODY int spa_pod_is_object(const struct spa_pod *pod)
Definition body.h:441
SPA_API_POD_BODY const void * spa_pod_array_body_get_values(const struct spa_pod_array *arr, const void *body, uint32_t *n_values, uint32_t *val_size, uint32_t *val_type)
Definition body.h:381
SPA_API_POD_BODY int spa_pod_is_bool(const struct spa_pod *pod)
Definition body.h:148
#define SPA_POD_CHECK_TYPE(pod, _type)
Definition pod.h:50
SPA_API_POD_BODY int spa_pod_is_id(const struct spa_pod *pod)
Definition body.h:166
SPA_API_POD_BODY uint32_t spa_pod_type_size(uint32_t type)
Definition body.h:45
#define SPA_POD_BODY_LOAD_FIELD_ONCE(a, b, field)
Definition body.h:156
SPA_API_POD_BODY int spa_pod_body_get_array(const struct spa_pod *pod, const void *body, struct spa_pod_array *arr, const void **arr_body)
Definition body.h:370
SPA_API_POD_BODY int spa_pod_body_get_double(const struct spa_pod *pod, const void *body, double *value)
Definition body.h:228
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:256
SPA_API_POD_BODY int spa_pod_body_get_long(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:197
SPA_API_POD_BODY int spa_pod_body_get_object(const struct spa_pod *pod, const void *body, struct spa_pod_object *object, const void **object_body)
Definition body.h:445
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:419
SPA_API_POD_BODY int spa_pod_is_bytes(const struct spa_pod *pod)
Definition body.h:275
SPA_API_POD_BODY int spa_pod_body_get_int(const struct spa_pod *pod, const void *body, int32_t *value)
Definition body.h:184
SPA_API_POD_BODY int spa_pod_is_string(const struct spa_pod *pod)
Definition body.h:238
#define SPA_POD_BODY_LOAD_ONCE(a, b)
Definition body.h:154
SPA_API_POD_BODY int spa_pod_body_get_float(const struct spa_pod *pod, const void *body, float *value)
Definition body.h:213
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:329
SPA_API_POD_BODY int spa_pod_body_get_bool(const struct spa_pod *pod, const void *body, bool *value)
Definition body.h:158
SPA_API_POD_BODY int spa_pod_body_get_bitmap(const struct spa_pod *pod, const void *body, const uint8_t **value)
Definition body.h:357
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:118
SPA_API_POD_BODY int spa_pod_body_get_choice(const struct spa_pod *pod, const void *body, struct spa_pod_choice *choice, const void **choice_body)
Definition body.h:406
SPA_API_POD_BODY int spa_pod_body_get_fd(const struct spa_pod *pod, const void *body, int64_t *value)
Definition body.h:313
SPA_API_POD_BODY int spa_pod_is_choice(const struct spa_pod *pod)
Definition body.h:402
SPA_API_POD_BODY int spa_pod_body_get_id(const struct spa_pod *pod, const void *body, uint32_t *value)
Definition body.h:171
SPA_API_POD_BODY int spa_pod_is_float(const struct spa_pod *pod)
Definition body.h:208
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:280
#define SPA_POD_CHECK(pod, _type, _size)
Definition pod.h:53
SPA_API_POD_BODY int spa_pod_is_long(const struct spa_pod *pod)
Definition body.h:192
@ SPA_CHOICE_Step
range with step: default, min, max, step
Definition pod.h:163
@ SPA_CHOICE_None
no choice, first value is current
Definition pod.h:161
@ SPA_CHOICE_Flags
flags: first value is flags
Definition pod.h:165
@ SPA_CHOICE_Range
range: default, min, max
Definition pod.h:162
@ SPA_CHOICE_Enum
list: default, alternative,...
Definition pod.h:164
@ SPA_TYPE_Int
Definition type.h:45
@ SPA_TYPE_Rectangle
Definition type.h:51
@ SPA_TYPE_Long
Definition type.h:46
@ SPA_TYPE_Bool
Definition type.h:43
@ SPA_TYPE_Bytes
Definition type.h:50
@ SPA_TYPE_Pod
Definition type.h:61
@ SPA_TYPE_Bitmap
Definition type.h:53
@ SPA_TYPE_Object
Definition type.h:56
@ SPA_TYPE_Float
Definition type.h:47
@ SPA_TYPE_Fraction
Definition type.h:52
@ SPA_TYPE_None
Definition type.h:42
@ SPA_TYPE_Sequence
Definition type.h:57
@ SPA_TYPE_Double
Definition type.h:48
@ SPA_TYPE_Id
Definition type.h:44
@ SPA_TYPE_Choice
Definition type.h:60
@ SPA_TYPE_Pointer
Definition type.h:58
@ SPA_TYPE_Array
Definition type.h:54
@ SPA_TYPE_String
Definition type.h:49
@ SPA_TYPE_Fd
Definition type.h:59
@ SPA_TYPE_Struct
Definition type.h:55
#define SPA_BARRIER
Definition defs.h:316
#define SPA_PTROFF(ptr_, offset_, type_)
Return the address (buffer + offset) as pointer of type.
Definition defs.h:223
spa/pod/pod.h
Definition defs.h:138
Definition pod.h:135
struct spa_pod child
Definition pod.h:136
Definition pod.h:140
struct spa_pod pod
Definition pod.h:141
struct spa_pod_array_body body
Definition pod.h:142
Definition pod.h:168
Definition pod.h:176
struct spa_pod_choice_body body
Definition pod.h:178
struct spa_pod pod
Definition pod.h:177
Definition body.h:38
struct spa_pod pod
Definition body.h:39
uint32_t offset
Definition body.h:41
struct spa_pod_frame * parent
Definition body.h:40
uint32_t flags
Definition body.h:42
Definition pod.h:196
Definition pod.h:202
Definition pod.h:207
const void * value
Definition pod.h:210
Definition pod.h:264
a sequence of timed controls
Definition pod.h:271
Definition pod.h:57
uint32_t type
Definition pod.h:59
uint32_t size
Definition pod.h:58
Definition defs.h:117