mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
Improve negotiation
Fix selection of the default property value by restricting it to something in the valid range of the property. Fix audio/videotestsrc reuse Fix format enum with filters. Fix module property configuration Fix connection refill
This commit is contained in:
parent
282995d0d0
commit
710a1a41e6
13 changed files with 131 additions and 81 deletions
|
|
@ -318,8 +318,8 @@ struct pod_type_name {
|
|||
} pod_type_names[] = {
|
||||
{ "invalid", "*Invalid*" },
|
||||
{ "bool", "Bool" },
|
||||
{ "int", "Int" },
|
||||
{ "uri", "URI" },
|
||||
{ "int", "Int" },
|
||||
{ "long", "Long" },
|
||||
{ "float", "Float" },
|
||||
{ "double", "Double" },
|
||||
|
|
@ -341,12 +341,12 @@ print_pod_value (uint32_t size, uint32_t type, void *body, int prefix)
|
|||
case SPA_POD_TYPE_BOOL:
|
||||
printf ("%-*sBool %d\n", prefix, "", *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_INT:
|
||||
printf ("%-*sInt %d\n", prefix, "", *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_URI:
|
||||
printf ("%-*sURI %d\n", prefix, "", *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_INT:
|
||||
printf ("%-*sInt %d\n", prefix, "", *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_LONG:
|
||||
printf ("%-*sLong %"PRIi64"\n", prefix, "", *(int64_t *) body);
|
||||
break;
|
||||
|
|
@ -441,10 +441,10 @@ print_format_value (uint32_t size, uint32_t type, void *body)
|
|||
case SPA_POD_TYPE_BOOL:
|
||||
fprintf (stderr, "%s", *(int32_t *) body ? "true" : "false");
|
||||
break;
|
||||
case SPA_POD_TYPE_INT:
|
||||
case SPA_POD_TYPE_URI:
|
||||
fprintf (stderr, "%"PRIi32, *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_URI:
|
||||
case SPA_POD_TYPE_INT:
|
||||
fprintf (stderr, "%"PRIi32, *(int32_t *) body);
|
||||
break;
|
||||
case SPA_POD_TYPE_LONG:
|
||||
|
|
|
|||
|
|
@ -156,6 +156,52 @@ compare_value (SpaPODType type, const void *r1, const void *r2)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
fix_default (SpaPODProp *prop)
|
||||
{
|
||||
void *val = SPA_MEMBER (prop, sizeof (SpaPODProp), void),
|
||||
*alt = SPA_MEMBER (val, prop->body.value.size, void);
|
||||
int i, nalt = SPA_POD_PROP_N_VALUES (prop) - 1;
|
||||
|
||||
switch (prop->body.flags & SPA_POD_PROP_RANGE_MASK) {
|
||||
case SPA_POD_PROP_RANGE_NONE:
|
||||
break;
|
||||
case SPA_POD_PROP_RANGE_MIN_MAX:
|
||||
case SPA_POD_PROP_RANGE_STEP:
|
||||
if (compare_value (prop->body.value.type, val, alt) < 0)
|
||||
memcpy (val, alt, prop->body.value.size);
|
||||
alt = SPA_MEMBER (alt, prop->body.value.size, void);
|
||||
if (compare_value (prop->body.value.type, val, alt) > 0)
|
||||
memcpy (val, alt, prop->body.value.size);
|
||||
break;
|
||||
case SPA_POD_PROP_RANGE_ENUM:
|
||||
{
|
||||
void *best = NULL;
|
||||
|
||||
for (i = 0; i < nalt; i++) {
|
||||
if (compare_value (prop->body.value.type, val, alt) == 0) {
|
||||
best = alt;
|
||||
break;
|
||||
}
|
||||
if (best == NULL)
|
||||
best = alt;
|
||||
alt = SPA_MEMBER (alt, prop->body.value.size, void);
|
||||
}
|
||||
if (best)
|
||||
memcpy (val, best, prop->body.value.size);
|
||||
|
||||
if (nalt == 1) {
|
||||
prop->body.flags &= ~SPA_POD_PROP_FLAG_UNSET;
|
||||
prop->body.flags &= ~SPA_POD_PROP_RANGE_MASK;
|
||||
prop->body.flags |= SPA_POD_PROP_RANGE_NONE;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case SPA_POD_PROP_RANGE_FLAGS:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline SpaPODProp *
|
||||
find_prop (const SpaPOD *pod, uint32_t size, uint32_t key)
|
||||
{
|
||||
|
|
@ -244,10 +290,7 @@ spa_props_filter (SpaPODBuilder *b,
|
|||
}
|
||||
if (n_copied == 0)
|
||||
return SPA_RESULT_NO_FORMAT;
|
||||
if (n_copied == 1)
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_NONE;
|
||||
else
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
}
|
||||
|
||||
if ((rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_MIN_MAX) ||
|
||||
|
|
@ -264,10 +307,7 @@ spa_props_filter (SpaPODBuilder *b,
|
|||
}
|
||||
if (n_copied == 0)
|
||||
return SPA_RESULT_NO_FORMAT;
|
||||
if (n_copied == 1)
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_NONE;
|
||||
else
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
}
|
||||
|
||||
if ((rt1 == SPA_POD_PROP_RANGE_NONE && rt2 == SPA_POD_PROP_RANGE_STEP) ||
|
||||
|
|
@ -289,10 +329,7 @@ spa_props_filter (SpaPODBuilder *b,
|
|||
}
|
||||
if (n_copied == 0)
|
||||
return SPA_RESULT_NO_FORMAT;
|
||||
if (n_copied == 1)
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_NONE;
|
||||
else
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
np->body.flags |= SPA_POD_PROP_RANGE_ENUM | SPA_POD_PROP_FLAG_UNSET;
|
||||
}
|
||||
|
||||
if (rt1 == SPA_POD_PROP_RANGE_MIN_MAX && rt2 == SPA_POD_PROP_RANGE_MIN_MAX) {
|
||||
|
|
@ -348,6 +385,7 @@ spa_props_filter (SpaPODBuilder *b,
|
|||
return SPA_RESULT_NOT_IMPLEMENTED;
|
||||
|
||||
spa_pod_builder_pop (b, &f);
|
||||
fix_default (np);
|
||||
}
|
||||
return SPA_RESULT_OK;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue