diff --git a/spa/include/spa/props.h b/spa/include/spa/props.h index a6421a617..4aec84102 100644 --- a/spa/include/spa/props.h +++ b/spa/include/spa/props.h @@ -139,6 +139,14 @@ typedef struct { const char **tags; } SpaPropInfo; +/** + * SpaPropValue: + * @type: a property type + * @size: the property size + * @value: the property value. + * + * The structure to set and get properties. + */ typedef struct { SpaPropType type; size_t size; @@ -150,7 +158,10 @@ typedef struct { * @n_prop_info: number of elements in @prop_info * @prop_info: array of #SpaPropInfo. Contains info about the * properties. Can be %NULL when unspecified. - * @unset_mask: mask of unset properties + * @unset_mask: mask of unset properties. For each property in @prop_info there + * is a corresponding bit that specifies if the property is currently + * unset. When more that 32 properties are present, more uint32_t + * fields follow this one. * * Generic propertiers. */ @@ -160,6 +171,10 @@ struct _SpaProps { uint32_t unset_mask; }; +#define SPA_PROPS_INDEX_IS_UNSET(p,idx) ((&(p)->unset_mask)[(idx) >> 5] & (1U << ((idx) & 31))) +#define SPA_PROPS_INDEX_UNSET(p,idx) ((&(p)->unset_mask)[(idx) >> 5] |= (1U << ((idx) & 31))) +#define SPA_PROPS_INDEX_SET(p,idx) ((&(p)->unset_mask)[(idx) >> 5] &= ~(1U << ((idx) & 31))) + static inline unsigned int spa_props_index_for_id (const SpaProps *props, uint32_t id) { diff --git a/spa/lib/props.c b/spa/lib/props.c index 9dc331097..2853d4c3d 100644 --- a/spa/lib/props.c +++ b/spa/lib/props.c @@ -46,7 +46,7 @@ spa_props_set_prop (SpaProps *props, memcpy (SPA_MEMBER (props, info->offset, void), value->value, value->size); - props->unset_mask &= ~(1u << index); + SPA_PROPS_INDEX_SET (props, index); return SPA_RESULT_OK; } @@ -68,7 +68,7 @@ spa_props_get_prop (const SpaProps *props, if ((info->flags & SPA_PROP_FLAG_READABLE) == 0) return SPA_RESULT_INVALID_PROPERTY_ACCESS; - if (props->unset_mask & (1u << index)) + if (SPA_PROPS_INDEX_IS_UNSET (props, index)) return SPA_RESULT_PROPERTY_UNSET; value->type = info->type; @@ -103,7 +103,7 @@ spa_props_copy (const SpaProps *src, memcpy (SPA_MEMBER (dest, info->offset, void), value.value, value.size); - dest->unset_mask &= ~(1u << i); + SPA_PROPS_INDEX_SET (dest, i); } return SPA_RESULT_OK; }