From 699bed4a1faa9efd7c6a26f43ccbefd27801b409 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Fri, 31 Aug 2018 09:17:21 +0200 Subject: [PATCH] channelmix: improve control parsing --- spa/include/spa/pod/iter.h | 17 ++++++----------- spa/include/spa/pod/pod.h | 3 +++ spa/plugins/audioconvert/channelmix.c | 24 ++++++++++++++++++------ spa/tests/test-props.c | 9 +++++++++ 4 files changed, 36 insertions(+), 17 deletions(-) diff --git a/spa/include/spa/pod/iter.h b/spa/include/spa/pod/iter.h index 23548e014..97e19d0a6 100644 --- a/spa/include/spa/pod/iter.h +++ b/spa/include/spa/pod/iter.h @@ -59,19 +59,14 @@ static inline void spa_pod_iter_advance(struct spa_pod_iter *iter, struct spa_po iter->offset += SPA_ROUND_UP_N(SPA_POD_SIZE(current), 8); } -static inline bool spa_pod_is_inside(const void *pod, uint32_t size, const struct spa_pod *iter) +static inline bool spa_pod_is_inside(const void *pod, uint32_t size, const void *iter) { - return iter < SPA_MEMBER(pod, size, struct spa_pod); + return iter < SPA_MEMBER(pod, size, void); } -static inline bool spa_pod_control_is_inside(const void *pod, uint32_t size, const struct spa_pod_control *iter) +static inline void *spa_pod_next(const void *iter) { - return iter < SPA_MEMBER(pod, size, struct spa_pod_control); -} - -static inline struct spa_pod *spa_pod_next(const struct spa_pod *iter) -{ - return SPA_MEMBER(iter, SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), struct spa_pod); + return SPA_MEMBER(iter, SPA_ROUND_UP_N (SPA_POD_SIZE (iter), 8), void); } static inline struct spa_pod_control *spa_pod_control_next(const struct spa_pod_control *iter) @@ -90,7 +85,7 @@ static inline struct spa_pod_control *spa_pod_control_next(const struct spa_pod_ (iter) = 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) + SPA_POD_FOREACH(SPA_MEMBER((pod), (offset), void),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); \ @@ -102,7 +97,7 @@ static inline struct spa_pod_control *spa_pod_control_next(const struct spa_pod_ #define SPA_POD_SEQUENCE_BODY_FOREACH(body, size, iter) \ for ((iter) = SPA_MEMBER((body), sizeof(struct spa_pod_sequence_body), struct spa_pod_control); \ - spa_pod_control_is_inside(body, size, iter); \ + spa_pod_is_inside(body, size, iter); \ (iter) = spa_pod_control_next(iter)) #define SPA_POD_SEQUENCE_FOREACH(seq, iter) \ diff --git a/spa/include/spa/pod/pod.h b/spa/include/spa/pod/pod.h index 7f0ccfeb5..92853a8f2 100644 --- a/spa/include/spa/pod/pod.h +++ b/spa/include/spa/pod/pod.h @@ -109,6 +109,9 @@ struct spa_pod_bitmap { /* array of uint8_t follows with the bitmap */ }; +#define SPA_POD_ARRAY_TYPE(arr) ((arr)->body.child.type) +#define SPA_POD_ARRAY_N_VALUES(arr) (((arr)->pod.size - sizeof(struct spa_pod_array_body)) / (arr)->body.child.size) + struct spa_pod_array_body { struct spa_pod child; /* array with elements of child.size follows */ diff --git a/spa/plugins/audioconvert/channelmix.c b/spa/plugins/audioconvert/channelmix.c index c83009892..ab3a40de3 100644 --- a/spa/plugins/audioconvert/channelmix.c +++ b/spa/plugins/audioconvert/channelmix.c @@ -707,15 +707,27 @@ static int process_control(struct impl *this, struct port *port, struct spa_pod_ { struct props *p = &this->props; float volume = p->volume; + struct spa_pod *pod; + struct spa_pod_object *obj = (struct spa_pod_object *) &c->value; - spa_pod_object_parse(&c->value, - ":", SPA_PROP_volume, "?f", &volume, - NULL); + SPA_POD_OBJECT_FOREACH(obj, pod) { + struct spa_pod_prop *prop = (struct spa_pod_prop *)pod; - if (volume != p->volume) { - p->volume = volume; - setup_matrix(this, &GET_IN_PORT(this, 0)->format, &GET_OUT_PORT(this, 0)->format); + switch (prop->body.key) { + case SPA_PROP_volume: + volume = SPA_POD_VALUE(struct spa_pod_float, &prop->body.value); + if (volume != p->volume) { + p->volume = volume; + setup_matrix(this, + &GET_IN_PORT(this, 0)->format, + &GET_OUT_PORT(this, 0)->format); + } + break; + default: + break; + } } + break; } default: diff --git a/spa/tests/test-props.c b/spa/tests/test-props.c index c87b061b9..ae8160220 100644 --- a/spa/tests/test-props.c +++ b/spa/tests/test-props.c @@ -326,6 +326,15 @@ int main(int argc, char *argv[]) * "framerate": ( "Fru", (25, 1), ( (0,1), (MAX, 1)) ) * } * ) + * + * { "Type" : "Format", "Id" : 0, + * "mediaType": "video", + * "mediaSubtype": "raw", + * "videoFormat": [ "enum", "I420", "YUY2" ], + * "videoSize": [ "range", [320,242], [1,1], [MAX,MAX] ], + * "videoFramerate": [ "range", [25,1], [0,1], [MAX,1] ] + * } + * */ fmt = spa_pod_builder_add(&b, "{", SPA_TYPE_OBJECT_Format, 0,