mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-02 09:01:50 -05:00
Implement param filtering
Make a new pod filter function and use it in the plugins to filter in enum_params. Small tweaks to the pod_builder
This commit is contained in:
parent
cc47fb7e3a
commit
58451d626c
35 changed files with 1150 additions and 917 deletions
|
|
@ -36,9 +36,10 @@ struct spa_pod_builder {
|
|||
void *data;
|
||||
uint32_t size;
|
||||
uint32_t offset;
|
||||
uint32_t (*write) (struct spa_pod_builder *builder, uint32_t ref, const void *data,
|
||||
uint32_t size);
|
||||
|
||||
uint32_t (*write) (struct spa_pod_builder *builder, const void *data, uint32_t size);
|
||||
void * (*deref) (struct spa_pod_builder *builder, uint32_t ref);
|
||||
void (*reset) (struct spa_pod_builder *builder, uint32_t offset);
|
||||
bool in_array;
|
||||
bool first;
|
||||
int depth;
|
||||
|
|
@ -47,15 +48,21 @@ struct spa_pod_builder {
|
|||
|
||||
#define SPA_POD_BUILDER_INIT(buffer,size) { buffer, size, }
|
||||
|
||||
static inline void spa_pod_builder_init(struct spa_pod_builder *builder, void *data, uint32_t size)
|
||||
static inline void
|
||||
spa_pod_builder_reset(struct spa_pod_builder *builder, uint32_t offset)
|
||||
{
|
||||
builder->data = data;
|
||||
builder->size = size;
|
||||
builder->offset = 0;
|
||||
if (builder->reset)
|
||||
builder->reset(builder, offset);
|
||||
builder->offset = offset;
|
||||
builder->depth = 0;
|
||||
builder->in_array = builder->first = false;
|
||||
}
|
||||
|
||||
static inline void spa_pod_builder_init(struct spa_pod_builder *builder, void *data, uint32_t size)
|
||||
{
|
||||
*builder = (struct spa_pod_builder) SPA_POD_BUILDER_INIT(data, size);
|
||||
}
|
||||
|
||||
static inline void *
|
||||
spa_pod_builder_deref(struct spa_pod_builder *builder, uint32_t ref)
|
||||
{
|
||||
|
|
@ -85,7 +92,7 @@ spa_pod_builder_raw(struct spa_pod_builder *builder, const void *data, uint32_t
|
|||
int i;
|
||||
|
||||
if (builder->write) {
|
||||
ref = builder->write(builder, -1, data, size);
|
||||
ref = builder->write(builder, data, size);
|
||||
} else {
|
||||
ref = builder->offset;
|
||||
if (ref + size > builder->size)
|
||||
|
|
@ -123,10 +130,8 @@ static inline uint32_t spa_pod_builder_pop(struct spa_pod_builder *builder)
|
|||
struct spa_pod_frame *frame = &builder->frame[--builder->depth], *top;
|
||||
|
||||
if (frame->ref != -1) {
|
||||
if (builder->write)
|
||||
builder->write(builder, frame->ref, &frame->pod, sizeof(struct spa_pod));
|
||||
else
|
||||
memcpy(builder->data + frame->ref, &frame->pod, sizeof(struct spa_pod));
|
||||
struct spa_pod *pod = spa_pod_builder_deref(builder, frame->ref);
|
||||
*pod = frame->pod;
|
||||
}
|
||||
top = builder->depth > 0 ? &builder->frame[builder->depth-1] : NULL;
|
||||
builder->in_array = (top && (top->pod.type == SPA_POD_TYPE_ARRAY ||
|
||||
|
|
|
|||
|
|
@ -46,7 +46,8 @@ static inline bool spa_pod_is_object_type(struct spa_pod *pod, uint32_t type)
|
|||
return (pod->type == SPA_POD_TYPE_OBJECT
|
||||
&& ((struct spa_pod_object *) pod)->body.type == type);
|
||||
}
|
||||
static inline bool spa_pod_has_next(const void *pod, uint32_t size, const struct spa_pod *iter)
|
||||
|
||||
static inline bool spa_pod_is_iter(const void *pod, uint32_t size, const struct spa_pod *iter)
|
||||
{
|
||||
return iter < SPA_MEMBER(pod, size, struct spa_pod);
|
||||
}
|
||||
|
|
@ -63,18 +64,25 @@ static inline struct spa_pod *spa_pod_next(const struct spa_pod *iter)
|
|||
|
||||
#define SPA_POD_FOREACH(pod, size, iter) \
|
||||
for ((iter) = (pod); \
|
||||
spa_pod_has_next(pod, size, iter); \
|
||||
spa_pod_is_iter(pod, size, iter); \
|
||||
(iter) = spa_pod_next(iter))
|
||||
|
||||
#define SPA_POD_FOREACH_SAFE(pod, size, iter, tmp) \
|
||||
for ((iter) = (pod), (tmp) = spa_pod_next(iter); \
|
||||
spa_pod_is_iter(pod, size, iter); \
|
||||
(iter) = (tmp), \
|
||||
(tmp) = spa_pod_next(iter))
|
||||
|
||||
|
||||
#define SPA_POD_CONTENTS_FOREACH(pod, offset, iter) \
|
||||
SPA_POD_FOREACH(SPA_MEMBER((pod), (offset), struct spa_pod),SPA_POD_SIZE (pod)-(offset),iter)
|
||||
|
||||
#define SPA_POD_OBJECT_BODY_FOREACH(body, size, iter) \
|
||||
for ((iter) = SPA_MEMBER((body), sizeof(struct spa_pod_object_body), struct spa_pod); \
|
||||
spa_pod_has_next(body, size, iter); \
|
||||
spa_pod_is_iter(body, size, iter); \
|
||||
(iter) = spa_pod_next(iter))
|
||||
|
||||
#define SPA_POD_OBJECT_FOREACH(obj, iter) \
|
||||
#define SPA_POD_OBJECT_FOREACH(obj, iter) \
|
||||
SPA_POD_OBJECT_BODY_FOREACH(&obj->body, SPA_POD_BODY_SIZE(obj), iter)
|
||||
|
||||
#define SPA_POD_PROP_ALTERNATIVE_FOREACH(body, _size, iter) \
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue