filter-chain: use property hints

Use property hints to expose int or bool controls.
This commit is contained in:
Wim Taymans 2022-03-03 21:23:25 +01:00
parent 2125ec048d
commit 2653e9f129
2 changed files with 51 additions and 10 deletions

View file

@ -408,14 +408,36 @@ static struct spa_pod *get_prop_info(struct graph *graph, struct spa_pod_builder
SPA_PROP_INFO_name, SPA_POD_String(name), SPA_PROP_INFO_name, SPA_POD_String(name),
0); 0);
spa_pod_builder_prop(b, SPA_PROP_INFO_type, 0); spa_pod_builder_prop(b, SPA_PROP_INFO_type, 0);
if (min == max) { if (p->hint & FC_HINT_BOOLEAN) {
spa_pod_builder_float(b, def); if (min == max) {
spa_pod_builder_bool(b, def <= 0.0 ? false : true);
} else {
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Enum, 0);
spa_pod_builder_bool(b, def <= 0.0 ? false : true);
spa_pod_builder_bool(b, false);
spa_pod_builder_bool(b, true);
spa_pod_builder_pop(b, &f[1]);
}
} else if (p->hint & FC_HINT_INTEGER) {
if (min == max) {
spa_pod_builder_int(b, def);
} else {
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0);
spa_pod_builder_int(b, def);
spa_pod_builder_int(b, min);
spa_pod_builder_int(b, max);
spa_pod_builder_pop(b, &f[1]);
}
} else { } else {
spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0); if (min == max) {
spa_pod_builder_float(b, def); spa_pod_builder_float(b, def);
spa_pod_builder_float(b, min); } else {
spa_pod_builder_float(b, max); spa_pod_builder_push_choice(b, &f[1], SPA_CHOICE_Range, 0);
spa_pod_builder_pop(b, &f[1]); spa_pod_builder_float(b, def);
spa_pod_builder_float(b, min);
spa_pod_builder_float(b, max);
spa_pod_builder_pop(b, &f[1]);
}
} }
spa_pod_builder_prop(b, SPA_PROP_INFO_params, 0); spa_pod_builder_prop(b, SPA_PROP_INFO_params, 0);
spa_pod_builder_bool(b, true); spa_pod_builder_bool(b, true);
@ -446,7 +468,13 @@ static struct spa_pod *get_props_param(struct graph *graph, struct spa_pod_build
snprintf(name, sizeof(name), "%s", p->name); snprintf(name, sizeof(name), "%s", p->name);
spa_pod_builder_string(b, name); spa_pod_builder_string(b, name);
spa_pod_builder_float(b, port->control_data); if (p->hint & FC_HINT_BOOLEAN) {
spa_pod_builder_bool(b, port->control_data <= 0.0 ? false : true);
} else if (p->hint & FC_HINT_INTEGER) {
spa_pod_builder_int(b, port->control_data);
} else {
spa_pod_builder_float(b, port->control_data);
}
} }
spa_pod_builder_pop(b, &f[1]); spa_pod_builder_pop(b, &f[1]);
return spa_pod_builder_pop(b, &f[0]); return spa_pod_builder_pop(b, &f[0]);
@ -487,12 +515,23 @@ static int parse_params(struct graph *graph, const struct spa_pod *pod)
while (true) { while (true) {
const char *name; const char *name;
float value, *val = NULL; float value, *val = NULL;
bool bool_val;
int32_t int_val;
if (spa_pod_parser_get_string(&prs, &name) < 0) if (spa_pod_parser_get_string(&prs, &name) < 0)
break; break;
if (spa_pod_parser_get_float(&prs, &value) >= 0) if (spa_pod_parser_get_float(&prs, &value) >= 0) {
val = &value; val = &value;
} else if (spa_pod_parser_get_int(&prs, &int_val) >= 0) {
value = int_val;
val = &value;
} else if (spa_pod_parser_get_bool(&prs, &bool_val) >= 0) {
value = bool_val ? 1.0f : 0.0f;
val = &value;
} else {
struct spa_pod *pod;
spa_pod_parser_get_pod(&prs, &pod);
}
changed += set_control_value(def_node, name, val); changed += set_control_value(def_node, name, val);
} }
return changed; return changed;

View file

@ -47,7 +47,9 @@ struct fc_port {
#define FC_PORT_AUDIO (1ULL << 3) #define FC_PORT_AUDIO (1ULL << 3)
uint64_t flags; uint64_t flags;
#define FC_HINT_BOOLEAN (1ULL << 2)
#define FC_HINT_SAMPLE_RATE (1ULL << 3) #define FC_HINT_SAMPLE_RATE (1ULL << 3)
#define FC_HINT_INTEGER (1ULL << 5)
uint64_t hint; uint64_t hint;
float def; float def;
float min; float min;